deeplearning.ai第四部分

Week 1

1. 计算机视觉

机器学习可以用于各种识别、检测,这标志着新型应用的形成。

几种问题,图片识别、目标检测、风格迁移。在图片识别任务中,很可能输入的数据非常大。比如1000*1000像素的照片,这样使得特征向量的维度达到了三百万。

所以人们开发出了卷积。

image-20200814161810028
image-20200814161810028

2. 边缘检测示例

在之前视频中,我们提到神经网络检测特征。前面的层很多就是检测边缘了。

我们要构造过滤器,3*3矩阵,也叫做核。用这个对整个图形进行卷积操作。

我感觉图或声音都有很多模糊的信息,所以可以卷积,但是图似乎并不适合?

卷积之后的结果我们可以当作输出。

假如有一个这样的边缘,就是左右两侧颜色差别比较大。然后通过我们的过滤器,我们得到了右边的矩阵。这里我们看到了结果,中间高光,说明把边缘提取出来了。

image-20200814163309965
image-20200814163309965

3. 更多类型的边缘检测

之前讨论过很多的滤波器,比如Sobel filter,还有Scharr滤波器等等。深度学习得发展,告诉我们可以不用非得设置固定的参数,可以通过学习更新权重。

其实这也是一种非全连接的神经网络,考虑到了之间的位置。

image-20200814164131487
image-20200814164131487

4. Padding

一个基本的卷积操作Padding。我们之前用3*3滤波器去卷积6*6的图像。那么我们的输出是4*4的图像。这样我们得到大小是$(n-f+1)*(n-f+1)$。

这样的卷积改变了图像大小,图像会越来越凶啊,我们就要用Padding填充,来保证图像的大小。这时大小变成了$(n+2p-f+1)*(n+2p-f+1)$.

Valid卷积意味着不填充,最开始讨论的那样。另一种选择叫做Same卷积,保证输出和输入是同样大的。

image-20200814175719502
image-20200814175719502

我们可以计算得到保证卷积后大小一致的条件。很少看到偶数的过滤器,因为大小不能保证一样,并且没有中心点,不便于指出。

5. 卷积步长

这时下一层的大小是:

image-20200814181021966
image-20200814181021966

数学教科书中的卷积首先是中心对称一下,我们的操作被称为互相关而不是卷积。按照机器学习的惯例,我们还是叫它卷积。数学上的卷积有结合律,这对于信号处理很重要,但是深度学习中不重要,所以无所谓了。

6. 卷积为何有效

在RGB图上的卷积。为了检测图像,卷积过滤器也必须是3层的。

image-20200814183200588
image-20200814183200588

我们用很多个过滤器,生成很多层。

7. 单层卷积网络

通过多个过滤器卷积操作,加上bias,然后用上非线性激活函数,得到一个矩阵。最终得到一个$442$的输出。

标记
  • $f^{[l]}=filter\;size$
  • $p^{[l]}=padding$
  • $s^{[l]}=stride$

  • 输入$n_H^{\left[ l-1 \right]}\times n_W^{\left[ l-1 \right]}\times n_c^{\left[ l-1 \right]}$

  • 输出$n_H^{\left[ l \right]}\times n_W^{\left[ l \right]}\times n_c^{\left[ l \right]}$
  • $n_H^{\left[ l \right]}=\lfloor \frac{n_W^{\left[ l-1 \right]}+2p^{\left[ l \right]}-f^{\left[ l \right]}}{s^{\left[ l \right]}}+1 \rfloor $

8. 简单卷积网络示例

image-20200814190833456
image-20200814190833456

主要用3种层:

  • Convolution(Conv)
  • Pooling(Pool)
  • Fully connected(FC)

9. 池化层

没有参数,然后大小计算公式也可以用卷积的那个。池化如果多层,那它是逐层计算。

最大pooling用得比较多,平均pooling用得很少。

超级参数包括过滤器大小和步长。

image-20200814192239338
image-20200814192239338
image-20200814195003073
image-20200814195003073

10. 为什么使用卷积

优势:参数共享、稀疏连接。

image-20200814200024619
image-20200814200024619

Week 2

1. 为什么使用实例

image-20200814234346741
image-20200814234346741

2. 经典网络

LeNet-5
image-20200815104203596
image-20200815104203596

针对灰度图像训练的。每个过滤器用了上层所有信道。

AlexNet
image-20200815104210162
image-20200815104210162

卷积、池化,包含6000W个参数。它使用了ReLU。还有LRN层,局部响应归一化。后来发现没什么作用。

VGG-16
image-20200815104215830
image-20200815104215830

它只用简单的过滤器和池化层,重复做几次,包含16个卷积层和全连接层,一共1.38亿个参数。

VGG-19,一个更大的网络,但是表现和VGG-16大小差不多。

3. 残差网络

ResNets是由残差块构成,可以帮助构造很深的网络。

在残差网络中有变化,将$a^{[l]}$的信息提前传到后面。

捷径、跳远连接。

image-20200815105016713
image-20200815105016713

残差网络就是每两层添加一个跳远连接。普通的网络错误率降低后会再次升高,但是ResNet却让它一直降低。

这种方式有助于解决梯度消失和梯度爆炸。它让训练深度网络有了可能。

4.残差网络为何有效

它学习恒等函数很简单,如果$z$为0,它输出的就是$a$,所以不会影响到效率。很多时候至少不减低效率,甚至可以提升性能。为了保证$z$和$a$相同,所以经常使用相同连接,保证维度相同。

如果维度不相同,可以再增加一个矩阵,让维度发生变化。

5. 网络中的网络和1*1卷积

如果是一个单通道的,似乎只能起到扩大相同倍数的作用。但是如果多通道的,那就不一样了。也叫network in network。

用这个可以改变通道数,在不改变高宽的情况下。

image-20200815112127565
image-20200815112127565

6. 谷歌Inception网络

构建卷积层时候要考虑过滤器大小,Inception代替你做选择。

动机

代替人工来确定创建卷积层和池化层,以及确定大小。

做法

卷积时候用不同的过滤器。考虑5*5的过滤器的计算成本。 生成bottleneck layer。中间有一个bottleneck层,减小计算量0倍。

事实证明,合理构建,显著减小表示层规模,也不会影响性能。

image-20200815114534372
image-20200815114534372

7. Inception网络

pooling层之后通道太多,所以还是用1*1卷积改变通道数。这就是一个Inception module。然后将这些块重复几次,就形成了最终结果。

并且结构中还在隐藏层中预测了。它确保了即便隐藏层也参与了特征计算。起到了一种帮助debug的作用。

Inception从哪里来的,盗梦空间,作者通过它来表明要建立深度网络的决心。

image-20200815115430026
image-20200815115430026
image-20200815115437144
image-20200815115437144

8. 使用开源的实现方案

很多神经网络复杂细致,难以复制。很多时候仅仅读论文也不能复制。

网络上找到开源的实现快很多。

9. 迁移学习

如果下载别人的参数,进行预训练,也很有效。你可以直接下载别人训练好的权重,放在自己的网络上。

把别人模型下下来,然后把最后输出调整一下,只训练后面自己增加的一部分。通过使用别人预训练的权重,很可能得到很好的效果。把前面的权重冻结即可。或者直接拿隐藏层输出。

预计算就是先计算好,后面就快了。

如果有更大的数据集,就不要只训练最后的了,可以考虑多训练积层。从后往前训练。

或者直接训练整个网络,预训练+微调这样。

10. 数据增强

计算机视觉很复杂。最大问题就是没有足够的数据。也就是说,数据增强通常是有用的。

  • 镜像:将图片翻转。
  • 随机裁剪。
  • 颜色转换,RGB的PCA颜色增强。

训练时完成图片的扭曲,可以一边加载,一边扭曲,一边僧成mini-batch。使用一个线程处理数据,一个线程训练,这样可以并发。

11. 计算机视觉现状

语音识别数据很多。大型数据集图像识别和图片分类一般多。物体检测,我们拥有的数据很少。因为获取边框的成本更高。

当有很多数据时,人们倾向于更简单的网络,更少的手工。当数据多时候,手工工程精心设计。

我们的学习算法来自于两种知识,一种是标记的数据,另一种是手工工程。为什么模型复杂?因为数据不够,只能增加手工工程。

从历史上来看,我们现在用的数据集还是太小了。不过增加的很多。超参数还是很多。

当数据量很少的时候,可以用迁移学习。对于计算机视觉研究者,很多人在推进benchmark。还有很多人在发展最有用的。

赢得竞赛

集成学习,训练几个独立的网络,并把它们的输出平均。这需要很大的训练量。要占用比较大的内存。

另一个方法是multi-crop,数据扩展应用到测试数据集的作用。就是测试集上的数据增强。10-crop,训练后取平均。这可能会得到更好地效果。

要建立一个实用的系统,最好从他人的工作入手。

Week 3

1. 目标检测

目标检测之前,先学习目标定位。定位分类问题。先判断汽车的具体位置,再对其进行分类。

定位问题只是一个,检测是所有的。

合理定义输出即可,然后定义损失函数。

image-20200815143311660
image-20200815143311660

2. 特征点检测

比如想确定人脸眼角的具体位置。就设定输出横纵坐标。通过这些关键点,可以完成进一步的判断。

也可以进行身体的特征点检测。这些都需要数据仔细的标注。

image-20200815143930029
image-20200815143930029

3. 目标检测

目标检测,然后用分类器判断。滑动窗口检测。不同粒度需要考虑准确度和计算成本。

image-20200815144538595
image-20200815144538595

4. 卷积的滑动窗口实现

用一个很大的过滤器,那么输出就会成为1行的了。这就用卷积层代替了FC层。

在图片上剪切一个区域,然后继续下一个区域,直到某个区域识别出汽车。我们可以直接对全图计算,一下算出所有值。

image-20200815150050368
image-20200815150050368

5. Bounding Box预测

如何得到更准确的边界框?

YOLO算法,You Only Look Once.

举个例子,一个3*3的网格。采用图像分类和定位算法,逐一应用到9个格子中。9个格子,每个都会得到一个8维的输出向量。就会得到一个$338$的矩阵。

对象横跨多个格子,只会分配到1个上面。

6. 如何判断预测的效果

在对象检测任务中,为了评估效果,需要指定损失函数。这里我们用交并比。用交集/并集作为预测效果。只要大于等于0.5,效果就是挺好的,0.5是阈值,用来判断预测的边界框是否正确。

image-20200815153636611
image-20200815153636611

7. 非极大值抑制算法

算法可能对一个对象做出多次检测,非极大值抑制可以解决这个问题。

找到IoU最大的,然后把小的去掉。只输出概率最大的预测结果。

找到最大的,然后把和输出结果重叠程度过高的放弃。

image-20200815183310741
image-20200815183310741

8. Anchor Boxes

如果想让一个box检测多个对象,就用anchor boxes。输出变成多个。

能够让模型更有针对性。人们一般手动选择anchor box的形状。后期有更好地方法,用k-means聚类。

image-20200815184316458
image-20200815184316458

9. YOLO对象检测

分成九宫格,逐个检测。

image-20200815185528973
image-20200815185528973

10. RPN网络

R-CNN带区域的CNN,不再针对每个窗格运行卷积神经网络。

先选定区域,然后每个区域输出。

R-CNN太慢了。所以有了Fast R-CNN,用滑动窗口的卷积实现。得到候选区域的聚类慢。

Faster R-CNN,用卷积提出区域。

image-20200815191002677
image-20200815191002677

Week 4

1. 人脸识别

人脸验证,输入图片和个人ID,判断是否对应。

人脸识别,难很多。K个人的数据库,给出一个人脸,判断人脸对应数据库中哪个信息。之所以难,在于要解决one-shot的问题。

image-20200815191522811
image-20200815191522811

2. One-shot学习

仅仅一个人脸样例,就记住这个人。

输入图片,比较和数据库中图片的距离。

image-20200815192224773

3. Siamese网络

映射到一个特征空间,然后比较两个特征向量即可。

学得参数,使得同一个照片的距离足够小。

image-20200815195336684
image-20200815195336684

4. Triplet损失函数

比较成对的图像。定义锚点,然后Postive的接近,Negative的远。

为了保证不要一直输出0,所以不能小于等于,而是小于。

三元组损失函数定义基于三张图片,anchor、positive和negative图片。

如果随机选择,那很容易满足条件。所以要尽量选择比较难的三元组。

image-20200815200902248
image-20200815200902248

5. 面部验证与二分类

把人脸识别问题降维,嵌入,然后进行面部验证与二分类。

并且可以先嵌入,新脸再走整个过程。

image-20200815201558284
image-20200815201558284

6. 神经风格迁移

image-20200815201813673
image-20200815201813673

7. 深度卷积网络在学什么

怎么看深度神经网路哦在学什么?找到最大化单元激活的9张图片。找到单元对应的图片中的位置。

image-20200815203251944
image-20200815203251944

8. 代价函数

定义一个代价函数来表示成功与否。

image-20200815203702684
image-20200815203702684

9. 内容代价函数

image-20200815204336280
image-20200815204336280

10. 风格损失函数

将图片的风格定义为激活层的不同通道的系数。

风格矩阵。 $Gram$矩阵。

这时一个不标准的互协方差。

关键还是对风格的定义,来源于对卷积的理解。

image-20200815210315701
image-20200815210315701

11. 一维到三维推广

卷积是一种基于位置的,可以推广。

image-20200815211834112
image-20200815211834112