吴恩达Coursera深度学习课程 deeplearning.ai (4-1) 卷积神经网络--课程笔记
本课主要讲解了卷积神经网络的基础知识,包括卷积层基础(卷积核、Padding、Stride),卷积神经网络的基础:卷积层、池化层、全连接层。
主要知识点
- 卷积核: 过滤器,各元素相乘再相加
- nxn * fxf -> (n-f+1)x(n-f+1)
- Padding: nxn * fxf –> (n+2p-f+1)x(n+2p-f+1)
- Stride: nxn * fxf –> ((n+2p-f)/s+1)x((n+2p-f)/s+1)
- 立体卷积:nxnxc: 原图像与卷积核渠道深度一致,立体各项乘积相加,卷积得平面
- 多核卷积:多个卷积核卷积后得多个平面,拼成一个立体
- 卷积层相当于全连接中的 Wx+b
- 卷积层:卷积核是一个立体块
- 池化层:每个通道单独池化,常见的有max,avg等
- 全连接层
1.1 计算机视觉
计算机视觉(Computer Vision)包含很多不同类别的问题,如图片分类、目标检测、图片风格迁移等等。
对于小尺寸的图片,例如 64 * 64, 我们输入数据的维度为 64 * 64 * 3 = 12288,可以用全连接神经网络进行学习。
对于稍大的图片,例如 1000 * 1000, 输入数据的维度1000 * 1000 * 3 = 3000000, 如果第一个隐藏层有1000个节点,则 W 矩阵是(1000, 3000000)的维度,需要学习的参数相当多;如此数据量对内存也造成极大的压力,这个时候全连接的神经网络就不再适合了。
卷积神经网络在计算机视觉问题上是一个非常好的网络结构。
1.2 边缘检测示例
卷积运算是将图片通过卷积核运算识别出另一张图片的过程,是卷积神经网络的基本组成部分。
边缘检测就是检测出图片的边缘来突出显示,而非边缘的地方都不突出显示。
在下面的图中,分别通过垂直边缘检测和水平边缘检测得到不同的结果:
垂直边缘检测
假设对于一个 6×6 大小的灰度图片(6x6x1),以及一个 3×3 大小的 filter(卷积核) 进行卷积运算,以“∗”符号表示。图片和垂直边缘检测器分别如左和中矩阵所示:
filter 不断地和其大小相同的部分做对应元素的乘法运算并求和,最终得到的数字相当于新图片的一个像素值,如右矩阵所示,最终得到一个 4×4 大小的图片。
边缘检测的原理
通过上述卷积核可以看出,图片左右灰度变化不大时,卷积后相互抵消,当左右灰度变化较大时,也就是存在垂直分界线时,卷积后的值将很大或者很小(从明到暗则正,从暗到名则负);而上下的色差没有抵消,不会改变,所以是垂直边缘检测。
1.3 更多边缘检测内容
更多垂直边缘检测的卷积核(filter)
1.4 Padding
没有Padding的缺点
- 每次卷积图片会变小
- 6x6 * 3x3 –> 4x4
- nxn * fxf –> (n-f+1)x(n-f+1)
- 边角元素进行卷积运算的次数少,可能会丢失有用信息。
其中n表示原图片长/宽,f表示filter(卷积核)的长/宽
加Padding
扩充外边界,填充元素,通常以0填充,可以保持图片不变
Padding的两种方式
- Valid: 没有Padding
- nxn * fxf –> (n-f+1)x(n-f+1)
- Same: 保持图片大小不变的Padding
- nxn * fxf –> (n+2p-f+1)x(n+2p-f+1)
- n: 图片长/宽; f: filter长/宽; p: 每侧填充大小
- 由于图片大小不变: n+2p-f+1 = n, 所以 p = (f-1)/2
filter 一般为奇数(奇数有中心点,且填充比较对称)
1.5 卷积步长(stride)
前面的例子中使用的 stride=1,每次的卷积运算以1个步长进行移动。下面是 stride=2 时对图片进行卷积的结果:
移动的窗口落在图片外面时,则不要再进行相乘的操作,所以输出图片的最终维度为向下取整。
1.6 立体卷积
- 灰度图像,只有一个灰度通道,图像维度是nxn的(二维平面)
- 彩色图像,有RGB三个通道,图像维度是nxnx3的(三维立体)
立体卷积
立体图像通道数(深度)为n_c, 那么卷积核的通道数(深度)也必须为n_c(原图像和卷积核深度必须一致),计算的时候为立体的各项之和。相当于有深度卷积核在有深度的图像上做平面移动,得出的结果仍然是一个平面。
小技巧
可以计算部分通道上的垂直分界线:只需把卷积核的相应通道层设置为垂直分界卷积核,其他通道的卷积核填充0即可。
多核卷积
卷积核可以提取图片的特征,同时利用多个卷积可以同时提取不同的特征,这些特征都是二维的图像,将多个卷积核的结果叠加构成一个深度为卷积核个数的三维图像。
多核卷积的维度
n×n×n_c ∗ f×f×n_c —-> (n−f+1) × (n−f+1) × (n′_c)
其中:n_c 表示通道数,n’_c 表示有多少个卷积核(同时提取的特征数)
1.7 单层卷积网络
和普通的神经网络单层前向传播的过程类似,卷积神经网络也是一个先由输入和权重及偏置做线性运算,然后得到的结果输入一个**函数中,得到最终的输出
z = wx + b
a = g(z)
不同点是在卷积神经网络中,权重和输入进行的是卷积运算。
- A[l-1]:原始图像为输入
- W[l]:卷积核, 多个卷积核构成W(1), W(2)。。。 共同构成W[l]
- 卷积核的个数相当于该层的节点个数
- W[l]A[l-1]:此处为卷积运算
- Z[l] = W[l]A[l-1] + b: 线性部分输出,b的维度和卷积核的个数相等。
- A[l] = relu(Z[l]), 多个卷积核拼到一起构成下一级的输入
- 上层卷积核的个数(该层节点数) –> A[l]的通道数 –> 下层的输入
单层卷积的参数个数
卷积核的(长x宽x高x个数)+个数: W + b
不管图片多么复杂,参数的个数只与卷积核有关,相当于 W+b
总结
1.8 简单卷积网络示例
多层卷积构成卷积神经网络,下面是一个卷积神经网络的例子:
卷积网络层的类型
- 卷积层(Convolution),CONV;
- 池化层(Pooling),POOL;
- 全连接层(Fully connected):FC;
1.9 池化层
选取每个部分的代表,缩小图片。
- 池化运算:每个通道单独计算,最后得到具有n个通道的3维图片
- 卷积运算:所有通道看成一个整体同时运算,最后得到只有一个通道的2维图片
池化的超参数:和卷积一样
- f: filter
- s: stride
- s: padding,几乎很少使用Padding
池化层只是一个静态层,不需要学习
最大池化选最大值,平均池化选平均值值。
1.10 卷积神经网络示例
以识别0-9九个数字的图片为例,给出一个完整的卷积神经网络
- 完整的卷积神经网络组成
- 一个或几个卷积层Conv+池化层Pool –>
- 一个或几个卷基层Conv+池化层Pool –>
- … –>
- 全连接层FC –>
- 全连接层FC –>
- … –>
- softmax
- 随着网络的深度增加,图片长/宽会越来越小,但通道数量会越来越多
卷积神经网络的参数
- 输入层和池化层没有参数
- 卷积层有比较少的参数(卷积核的参数)
- 全连接层有大量的参数(W,b)
1.11 为什么使用卷积
- 参数共享:一个特征检测器(filter)对图片的一部分有用的同时也有可能对图片的另外一部分有用。
- 连接的稀疏性:在每一层中,每个输出值只取决于少量的输入。
-
善于捕捉平移不变:图片移动几个像素或者改变几个像素对卷积神经网络的结果变化不大,也就是具有很强的鲁棒性。