吴恩达深度学习课程第四课 — 卷积神经网络(Convolutional Neural Networks)

目录

1.边缘检测(Edge detection)

1.1.垂直边缘检测(vertical edges)

1.2.水平边缘检测(horizontal edges)

1.3.滤波器 

2.Padding

3.卷积步长(Stride)

4.三维卷积(Convolutions over volumes)

5.卷积网络的层(One layer of a convolutional network)

5.1.卷积层(Convolution layer)

5.2.简单卷积网络示例(A simple convolution network example)

5.3.池化层(Pooling layers)

5.4.全连接层(Fully connection layers)

6.为什么使用卷积?(Why convolutions?)

7.经典网络(Classic networks)

7.1.LeNet-5

7.2.AlexNet

7.3.VGG-16

8.残差网络(Residual Networks,ResNets)

9.网络中的网络及1x1卷积(Network in Network and 1x1 convolutions)

10.谷歌Inception网络(Inception network)

11.目标检测(Object Detection)

11.1.目标定位(Object localization)

11.2.特征点检测(Landmark detection)

11.3.目标检测(Object detection)

11.4.滑动窗口的卷积实现(Convolutional implementation of sliding windows)

11.5.Bounding box预测(Bounding box predictions)

11.6.交并比(Intersection over union)

11.7.非极大值抑制(Non-max suppression)

11.8.Anchor Boxes

11.9.YOLO算法(YOLO algorithm)

11.10.候选区域(Region proposals)

12.人脸识别(Face recognition)

12.1.什么是人脸识别(What is face recognition?)

12.2.One-shot学习(One-shot learning)

12.3.Siamese网络(Siamese network)

12.4.Triplet损失(Triplet loss)

12.5.人脸验证与二分类(Face verification and binary classification)


卷积运算:中间小矩阵被称为过滤器/滤波器(filter)或核(kernal)。用过滤器在原图上依次移动,将过滤器与其所覆盖区域相应元素乘积之和即为结果矩阵相应位置的元素值。可见,计算后的图片变小了。

1.边缘检测(Edge detection)

1.1.垂直边缘检测(vertical edges)

 

通过上图所示的一个过滤器,就能检测出原图中的垂直边缘,由于原图很小是6x6,所以结果的白色区域显得很大,但是当图片很大时,检测的垂直边缘将会有不错的效果。

更进一步,还可以检测出颜色的渐变(浅到深、深到浅),如下图所示。如果不在乎这些,可以直接取绝对值即可。

 

1.2.水平边缘检测(horizontal edges)

 

以此类推,水平边缘检测的过滤器就把垂直的过滤器扳倒。更复杂一步,如上图的下半部分,用水平检测过滤器去计算,依然可以检测出原图中的水平边缘,尽管输出图像中间是有灰度渐变的。

1.3.滤波器 

滤波器并非一成不变的,有经典的,也可以自己自定义,当然课可以根据结果利用机器学习的方法反推出滤波器的参数,以此检测更多角度的边缘。但为方便通常为奇数维。

2.Padding

如果按照上述的卷积方法,图片每经过一次卷积运算就会缩小一次,这样存在两个问题:

  1. 图片越算越小。
  2. 处于原图边缘的像素会被忽略掉,在中间的像素却被计算很多次。

所以为了解决上述问题,计算之前,在原图周围填充一圈像素(padding),可以填充0,也可以填充多圈。

对于填充多少层,通常有两种方法:

  • Vaild:就是不填充。
  • Same:填充之后输出的图像跟原图尺寸一样。 

3.卷积步长(Stride)

上述卷积运算的步长均为1,如果调整为2,结果如下图所示,不仅横向移动步长为2,纵向移动步长也为2。 

4.三维卷积(Convolutions over volumes)

上述的卷积运算都是对灰度图像进行卷积(6x6),而有颜色的图像则是6x6x3,因为每个像素都有RGB三个颜色的通道。相应的滤波器也是有三个通道(channel),原图有几个通道,滤波器也得有几个通道,但是输出图像却是单通道的。

如下图所示,可以将三个矩阵的叠加抽象成立方体,类似于单通道卷积运算,滤波器方块依次在原图上移动,27个相应位置的成绩之和即为输出图像相应位置的元素值。

如果我们想要对RGB图像进行边缘检测时,如下图所示:

若我们只想检测红色通道的边缘,则可使用下述第一行所示的过滤器(R通道为单通道垂直边缘检测滤波器,G通道B通道全0)。

若不关心边缘在哪个通道,则可以使用第二行的过滤器,三个通道均采用垂直边缘检测滤波器方式。

接下来,如果我们想要同时检测垂直边缘、水平边缘、甚至45°边缘……也就是同时采用多个滤波器。如下图所示,我们用两个不同的滤波器来分别检测RGB图像的不同的特征,将分别得到的结果叠在一起。所以,输出结果的通道数等于检测特征数。

5.卷积网络的层(One layer of a convolutional network)

5.1.卷积层(Convolution layer)

基于上述的卷积运算,单层神经网络隐藏层的计算为:

  • 先执行三维卷积运算得到一个矩阵(下图4x4),该运算即一般神经网络中的w^[1]a^[0]。
  • 再给w^[1]a^[0]加上一个偏差b^[1](实数,广播到矩阵的每一个元素上),即z[1]=w^[1]a^[0]+b[1]。
  • 最后加持激活函数(下图为ReLU函数)。

这样通过神经网络的一层将输入特征a[0]立方体输出为另一个a[1]立方体(6x6x3->4x4x2)。

5.2.简单卷积网络示例(A simple convolution network example)

如下图所示,经过四层卷积层,最后的到一个7x7x40的“立方体”,共1960个元素,可以将其平滑或展开成一个含有1960个元素的向量,然后把这个长向量填充到softmax回归函数中,最后输出预测值y^。

总的来看,随着卷积神经网络的深度加深,图片(矩阵)越变越小,但叠加的层数越来越深。

典型的卷积神经网络通常有三层:

  • 卷积层(Convolution, Conv)
  • 池化层(Pool)
  • 全连接层(Fully connected, FC)

虽然仅用卷积层也能构建一个好的卷积神经网络,但大部分神经网络架构师依然会添加池化层和全连接层。

5.3.池化层(Pooling layers)

如下图所示,假设用到的池化类型是最大池化(Max Pooling),将输入原矩阵分成四个部分(分别用不同颜色表示),输出是一个2x2的矩阵,其中每个颜色的小方块的元素的值为输入矩阵相应颜色区域的元素的最大值。

那么其使用的过滤器就是一个2x2的步长为2的过滤器,所做的操作是计算最大值。

如下图所示,对于一个5x5的矩阵,将过滤器设置为3x3的步长为1,则输出一个9x9的矩阵。 

除了最大池化法外,还有平均池化法,它不太常用。

池化层没有需要学习的参数,它都是超级参数(过滤器维度、步长)。

5.4.全连接层(Fully connection layers)

如下图所示,经过两组“卷积+池化”,将输出扩展为一个长向量(400个元素),然后利用这400个单元构建下一层,下一层含有120个单元,这就是一个全连接层,这400个单元与120个单元紧密相连,形成一个标准的神经网络,它有权重w和偏差b。

接着下一层依然是一个更小的全连接层(有84个单元),最后我们用这84个单元填充一个softmax单元。

在卷积神经网络中,通常还有另一种常见模式:

一个或多个卷积层后面跟随一个池化层,然后一个或多个卷积层后面再跟随一个池化层,然后是几个全连接层,最后是一个softmax。

6.为什么使用卷积?(Why convolutions?)

和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接。

  • 参数共享:过滤器可以在图片的任意一个地方使用,检测每一种特征只需要一个过滤器即可。如果使用全连接层,每检测一种特征将会产生大量的参数。
  • 稀疏连接:输出矩阵的每一个元素仅与过滤器所覆盖的那一块的输入特征值有关(相连接)。

以上,卷积层相比全连接层要少很多参数。

7.经典网络(Classic networks)

7.1.LeNet-5

LeNet-5可以识别图片中的手写数字,其是针对灰度图像训练的。

第一步卷积层:使用6个5x5步长为1的过滤器;

第二步池化层:使用2x2步长为2的过滤器(平均池化);

第三步卷积层;

第四步池化层;

第五步全连接层;

第六步全连接层;

最后得出预测值;

7.2.AlexNet

AlexNet能够处理非常相似的基本构造模块,这些模块往往包含大量的隐藏单元或数据,这使得AlexNet表现出色。另外,AlexNet使用了ReLU函数,这也是AlexNet比LeNet-5要优秀的原因。

第一步卷积层:使用96个11x11步长为4的过滤器;

第二步池化层:使用3x3步长为2的过滤器(最大池化);

第三步卷积层(+padding):使用5x5的过滤器并进行padding填充,矩阵还保持原来大小。

第四步池化层;

第五步卷积层(+padding);

第六步卷积层;

第七步卷积层;

第八步池化层;

第十步全连接层;

第十一步全连接层;

最后得出预测值;

7.3.VGG-16

VGG-16没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。

首先用3x3步长为1的过滤器构建卷积层,padding参数为same;

然后用2x2步长为2的过滤器构建池化层(最大池化);

VGG-16的特点是先几次卷积(64个过滤器->128个->256个->512个,每轮翻倍),再池化一次缩小矩阵。

8.残差网络(Residual Networks,ResNets)

ResNets是由残差块构建的,残差块如下图所示,一个正常的两层神经网络,现将a[l]直接跳到第二层线性激活之后,ReLU激活之前。跳跃的路径(下图紫色线)叫作捷径或远眺链接,这样a[l]才能通过捷径跳过一层或者好几层,从而将信息传递到神经网路的更深层。

如下图所示,将一个个残差块连接起来,就成了残差网络。

理论上网络深度越深越好,实际上,如果没有残差网络,普通网络越深优化算法越难训练,训练错误会越来越多,有了ResNets即使网络再深,训练错误也难以反弹,这种方式有利于解决梯度消失和梯度爆炸问题。

9.网络中的网络及1x1卷积(Network in Network and 1x1 convolutions)

如下图所示是进行1x1的过滤器的卷积运算,1x1的神经网络可以理解为以下32个神经单元都应用了一个全连接神经网络。

10.谷歌Inception网络(Inception network)

Inception层的作用是代替人工来确定卷积层中的过滤类型,或确定是否需要创建卷积层或池化层。你可以给网络添加这些参数的所有可能的值,然后把这些输出堆叠抵赖,让网络自己学习它需要什么样的参数。

以应用5x5过滤器进行卷积运算为例,计算上述大小的输入需要1.2亿次运算,如果加入一个1x1过滤器(称为瓶颈层)将原来的192个信道减少为16个信道,将会大大减少计算成本。

一个Inception模块如下图所示。

将一个个Inception模块组装在一起,就形成了Inception网络。

11.目标检测(Object Detection)

11.1.目标定位(Object localization)

在传统的卷积神经网络进行图片分类时,除了输出值为四种类别物体外,还要输出物体的位置参数(四个)。

输出值y的形式为一个向量,如下图所示,第1个元素pc标识图片中是否有物体(是1否0,如果为0则之后的元素将没有意义),第2345个元素代表物体框位置信息,剩下三个元素分别代表三个种类,同时只能有一个元素为1,其余为0。

另外损失函数如左下角所示,如果样本真值y的pc为1,则对所有元素按方差思路进行计算损失函数,否则代表该图片没有物体,直接计算pc的方差。

11.2.特征点检测(Landmark detection)

选定好特征点,利用包含这些特征点的标签训练集,将人脸图片输入卷积网络,输出一个向量标识了各特征点位置。

11.3.目标检测(Object detection)

以检测图片中的汽车为例,我们首先要构建一个标签训练集,也就是x和y表示适当剪切的汽车图片样本(也就是将图片剪切成只有一个汽车占据了图片的中心的样子),输入这些适当剪切过的图片,通过卷积神经网络输出Y,1或0表示图片中是否有汽车,训练完这个卷积网络,我们就可以用它来实现滑动窗口目标检测。

滑动窗口目标检测具体步骤如下:

  1. 选定一个特定大小的窗口(如下图所示),将该小窗口输入卷积网络进行预测;
  2. 将红色方框稍向右滑动,接着将该区域输入卷积网络进行计算。

……以此类推……直到该窗口滑过图像的每一个角落,每个位置用0或1进行分类。

可以逐渐把红框放大,重复几次,这样目标物体总能被框进去。

滑动窗口目标检测法有一个缺点就是计算成本太大(不过这也有解决办法)。

11.4.滑动窗口的卷积实现(Convolutional implementation of sliding windows)

如下图所示,输入一张图片,经过卷积池化及两层全连接,最后得到一个向量(四个元素分别为四种类别各个的概率)。接下来要将这些全连接层转化为卷积层,前两层还是一样,到第三层的时候,取而代之的使用5x5x16的过滤器400个(过滤器的信道要与输入信道16一致,5x5与输入矩阵一致保证每个信道只输出一个元素,400个信道保证输出400个元素),这样输出400个信道的1x1矩阵,与原来400个单元效果一样。同样的,下一层采用1x1x400的过滤器400个,最后采用1x1x400的过滤器4个。如此以来,实现了用卷积层替代全连接层。

现将滑动窗口应用到卷积上,如下图所示,滑动窗口步长为2,在原图上移动共有4个位置4个输出,窗口输入卷积网络,按照上述过程最后得到2x2的矩阵,输出左上角的蓝色元素对应输入左上角窗口部分。同样的,如下图所示,输出右上角对应输入右上角,输出左下角对应输入左下角,输出右下角对应输入右下角。

我们不用一张张地将窗口区域输入卷积网络,而是直接将一整张图片输入,就可以一遍遍扫描找到包含目标物体的窗口,识别出汽车的位置。

11.5.Bounding box预测(Bounding box predictions)

滑动窗口法很有效率,但不能输出最精准的边界框。如下图所示,离散的窗口在图片上滑动并输入分类器,可能这就是最匹配的边界框了。而且甚至最匹配的边界都不是正方形。

那有没有可以输出精准边界框的算法呢?YOLO算法。

首先在图像上放一个网格,然后对每一个网格贴上标签y向量(与上述输出y向量一样,8维,目标物体的中点在哪一格,就将其算在哪一格,像下面中间一格就当做什么也没有),总共有3x3个格子,所以输出大小是3x3x8。

由于这是卷积实现,所以不必一格算法跑九次,而是直接将图片输入进行一次卷积计算即可(卷积过程中许多计算步骤是共享的)。YOLO的速度非常快,可以达到实时识别。

对于y向量,位置参数均相对于该窗口左上角为坐标原点,用百分比来表示,bx by介于0 1之间,而bh bw高宽却是可能超过1的,因为可能会出现实际目标物体横跨多格的情况。

11.6.交并比(Intersection over union)

如何判断对象检测算法运作良好呢?交并比函数。

交并比函数做的是计算两个边界交集和并集之比,一般认为如果交并比超过0.5就认为正确。

11.7.非极大值抑制(Non-max suppression)

非极大值抑制可以保证你对每个目标物体只检测一次。如下图所示,将图片分成19x19格,由于只将汽车分配给中点所在的格子,所以理论上只有一个格子做出有车的预测。但是汽车所覆盖的几个格子都会想自己里面有汽车。

因为你要在361个格子上都跑一次,那么可能很多格子都会举手说我的pc概率很高,而不是仅有两个格子会举手,所以最后可能会对同一个对象做出多次检测。所以非极大值抑制做的就是清理这些检测结果,这样每辆车只检测一次。

所以具体上,这算法做的是,首先看看每次报告,每个检测结果相关的概率pc。首先看概率最大的那个,下图中是0.9,然后说这是最可靠的检测,所以高亮标记,然后非最大值抑制就会注意审视剩下的矩形(所有和这个概率最大的边界框有很高交并比,高度重叠的其他边框),这些矩形的输出就会被抑制(抛弃)。

算法的具体做法:

  1. 在这个19x19的网格上跑一下算法,得到19x19x8的输出(下图假设只检测汽车一种,所以向量缩减为5维)。
  2. 去掉所有预测的pc小于某个阈值(0.6)的边界框。
  3. 而对于剩下的边界框,一直选择pc概率最高的边界框(高亮),将其输出成预测结果。
  4. 去掉剩下的边界框。

如果要检测多个对象,就需要分别对每个对象都做一次非最大值抑制。

11.8.Anchor Boxes

现在的问题是,每个格子只能检测出一个对象。如果想要一个格子检测出多个对象,就要用到Anchor Box,如下图所示,行人与汽车的中心几乎都落在同一个格子中,所以对于该格子,输出的y向量c1 c2 c3我只能选一个为1。

Anchor Box的做法是:

  1. 预先定义两个不同形状的anchor box(一般来说要多个,但在本例姑且定义两个),将两种类别的目标物体与这两种形状的anchor box联系起来。
  2. 定义类别标签,用的向量不再是下图左下角所示,而是重复两次右下角所示,前半部分的元素用来表示anchor box1(行人),后半部分表示anchor box2(汽车)。

11.9.YOLO算法(YOLO algorithm)

如何构造你的训练集(如下所示):

为每个样本贴上标签分类,向量y表示。

算法是如何做出预测的:

输入图像,输出尺寸是3x3x2x8,对于每个格子都有对应的向量。

最后要跑一下非最大值抑制:

11.10.候选区域(Region proposals)

在检测图片的时候,有一部分区域如下图左部分区域没有什么有意义的内容,所以有一种叫作R-CNN(带区域的卷积网络)的算法,尝试选出一些对运行分类器有意义的区域,这样以来不再针对每个滑动窗口检测算法。

选出候选区域的算法是运行图像分割算法,分割的结果得到右边的图像,蓝色的区域就是可能存在对象的区域,分类器再去检测。

R-CNN算法比较慢,一次只识别一个候选区域,但是近年来有改进工作的提出,如Fast R-CNN基本与R-CNN没有区别,但是用滑动窗口的卷积实现去检测所有候选区域;更有甚者,Faster R-CNN还用卷积神经网络去选出候选区域。

即使如此,R-CNN还是比YOLO慢。

12.人脸识别(Face recognition)

12.1.什么是人脸识别(What is face recognition?)

术语辨别:人脸验证vs人脸识别

12.2.One-shot学习(One-shot learning)

在一次学习中,对于每个人我们仅有一个样本来训练,如果将其放入卷积神经网络中训练,输出几个标签,但是这样小的训练集难以支撑一个稳健的卷积网络,并且如果有新职员加入,需要重新训练网络。

如果想要更好的效果,就要用到similarity函数(d()),它以两张图片作为输入,然后输出这两张图片的差异值,差异值小于某个阈值,我们将其判定为同一个人。通过比较数据库中该人图片的差异来判断是否是这个人,这样当新人物加入时,就直接将该人的一张图片加入数据库即可。

12.3.Siamese网络(Siamese network)

函数d(similarity函数)的作用是输入两个人脸,然后输出差异值。实现这个功能的一个方式是用Siamese网络,做法是将两张图片喂给同一个卷积神经网络(这个网络是能够很好表现人脸特征的),然后计算两个输出向量的差异。

那怎么训练这个卷积神经网络呢?训练的目标就是求出这个网络的参数,使得当两张图片是同一个人时,d函数计算的差异值很小;反之则很大。如果改变这个网络各个层的参数,那么输出就会改变,你要做的就是利用反向传播来改变这些参数,以确保满足这些条件。

12.4.Triplet损失(Triplet loss)

训练优质的参数方法之一就是定义三元组损失函数然后应用梯度下降,为了学习卷积神经网络的参数,你需要同时看几幅图片,如下图所示,三元组损失代表着你需要看Anchor Positive(与Anchor同一个人) Negative(与Anchor不是同一个人)三张图片,然后你需要分别比较Anchor与Positive,Anchor与Negative。

网络训练的目标就是要使得A与P的差异要小于或等于A与N的差异,由于当A P N输出的向量相等的时候仍然满足等号,所以要改善为“严格小于”或在不等式左部添加一个超参数(如下图所示)。

所以更进一步,可以定义三元组损失函数L如下图所示,之所以在外部套一个max(),是因为只要绿框的值为负即可,该损失函数得0即可,并不关心值为负多少。然后成本函数J即为每个三元组样本的损失函数值之和。

应用梯度下降算法使得成本函数达到最小化,这样便训练好该网络了,接下来就可以将该网络应用到“一次学习”中了。

但在训练集(三元组)的选择上,要尽量选择难训练的三元组(即d(A,P)与d(A,N)差距较小的三元组),因为如果A与N的人完全不同,差异比(A,P)要大得多,那网络将学不到什么。只有将差异小的三元组放入训练,网络才会尽量使得不等式两边有间隔。

12.5.人脸验证与二分类(Face verification and binary classification)

Triplet loss是一个学习人脸识别卷积网络参数的好方法,还有其他学习参数的方法。

另一个训练神经网络的方法是选取一对图片,选取Siamese网络,使其同时计算这些嵌入,然后将两个向量同时输入逻辑回归单元,然后进行预测,如果输入的两张图片是同一个人,则预测值为1,否则为0。这样就把人脸识别问题转换为一个二分类问题。

训练这种网络时,可以替换Triplet loss的方法。

上图两张图片输入的网络都是同一套网络,最后的逻辑回归单元可以用sigmoid函数(如图中所示)。在实际应用场景中,比如下一张图片是数据库中该员工的图片,上面是要比对的图片,可以用该网络提前将数据库中的图片先计算好输出向量存起来,然后下次只需要计算新图片的输出向量即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值