目录链接:吴恩达Deep Learning学习笔记目录
1.卷积神经网络
2.CNN实例探究
3.目标检测
4.人脸识别和神经风格转换
1. 卷积神经网络
1.1 边缘检测
在计算机视觉中,图片的识别过程是先检测到图片中的边缘,再检测到图片中的一部分,最后检测到整个图像。如下图,对于边缘检测,计算机检测一张图片时,可能首先第一步要做的就是检测图片中的垂直边缘(如栏杆、人的轮廓线)。可能第二步要做的是检测水平边缘。
为什么通过卷积计算后,计算机能够检测到图像的边缘呢?下图是比较直观的描述,可以看出,原图片为左边亮、右边暗,卷积核也是左边亮、右边暗(反过来呢?),卷积后的结果就是中间亮、两边暗(卷积核或原图反过来就中间暗)。
1.2 Padding
如下图中的卷积操作,(n,n)
的图片经过(f,f)
的卷积核后,得到(n-f+1,n-f+1)
的输出。这样进行卷积存在两个问题,①每经过一次卷积,图片都在缩小;②在边缘上的像素点卷积时只被利用一次或几次,而在中间的像素点被重复利用很多次,这就导致边缘的很多信息被丢失。Padding即用来解决这个问题,即在图片矩阵外围再补一层亮度值0(RGB图中为0-255),Padding后再卷积得到的输出为(n+2p-f+1,n+2p-f+1)
,如此便可以避免图片缩小问题,弱化边缘信息丢失问题。
1.3 卷积步长
假设输入图片为(n,n)
,卷积核(f,f)
,步长为s
,Padding为p
,那么输出图片大小为((n+2p-f)/ s +1,(n+2p-f)/ s +1)
。如果(n+2p-f)/ s
不是整数,则向下取整。
1.4 三维卷积
RGB图片有三个通道,分别为红绿蓝,描述一张图片的矩阵为(n,n,3)
,所以卷积核大小为(f,f,3)
,但输出还是一个二维矩阵。
1.5 单层卷积网络
单层卷积网络计算过程:1.6 简单卷积网络示例
简单的卷积网络如下,一般而言,卷积核的数量会随着网络深入而增加,图片缩小(无Padding时),实际上,典型的卷积网络应该包括卷积层、池化层和全连接层。1.7 池化层
池化的直观理解,相当于卷积核,但不是执行权重求和,而是执行核选取区域最大值(最大池化)或平均值(平均池化)。其意义是,如果核提取到某个特征,则保留其最大值,如果这个区域没有这个特征,那么它的最大值也很小。池化操作会对每一通道数据进行池化,池化后通道数不变。池化层只有一组超参数,没有可学习参数。1.8 典型卷积神经网络
1.9 为什么采用卷积网络
相比于只用全连接层相比,卷积层的两个主要优势是参数共享和稀疏连接,这两个原因可以减少参数,防止过拟合。
②稀疏连接:例如,输出结果中一个像素点上的数值仅由卷积核对应的那块区域决定,其他区域都不会对其造成影响,而全连接层则是将输入图片所有数据用于计算。
卷积神经网络还能够提取平移不变的特征,因为对于卷积网络,即使画像平移几个像素,这张图片依然具有非常相似的特征。
2. CNN实例探究
2.1 经典网络
(1)LeNet - 5
LeNet - 5可以识别图片中的手写数字(适用于灰阶图像,32 * 32 * 1),LeNet - 5没有Padding,池化采用的是平均池化。随网络深度增加,图像缩小,通道数增加。论文中使用的激活函数为sigmoid和tanh。一共约6万个参数。
实际上,AlexNet (一共约6000万个参数)与LeNet - 5有很多相似之处,但AlexNet采用了含有很多隐藏单元的基础模块,并在规模很大的数据集上训练,这使得其表现极为出色;另一个让其表现出色的原因是采用了relu激活函数。
②“局部响应归一化层”:将一个像素位置上所有通道上的值进行归一化,即LRN层,这么做的原因是我们可能不需要那么高的激活值,但后来研究者发现LRN层起到的作用不大。
(2)VGG-16 **
2.2 残差网络(Residual Networks)
非常深的网络是很难训练的,因为存在梯度消失和梯度爆炸问题。残差网络,通过“远跳连接”将前面的信息直接传给后面的layer,而不经过中间的layer。
(1)残差网络为什么有效?
当一个网络越深时,它在训练集上的效率会有所降低,但在残差网络上并不完全如此。在残差块中,a[l]通过远跳连接直接与l+2层Z加和后输入到激活函数,若网络中添加了正则项,Z[l+2]的计算中,权重W可能被压缩得很小,如果出现梯度消失问题,那么Z[l+2]项被忽略;又激活函数为ReLu,故该过程相当于计算了a[l]=a[l+2]得恒等式。a[l]和a[l+2]维度不同问题,添加一个权重矩阵来将a[l]维度转化与a[l+2]一致,但实际上ReNet采用了一系列维度相同的卷积。
(2)网络中的网络和1x1卷积
对于一张单通道的图片来说,用一个1x1的卷积核去卷积,其意义不大,但对于网络中,通道数量很多的数据,1x1卷积核可以实现降维或升维的作用(通道坐标上的维度)。
2.3 Inception network motivation
构建卷积层是,我们要决定卷积核的大小(1x3、3x3或5x5?)、要不要添加池化层,Inception网络可以自己学习决定,虽然模型会变得比较复杂,但其表现却非常好。如下图,①1x1 filter用于通道降维(或升维);②3x3 filter用于卷积;③5x5 filter也用于卷积;④MAX-POOL用于最大池化。这些filter过程都需要维持输出图片大小一致(通过Padding和stride控制)。
(1)如何计算loss
如下图,在计算loss的过程中,存在一个问题,28x28x192的输入,那么卷积核的大小为5x5x192,一共32个卷积核,那么需要执行的乘法操作将达到1.2亿次,就算是现在的计算机也比较花费时间,而这仅仅是一层卷积。
(2)Inception network
Inception模块,两个绿色层中间各个连接,在训练时,模型会选择启用哪一个连接结果更优。
2.4 迁移学习
如上图所示,①当你的数据集较小时,可以采用其他人的网络核权重参数,替换输出层,训练时仅训练输出层参数;②当数据集较大时,则选择训练后几层网络参数;③当你的数据集足够大时,可以将所有参数都训练。
3. 目标检测
3.1 目标定位
在目标检测中,一张图片的分类,输出不仅仅是一个标签(归属于什么),而是多个标签,如同时输入这张图片含有行人、汽车、摩托、背景等;此外对于检测到的目标如行人,不仅包含行人标签,还包含这个行人的位置、大小。如下图,图片左上角坐标为(0,0),右下角坐标为(1,1),检测到的目标坐标为其中心点(bx,by),大小为(bh,bw)。故目标检测中,输出的结果为多个标签,每个标签含目标所属类别、坐标、大小。
3.2 特征点检测
通过目标定位方法可以输出目标大小、坐标。更概括的说法是,神经网络可以通过输出图片上的特征点(x,y)坐标,来实现对目标特征的识别。例如,需要通过特征点来识别一张人脸,在训练集中,X为图片数据,标签数据Y包含[分类,人脸各个部分轮廓的特征点],如下图中人脸检测,输出64对坐标点、一个分类。需要注意的是,所有图片的坐标点顺序一致,如左眼角都是(x1,y1)。.3.3 目标检测
(1)滑动窗口法
要实现图片中汽车目标检测,①首先要构建一个标签训练集,X表示适当剪切的汽车图片样本(含有汽车则图片基本被汽车占满),Y=[1 = 汽车,0 != 汽车];②将这个训练集用于训练卷积网络;③通过滑动窗口的方法,采用已训练好的网络,可以实现目标检测。
(2)滑动窗口的卷积应用实现
如果采用上述的方法来实现窗口滑动,那么效率很低,如果在卷积层上应用这个算法,那么效率将大大提升。
(2.1)全连接层转化为卷积层
如下图第一个全连接层,一个样本输出的是一个长度为400的向量。将其转化为卷积层,则采用5x5x400的卷积核,卷积后得到1x1x400的输出,最终输出不再是一个softmax向量,而是1x1x4的输出。
(2.2)卷积层实现滑动窗口
实际上将滑动窗口中数据传入卷积网络,很多像素点对应的卷积计算都是重复在进行,所以没必要一个一个窗口的输入,而是将整张图片输入,最后输出各个窗口组成的卷积层数据。如下图中,绿色对应绿色部分。
3.4 YOLO算法
(1)Bounding box
在卷积网络中实现窗口滑动,能够提升效率,但还存在一个问题:不能输出最精准的边界框。在YOLO算法中,将图片划分为nxn份,如下图中3x3,更精细一点还可以是19x19等等。为每一部分都设置标签向量(含类别、坐标、大小等),最后输出结果大小为3x3x8(8即每个标签向量的长度)。这个算法将会使得两个目标的中心在同一个格子的概率降低。同时,能输出边界边框,可以具有任意高宽比和更精确的坐标。
(注意:中心坐标一定会坐落在划分的格子内,但长宽可能会比格子大)
:(2)交并比函数
交并比函数用于评价预测边框是否定位准确。
(3)非极大值抑制
前述的算法可能会对同一个目标做出多次检测,非极大值抑制可以保证算法对每个目标只检测一次。如下图中,每一个目标对象都会有很多个边框,每个边框会给出对应的Pc概率值,非最大值抑制算法会去掉除了概率最大的其他边框。
(4)Anchor box
如前所述算法都只是一个框检测一个目标,如果需要一个框检测多个目标,可以使用Anchor box。如下图,人和车的中心坐标都坐落在同一个格子里,那么对于那个格子的输出Y将无法检测出两个结果,必须输出人或车的其中一个。而Anchor box的思路是预先定义两个形状不同的anchor box,然后定义的输出向量包含两个概率、坐标、类别信息,并将其与anchor box分别关联起来。
(5)YOLO算法
①训练集:检测类别(行人、车、摩托),anchor box(竹竿和胖墩),那么标签向量为3x3x2x8。不同各自y定义如下:
4. 人脸识别和神经风格转换
4.1 one shot学习
人脸识别最大的挑战是解决一次学习问题,也就是需要仅仅通过一张照片或一个样本就能去识别这个人,而在传统的deep learning的认知中,只有一个样本时,表现并不好。假设用下图的方法去做人脸识别,①如果仅有4个员工,用4个员工去训练一个卷积网络,显然样本数太小,是不合理;②如果又来一个新员工,那么又将要重新训练这个网络。4.2 Siamese network
前述的卷积网络,最后将提取到的特征输入到softmax等函数来输出结果。在Siamese network中,将最后提取特征这一层(encoding of sample)将不会输入给softmax层,再将另一张照片输入到同一网络中(结构和参数都相同)提取特征,将两张照片的特征输入到“similarity”函数来求两张照片的相似度。4.3 三元损失函数(Triplet loss)
如下图,一共三张照片,A和P为同一个人,A和N为不同人,学习的目标是,我们希望,A和P之间的距离尽量小,而A和N之间的距离尽量大,那么就有:
loss 函数
4.4 人脸验证和二分类问题
4.5 神经风格转换
例子:采用Style的风格来绘制Content:
(1)深度卷积网络到底在学习什么?
论文Visualizing and Understanding Convolutional Networks告诉我们CNN每一层到底学习到了什么。论文通过将每一层的输出反池化、反卷积的到与原图片大小的图片,以此来观察每一层所学习到的东西。池化是不可逆的过程,论文中采用记录最大值的位置,再将池化后的数值放回原来位置,其余位置填充0来实现反池化过程。例如第一层,我们选取9个卷积核的输出,将每个卷积核的输出反卷积后,选取激活值top9(我的理解:n个样本通过这个卷积核输出后,选择激活值最大的9个)的绘制成图。可以看出,随着layer的增加,所学习到的特征更为复杂。
(2)代价函数
为了实现神经风格迁移,我们需要定义一个对于生成图片G的代价函数,并来优化它。公式含两项,分别代表新生成的图片和原图片、风格图片的相似度。对于新图片会先随机生成,然后经过优化代价函数来生成图片。
(2.1)Content代价函数
①我们需要通过hidden layer来计算content cost,如果层数太浅,那么它可能会使得像素上非常接近content图片,如果太深,则会判断图片中有什么(狗)来生成图片,并确保生成图片里有这个东西(狗),所以一般这个hidden layer既不会太浅也不会太深。②使用一个已经预训练的卷积网络(如VGG)。③将al和al作为图片在l层的激活值。④如果al和al相似,那么图片内容相似。
(2.2)Style代价函数
什么是一张图片的“style”?如果采用某一层的激活值来衡量“style”,那么这个style的定义就是各个通道之间对应位置上的点的相关系数。这个相关系数描述了,如果通道i中的内容出现在该位置,那么通道j中的内容出现在该位置的概率。例如下图,①通道对应①部分垂直线特征,②对应②部分橘色图案,相关系数描述了在对应位置①②同时出现的概率。
①k和k`表示同一层不同通道,i,j代表一个通道中不同位置坐标。计算两个通道的相关系数如下,将会得到一个相关系数矩阵,大小为通道数 x 通道数: