作者:jliang
《深度学习工程师-吴恩达》03卷积神经网络—卷积神经网络 学习笔记
1.重点归纳
1)神经网络解决的视觉问题
(1)图片分类
(2)目标检测
(3)图片风格迁移
2)卷积神经网络的padding
(1)不进行padding时存在的问题
- 图像会缩小
- 在边缘区域的像素点在输出中采用较少,意味丢掉了图像边缘位置信息
(2)padding类型
- Valid卷积:不填充,输出图像大小:(n-f+1)*(n-f+1)
- Same卷积:填充后输出大小和输入大小是一样的(n+2p-f+1)* (n+2p-f+1)
3)卷积核大小一般为3*3(最常用)、5*5、7*7
4)步长:窗口在每次移动的步长为卷积步长
(1)输出图像大小:((n+2p-f)/s + 1)* ((n+2p-f)/s + 1)
(2)向右移动或者向下移动时都是使用该步长
5) RGB图形卷积:
(1)每个通道的过滤器与每个通道的输入进行卷积,然后把3个通道卷积得到的结果相加作为输出
(2)如果我们希望同时检测任意角度的边缘,我们可以同时设置多组滤波器通道(每组的通道数必须与输入通道数一致),那么我们就能得到多个输出
- 每组滤波器通道可以检测一种特征
- 可以同时使用多组滤过不去通道检测特征,输出的特征数为使用的滤波器组数,通常叫做3维立方体的深度
6)单层卷积网络
(1)3通道输入经过两组3通道滤波器得到两组输出
(2)两组输出添加偏置b后再经过Relu**函数得到两组输出
(3)每个参数数量=3*3*3+1(偏置)=28,10组过滤器材280个参数。不论输入图片有多大,参数数量只与过滤器大小以及数量有关,这就是卷积神经网络的一个特征“避免过拟合”。
(4)输出大小:为向下取整符合
(5)输出图像的通道数等于这一层所使用的滤波器数量,每个滤波器的通道数等于输入层通道数
(6)权重参数数量:,其中为当个滤波器的参数数量
7)随着神经网络深度的加深,高度和宽度通常会减少,而通道数量会增加。
8)池化层:经常使用池化层来缩减模型的大小,提高计算速度,提高鲁棒性
(1)分类
- 最大池化(最常用): 取滑窗滑过时,窗口内输入值的最大值
- 平均池化:取滑窗滑过时,窗口内输入值的平均值
(2)池化层有两个超参数(大小和步长),但是没有需要学习的参数
(3)超参数
- 常用的参数是f=2&s=2,效果相当于高度和宽度缩减一半
- 也有使用参数f=3&s=2的情况
- 也可以根据自己意愿增加padding其他超参数,但大部分情况下最大池化时很少用到padding
9)关于如何选定这些超参数,常规的做法是尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个别人任务中效果很好的架构,那么它可能也适用于你的程序。
10)常见的模式
(1)前面多层卷积层(卷积层+池化层),然后再几个全连接层,最后再一个softmax。
(2)另一种常见的模式就是一个或多个卷积层(卷积层+池化层)后跟随一个池化层,然后再接一个或多个卷积层,再一个池化层,然后再几个全连接层,最后再一个softmax。
11)为什么使用卷积神经网络
(1)参数比较少,原因:
- 参数共享:同一层网络中,图片的不同位置都使用相同的卷积参数
- 稀疏连接:卷积层输出值的每一个数值都只与滤波器滑过的对应f*f个输入值有关
(2)卷积神经网络善于捕捉平移不变
2.计算机视觉
1)解决的视觉问题
- 图片识别(识别图片中是什么物体)
- 目标检测(如自动驾驶汽车自动识别前面的汽车/行人等物体,以避开物体行驶。计算图中有哪些物体,再将它们模拟成一个盒子,再识别出它的位置)
- 图片风格迁移
2) 挑战问题
(1)输入图片很大,很多清晰图片都非常大。如1000*1000的彩色照片输入就有1000*1000*3个输入,输入特征向量高达3百万个,即使隐藏层只有1000个单元,就会有30亿个参数。如此大的参数量下,难以获取足够的数据来防止过拟合。
(2)计算机内存量消耗也很大
3.边缘检测示例
1)神经网络在前几层中检测边缘,后面几层中检测到物品的部分,再往后几层检测到完整的物体
2) 边缘检测
(1)卷积计算
-
星号是卷积的标准标志,就是元素乘法
- python中使用conv-forward计算
- tensorflow使用tf.nn.conv2d计算
- keras使用Conv2D计算
-
卷积计算步骤
- 计算图片开始部分与卷积核一一对应各元素的元素乘法,结果值为下一层的输入
-
- 移动滑窗,继续计算卷积值
(2)垂直边缘检测
- 明暗交替的垂直边缘在输出图片中被明亮的竖线表示
- 在一个很大的图片中,图像中的垂直边缘会被很好得检测出来
4.更多边缘检测内容
1)当图片像素从左往右是从明至暗变化时,经过核函数得到的是中间亮两边暗的图形;反之,当图片像素从左往右是从暗至明变化,经过核函数得到的是中间黑两边暗的图形。核函数可以区分由明至暗的切换和由暗至明的切换。
2) 垂直边缘检测&水平边缘检测
水平边缘检测例子:
3)其它边缘检测
(1)Sobel滤波器(垂直边缘检测),它增加了中间一行元素的权重,也就是处在图像*的像素点,使得结果鲁棒性会更高一些
(2)Scharr滤波器(垂直边缘检测)
(3)以上两种滤波器旋转90度后可得到水平边缘检测滤波器
4)神经网络中的复杂图像识别时不需要指定滤波器,而是通过反向传播算法来学习这些参数,可以识别任何角度的边缘
5.Padding
1)不使用padding的缺点
(1)图像会缩小,经过几轮卷积后图像变得越来越小
(2)角落边的像素只被一个输出所使用,而图像中间的像素被多次使用,所以那些在边缘区域的像素点在输出中采用较少,意味丢掉了图像边缘位置信息。
2) padding:在卷积之前在图像的4周填充一层或n层像素,一般使用0进行填充。Padding=1时,在图像四边都添加一层填充,图像的长和宽都添加了2个像素。
(1)经过滤波器后输出的图像大小为(n+2p-f+1)* (n+2p-f+1),n为输入,p为padding,f为过滤器大小。
3)padding分类
(1)Valid卷积:不填充,输出图像大小:(n-f+1)*(n-f+1)
(2)Same卷积:填充后输出大小和输入大小是一样的(n+2p-f+1)* (n+2p-f+1),即p=(f-1)/2
-
f大小几乎都为奇数
- 为了更好的padding,如果是偶数,padding时只能某一边进行而不对称
- 奇数过滤器有一个中心点,在计算机视觉中如果有一个中心像素点会更方便指出过滤器的位置
- 一般为3*3(最常用)、5*5、7*7
6.卷积步长
1)窗口在任意方向每次移动的步长为卷积步长
2) 输出图像大小:((n+2p-f)/s + 1)* ((n+2p-f)/s + 1)
- s为步长(strides)
- 如果商不为整数,向下取整
3)数学教材和信号处理教材中,卷积的定义是做元素乘积求和之前,还有一个步骤(镜像操作)需要先做的。
(1)镜像操作
- 先把过滤器沿水平和垂直方向翻转
- 然后把翻转后的矩阵元素相乘来计算输出矩阵
(2)而前面我们没有进行镜像操作的“卷积”被称为互相关而不是卷积,但在深度学习文献中说的卷积就是没有进行镜像操作的“卷积”(深度学习中是不需要进行镜像操作的),两者名字有点不同。
7.卷积为何有效
1)在真实的图形识别中一般输入的是RGB图形,即有3个通道同时输入,高度为3
(1)每个通道使用独立的过滤器,过滤器通道数必须与输入通道数一致
(2)输出通道数为1
2)RGB图形卷积
(1) 每个通道的过滤器与每个通道的输入进行卷积,然后把3个通道卷积得到的结果相加作为输出
(2)如果你想检测红色通道的边缘,你可以设置红色通道对应的过滤器为边缘检测参数,并且把绿色和蓝色通道的过滤器参数设置为0,最终的输出只对红色通道有效。
(3)如果你想检测任意样色通道的边缘,可以把三个通道的滤波器参数设置为一样
3)如果我们希望同时检测任意角度的边缘,我们可以同时设置多组滤波器通道(每组的通道数必须与输入通道数一致),那么我们就能得到多个输出
- 每组滤波器通道可以检测一种特征
- 可以同时使用多组滤过不去通道检测特征,输出的特征数为使用的滤波器组数,通常叫做3维立方体的深度
8.单层卷积网络
1)单层卷积网络
(1)3通道输入经过两组3通道滤波器得到两组输出
(2)两组输出添加偏置b后再经过Relu**函数得到两组输出
(3)每个参数数量=3*3*3+1(偏置)=28,10组过滤器材280个参数。不论输入图片有多大,参数数量只与过滤器大小以及数量有关,这就是卷积神经网络的一个特征“避免过拟合”。
2) 输入输出数量
(1)大小表示顺序:高*宽*通道数
(2)输出大小:为向下取整符合
(3)输出图像的通道数等于这一层所使用的滤波器数量,每个滤波器的通道数等于输入层通道数
(4)权重参数数量:为当个滤波器的参数数量
9.简单卷积网络示例
1)例子
(1)通常开始时图像也要大一些,随着网络深度的加深而逐渐减少。
(2)信道数量也在增加(3->10->20->40),在许多其它卷积神经网络中也可以看到这种趋势。
10.池化层
1)卷积网络经常使用池化层来缩减模型的大小,提高计算速度,提高鲁棒性。
2) 最大池化(最常用)
(1)上图是滤波器大小为2,步长为2的池化操作
(2)输出值取滤波器滑过是对应的窗口内的最大值
(3)可以输入看作是某些特征的集合,也就是神经网络中某一层的反**值集合,数字大意味着可能提取了某些特定特征。
(4)最大化操作的功能就是只要再任何一个象限内提取到的某个特征,它都会保留在最大池化的输出里。最大化运算实际作用就是:如果在滤波器中提取到某个特征,那么保留其最大值;如果没有提取到这个特征,那么其中的最大值也还是很小。
3)池化层有两个超参数(大小和步长),但是没有需要学习的参数。
4)输出层大小
- 输入层大小:n*n*nc,nc为通道数量
- 输出层大小:((n-f)/s+1)* ((n-f)/s+1)* nc
- 每个通道的输入分别单独进行池化计算,输出层的通道数量等于输入层的通道数量
5)平均池化,另一种池化方式,不经常被使用
(1)输出值为每个滤波器对应的输入值的平均值
(2)最大池化比平均池化更常用,但在深度很深的神经网络中可以用平均池化来分解规模为7*7*1000的网络的表示层得到1*1*1000。
6)超参数
(1)常用的参数是f=2&s=2,效果相当于高度和宽度缩减一半
(2)也有使用参数f=3&s=2的情况
(3)也可以根据自己意愿增加padding其他超参数,但大部分情况下最大池化时很少用到padding
11.卷积神经网络示例
1)卷积网络文献中有两种分类,这与所谓层的划分存在一致性
(1)类一:一个卷积层和一个池化层一起作为一层
在计算网络层数时,通常只是统计具有权重和参数的层,因为池化层没有权重和参数,所以把卷积层和池化层共同作为一个卷积。
(2)类二:一个卷积层为一层,一个池化层也为一层
2) 例子
注:个人认为这里的参数数量是错误的,滤波器的每个通道都应该分别有参数,所以第一层的参数数量应该是(5*5*3+1)*8=608个。
(1)**值大小为:nh*nw*nc
(2)卷积层参数数量为:(f*f+1)* nc
(3)全连接层参数数量为:上一层**值(神经元)数量*当前层**值数量
(4)输入层和池化层没有参数
(5)卷积层参数相对较少,许多参数都存在与全连接层。
(6)随着神经网络加深,**值会逐渐变小。但如果**值下降太快也会影响网络性能。许多网络模式上也相似。
3)关于如何选定这些超参数,常规的做法是尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个别人任务中效果很好的架构,那么它可能也适用于你的程序。
4)随着神经网络深度的加深,高度和宽度通常会减少,而通道数量会增加。
5)常见的模式
(1)前面多层卷积层(卷积层+池化层),然后再几个全连接层,最后再一个softmax。
(2)另一种常见的模式就是一个或多个卷积层(卷积层+池化层)后跟随一个池化层,然后再接一个或多个卷积层,再一个池化层,然后再几个全连接层,最后再一个softmax。
12.为什么使用卷积
1)图片大小就是输入特征数量,使用传统神经网络就会有大量的参数存在,而卷积神经网络的参数只与滤波器的大小以及滤波器的数量有关,使用卷积神经网络只有少量的参数需要学习。
(1)参数这么少的原因在于
- 参数共享:特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域,所以图片的不同区域都使用同样的参数。
- 稀疏连接:卷积层输出值的每一个数值都只与滤波器滑过的对应f*f个输入值有关,类似只有这f*f个值与输出相连接,其它像素对输出没有任何影响。
2) 卷积神经网络善于捕捉平移不变,因为神经网络的卷积结构即使移动几个像素这张图片依然具有非常相似的特征,应该属于同样的输出标记。