前言
本篇文章是吴恩达《深度学习》课程《卷积神经网络——第一周》的学习笔记。
计算机视觉
计算机视觉面临的一个挑战是图像的数据量巨大。
上述图片是计算机视觉领域的典型应用:图像分类、风格转换、目标检测。
如上图所示,神经网络第一层参数矩阵巨大,具有三十亿个参数。在这种情况下,难以获取足够的数据来防止神经网络发生过拟合和竞争需求。要处理包含三十亿参数的神经网络,巨大的内存需求让人不能接受。
边缘检测示例:
需要注意的两个点
- filter过滤器在论文中有时也称作kernel核。
- 在数学中,“*”就是卷积的标准标志,Python中表示乘法或者是元素乘法。



更多边缘检测内容:



Sobel filter的好处是增加了中间一行元素的权重,也就是处在图像中间的像素点,这使得结果的鲁棒性会更高一点。
Scharr filter也是垂直边缘检测滤波器,旋转90度得到水平边缘检测器。
上图下半部分显示,把滤波器当成参数学习,也许胜过其他滤波器,能够检测多角度边缘或者可以学习一些更低级的特征。
Padding

在没有padding时,输入图像维度为n ∗ n n*nn∗n,滤波器维度为f ∗ f f*ff∗f,那么输出图像维度为( n − f + 1 ) ∗ ( n − f + 1 ) (n-f+1)*(n-f+1)(n−f+1)∗(n−f+1)。缺点在于:每做一次卷积操作,图像就会缩小。
另外,如上图所示,原图中在角落或者边缘区域的像素点,在输出中采用较少,也就是说filter很少触碰到它们,意味着丢掉了图像边缘位置的信息。
若边缘填充像素个数表示成p,那么输出图像的维度为( n + 2 p − f + 1 ) ∗ ( n + 2 p − f + 1 ) (n+2p-f+1)*(n+2p-f+1)(n+2p−f+1)∗(n+2p−f+1)。如上图所示,在padding之后,左侧填充绿色像素点的区域(原图左上角像素)影响了右侧填充绿色的像素点。这样,角落或者边缘区域像素点在输出中采用较少的这一缺点就被削弱了。
选择多少像素进行填充,通常由两种方式,分别叫做Valid卷积和Same卷积,如下图所示:
Valid卷积意味着不填充。
Same卷积意味着填充后你的输出图像的大小和输入图像的大小是一样的。Same卷积中padding的大小p = f − 1 2 p = \frac{f-1}{2}p=2f−1。当f ff是奇数时,p pp正好是一个整数,并且在深度学习中,f ff通常都是奇数。
f ff通常为奇数的原因可能在于,一是这样不必采用不对称的填充,比如f ff是偶数时左边比右边填充的多一点;第二个原因是当你有一个奇数维过滤器,它就有一个中心点,这样便于指出过滤器的位置。
卷积步长

如上图所示,假设输入图像为n ∗ n n*nn∗n维度,filter维度为f ∗ f f*ff∗f,padding大小为p pp,stride步长为s ss,那么输出图像的维度为⌊ n + 2 p − f s + 1 ⌋ ∗ ⌊ n + 2 p − f s + 1 ⌋ \lfloor \frac{n+2p-f}{s} + 1 \rfloor * \lfloor \frac{n+2p-f}{s} + 1 \rfloor⌊sn+2p−f+1⌋∗⌊sn+2p−f+1⌋。另外,当这里的商不是整数时,我们选择向下取整。如图中所示的z zz,这也被称作对z zz进行floor divide。也就是说不要将滤波器移出图像的范围。

如上图所示,在数学中的卷积我们首先要将滤波器进行水平和垂直方向的翻转然后再做深度学习概念中的卷积操作。技术上说,深度学习的卷积,有时被称作互相关(cross-correlation)而不是卷积,但在深度学习文献中,还是把它叫做卷积。另外,图中右下角的结合律一般是在数学概念的卷积中进行应用,这对我们来说并不重要。
卷积为何有效
如下图所示,输入图像的通道数必须和过滤器的通道数匹配。
如下图所示,3 ∗ 3 ∗ 3 3*3*33∗3∗3的滤波器在左侧6 ∗ 6 ∗ 3 6*6*36∗6∗3的原始图像上移动,每层对应像素做乘积求和操作,再把对应三层的结果相加,即得到最右侧的输出。
使用3 ∗ 3 ∗ 3 3*3*33∗3∗3的滤波器可以使我们只关心RGB其中某个通道,也可以使用它们全部的信息,如图中右下方所示。注意,最后的输出图像维度为4 ∗ 4 ∗ 1 4*4*14∗4∗1。
如下图所示,我们可以对一幅图像使用多个滤波器。维度变化总结为图像下方的公式:当步长为1,且没有padding的时候,输入图像维度为n ∗ n ∗ n c n*n*n_cn∗n∗nc,滤波器维度为f ∗ f ∗ n c f*f*n_cf∗f∗nc,那么输出图像为( n − f + 1 ) ∗ ( n − f + 1 ) ∗ n c ′ (n-f+1)*(n-f+1)*n_c'(n−f+1)∗(n−f+1)∗nc′,其中n c ′ n_c'nc′为滤波器个数,n c n_cnc为输入图像通道数(在一些文献中也称为深度,为避免和神经网络的深度混淆,吴恩达视频中都用通道数来称呼)。
单层卷积网络
有几个filter,就有几个特征映射。
各变量的维度如下图所示,注意右下角A [ l ] A^{[l]}A[l]下的花括号表示有的文献或代码中会把图像通道数放在高度和宽度之前。另外,A [ l ] A^{[l]}A[l]计算公式中的m mm表示样本个数。
简单卷积网络示例
如下图所示是一个简单的神经网络示例。像图中一样,卷积神经网络实现一般有个趋势是图像的高和宽不断减小,而深度不断增加。图中右下角是将7 ∗ 7 ∗ 40 7*7*407∗7∗40的图像展开成一个长向量,然后利用logistic或softmax激活得到最后的预测值y ^ \hat yy^。
如下图所示,一个典型的卷积神经网络通常会包含三种层,卷积层、池化层、全连接层,括号里是它们的简写。
池化层
卷积神经网络通常也会使用池化层,来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。
如上图所示是一个max pooling层,相当于有一个f = 2 , s = 2 f = 2, s = 2f=2,s=2的filter。最大化运算的实际作用是,如果在过滤器中提取到某个特征,那么保留其最大值;如果没有提取到这个特征,比如在上图右上象限中就不存在这个特征,那么其中的最大值也还是很小,这是对max pooling的直观理解。
如上图所示,池化层的超参数都是确定的,反向传播过程中没有什么超参数可以学习。它的维度计算法则和卷积的维度计算是一致的。
如上图所示,是一个平均池化的例子,在神经网络中,最大池化要用的比较多,平均池化用的比较少,除非是在比较深的网络中,例如我们可以对7 ∗ 7 ∗ 1000 7*7*10007∗7∗1000的图像利用全局平均池化得到1 ∗ 1 ∗ 1000 1*1*10001∗1∗1000的图像。
如上图所示,池化层常用的超参数一般是f ff和s ss,且常用的设置是f = 2 , s = 2 f=2, s=2f=2,s=2,这相当于输入图像的高和宽缩小了一半,并且一般我们是没有padding超参数的,也就是p=0。pooling没有参数需要学习。
卷积神经网络示例

如上图所示,是一个卷积神经网络的示例。图片下方展示的是常用的卷积神经网络结构,即重复卷积、池化,最后执行全连接和激活函数。
另外一点值得说明的是,吴恩达将一个卷积层和一个池化层合在一起称作一个layer,根据是这里只有卷积层是有权重和参数,而池化层没有。当然,有的文献中也会把卷积层和池化层当做两个layer。通常我们计算神经网络的层时只算入有权重和参数的层。
如上图所示,是本节第一张图中各层的参数数量(注意CONV1、POOL1的通道数和本节第一张图有所出入)。
有几点需要注意:
(1) 池化层没有参数
(2) 卷积层的参数相对较少,大部分参数都存在于神经网络的全连接层
(3) 随着神经网络的加深,activation size会逐渐减小,但如果它下降太快,也会影响神经网络的性能
为什么使用卷积
如下图所示,和只用全连接层相比,卷积层的两个主要优势在于参数共享(parameter sharing)和稀疏连接(sparsity of connections)。
图中下半部分表示,全连接层需要一千四百万个参数,而卷积层(含偏置)只需要156个参数(实际应该为5x5x3x6+6=456个参数,吴恩达没有考虑filter的通道)。

如上图所示,参数共享含义在于:如果一个特征检测(例如垂直边缘检测)适用于图片的一个区域,那么它很有可能也适用于图片的其他区域。
稀疏连接的含义在于:原图中左上角的9个像素经过卷积后转换为右侧图中左上角的一个值,原图中除了那9个像素之外的其他像素不参与计算。也就是每个输出值只取决于一小部分的输入。
卷积神经网络通过这两种机制使我们可以使用更小的训练集训练它,从而预防过拟合。
另外,卷积神经网络善于捕捉平移不变(translation invariance),比如图片中的猫向右平移两个像素,图片中的猫依然清晰可见。因为神经网络的卷积结构,即使移动几个像素,这张图片依然具有非常相似的特征,应该属于同样的输出标记。实际上, 用同一个滤波器生成的各层中,图片的所有像素值,希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性。
卷积神经网络的训练如上图所示,和普通的神经网络一样,我们可以设计自己的成本函数,然后使用梯度下降法来优化参数降低成本函数值。