《吴恩达深度学习》学习笔记010_卷积神经网络(Convolutional Neural Networks)
卷积神经网络(Convolutional Neural Networks)
计算机视觉(Computer vision)
缘检测示例(Edge detection example)
为什么这个可以做垂直边缘检测呢?让我们来看另外一个例子。为了讲清楚,我会用一个简单的例子。这是一个简单的6×6图像,左边的一半是10,右边一般是0。如果你把它当成一个图片,左边那部分看起来是白色的,像素值10是比较亮的像素值,右边像素值比较暗,我使用灰色来表示0,尽管它也可以被画成黑的。图片里,有一个特别明显的垂直边缘在图像中间,这条垂直线是从黑到白的过渡线,或者从白色到深色。

所以,当你用一个3×3过滤器进行卷积运算的时候,这个3×3的过滤器可视化为下面这个样子,在左边有明亮的像素,然后有一个过渡,0在中间,然后右边是深色的。卷积运算后,你得到的是右边的矩阵。如果你愿意,可以通过数学运算去验证。举例来说,最左上角的元素0,就是由这个3×3块(绿色方框标记)经过元素乘积运算再求和得到的,$10×1+10×1+10×1+10×0+10×0+10×0+10×(-1)+10×(-1)+10×(-1)=0$
。相反这个30是由这个(红色方框标记)得到的,
$10×1+10×1+10×1+10×0+10×0+10×0+0×(-1)+0×(-1)+ 0×(-1)=30$。

如果把最右边的矩阵当成图像,它是这个样子。在中间有段亮一点的区域,对应检查到这个6×6图像中间的垂直边缘。这里的维数似乎有点不正确,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个1000×1000的图像,而不是6×6的图片,你会发现其会很好地检测出图像中的垂直边缘。在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用3×3的矩阵(过滤器),所以垂直边缘是一个3×3的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素。在这个6×6图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘。
更多边缘检测内容(More edge detection)
Padding(填充)

第二个缺点时,如果你注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输出所触碰或者使用,因为它位于这个3×3的区域的一角。但如果是在中间的像素点,比如这个(红色方框标记),就会有许多3×3的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。
为了解决这些问题,你可以在卷积操作之前填充这幅图像。在这个案例中,你可以沿着图像边缘再填充一层像素。如果你这样操作了,那么6×6的图像就被你填充成了一个8×8的图像。如果你用3×3的图像对这个8×8的图像卷积,你得到的输出就不是4×4的,而是6×6的图像,你就得到了一个尺寸和原始图像6×6的图像。习惯上,你可以用0去填充,如果$p$是填充的数量,在这个案例中,$p=1$,因为我们在周围都填充了一个像素点,输出也就变成了$(n+2p-f+1)×(n+2p-f+1)$,所以就变成了$(6+2×1-3+1)×(6+2×1-3+1)=6×6$,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。
卷积步长(Strided convolutions)
在讲下一部分之前,这里有一个关于互相关和卷积的技术性建议,这不会影响到你构建卷积神经网络的方式,但取决于你读的是数学教材还是信号处理教材,在不同的教材里符号可能不一致。如果你看的是一本典型的数学教科书,那么卷积的定义是做元素乘积求和,实际上还有一个步骤是你首先要做的,也就是在把这个6×6的矩阵和3×3的过滤器卷积之前,首先你将3×3的过滤器沿水平和垂直轴翻转,所以$\begin{bmatrix}3 & 4 & 5 \ 1 & 0 & 2 \ - 1 & 9 & 7 \ \end{bmatrix}$变为$\begin{bmatrix} 7& 2 & 5 \ 9 & 0 & 4 \ - 1 & 1 & 3 \end{bmatrix}$,这相当于将3×3的过滤器做了个镜像,在水平和垂直轴上(整理者注:此处应该是先顺时针旋转90得到$\begin{bmatrix}-1 & 1 & 3 \ 9 & 0 & 4 \ 7 & 2 & 5 \end{bmatrix}$,再水平翻转得到$\begin{bmatrix} 7& 2 & 5 \ 9 & 0 & 4 \ - 1& 1 & 3 \end{bmatrix}$)。然后你再把这个翻转后的矩阵复制到这里(左边的图像矩阵),你要把这个翻转矩阵的元素相乘来计算输出的4×4矩阵左上角的元素,如图所示。然后取这9个数字,把它们平移一个位置,再平移一格,以此类推。
所以我们在这些视频中定义卷积运算时,我们跳过了这个镜像操作。从技术上讲,我们实际上做的,我们在前面视频中使用的操作,有时被称为互相关(cross-correlation)而不是卷积(convolution)。但在深度学习文献中,按照惯例,我们将这(不进行翻转操作)叫做卷积操作。
总结来说,按照机器学习的惯例,我们通常不进行翻转操作。从技术上说,这个操作可能叫做互相关更好。但在大部分的深度学习文献中都把它叫做卷积运算,因此我们将在这些视频中使用这个约定。如果你读了很多机器学习文献的话,你会发现许多人都把它叫做卷积运算,不需要用到这些翻转。

事实证明在信号处理中或某些数学分支中,在卷积的定义包含翻转,使得卷积运算符拥有这个性质,即$(AB)C=A(BC)$,这在数学中被称为结合律。这对于一些信号处理应用来说很好,但对于深度神经网络来说它真的不重要,因此省略了这个双重镜像操作,就简化了代码,并使神经网络也能正常工作。
根据惯例,我们大多数人都叫它卷积,尽管数学家们更喜欢称之为互相关,但这不会影响到你在编程练习中要实现的任何东西,也不会影响你阅读和理解深度学习文献。
现在你已经看到了如何进行卷积,以及如何使用填充,如何在卷积中选择步幅。但到目前为止,我们所使用的是关于矩阵的卷积,例如6×6的矩阵。在下一集视频中,你将看到如何对立体进行卷积,这将会使你的卷积变得更加强大,让我们继续下一个视频。
三维卷积(Convolutions over volumes)
单层卷积网络(One layer of a convolutional network)

这一部分(图中蓝色边框标记的部分)就是应用激活函数ReLU之前的值,它的作用类似于$z^{[1]}$,最后应用非线性函数,得到的这个4×4×2矩阵,成为神经网络的下一层,也就是激活层。
这就是$a{[0]}$到$a$的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差,然后应用激活函数ReLU。这样就通过神经网络的一层把一个6×6×3的维度$a{[0]}$演化为一个4×4×2维度的$a$,这就是卷积神经网络的一层。
示例中我们有两个过滤器,也就是有两个特征,因此我们才最终得到一个4×4×2的输出。但如果我们用了10个过滤器,而不是2个,我们最后会得到一个4×4×10维度的输出图像,因为我们选取了其中10个特征映射,而不仅仅是2个,将它们堆叠在一起,形成一个4×4×10的输出图像,也就是$a^{\left\lbrack1 \right\rbrack}$。
为了加深理解,我们来做一个练习。假设你有10个过滤器,而不是2个,神经网络的一层是3×3×3,那么,这一层有多少个参数呢?我们来计算一下,每一层都是一个3×3×3的矩阵,因此每个过滤器有27个参数,也就是27个数。然后加上一个偏差,用参数$b$表示,现在参数增加到28个。上一页幻灯片里我画了2个过滤器,而现在我们有10个,加在一起是28×10,也就是280个参数。
请注意一点,不论输入图片有多大,1000×1000也好,5000×5000也好,参数始终都是280个。用这10个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。你已经知道到如何提取10个特征,可以应用到大图片中,而参数数量固定不变,此例中只有28个,相对较少。
最后我们总结一下用于描述卷积神经网络中的一层(以$l$层为例),也就是卷积层的各种标记。

这一层是卷积层,用$f^{[l]}$表示过滤器大小,我们说过过滤器大小为$f×f$,上标$\lbrack l\rbrack$表示$l$层中过滤器大小为$f×f$。通常情况下,上标$\lbrack l\rbrack$用来标记$l$层。用$p{[l]}$来标记padding的数量,padding数量也可指定为一个valid卷积,即无padding。或是same卷积,即选定padding,如此一来,输出和输入图片的高度和宽度就相同了。用$s$标记步幅。
这一层的输入会是某个维度的数据,表示为$n \times n \times n_{c}$,$n_{c}$某层上的颜色通道数。
我们要稍作修改,增加上标$\lbrack l -1\rbrack$,即$n^{\left\lbrack l - 1 \right\rbrack} \times n^{\left\lbrack l -1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack}$,因为它是上一层的激活值。
此例中,所用图片的高度和宽度都一样,但它们也有可能不同,所以分别用上下标$H$和$W$来标记,即$n_{H}^{\left\lbrack l - 1 \right\rbrack} \times n_{W}^{\left\lbrack l - 1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack}$。那么在第$l$层,图片大小为$n_{H}^{\left\lbrack l - 1 \right\rbrack} \times n_{W}^{\left\lbrack l - 1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack}$,$l$层的输入就是上一层的输出,因此上标要用$\lbrack l - 1\rbrack$。神经网络这一层中会有输出,它本身会输出图像。其大小为$n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}$,这就是输出图像的大小。
前面我们提到过,这个公式给出了输出图片的大小,至少给出了高度和宽度,$\lfloor\frac{n+2p - f}{s} + 1\rfloor$(注意:($\frac{n + 2p - f}{s} +1)$直接用这个运算结果,也可以向下取整)。在这个新表达式中,$l$层输出图像的高度,即$n_{H}^{[l]} = \lfloor\frac{n_{H}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f{[l]}}{s{[l]}} +1\rfloor$,同样我们可以计算出图像的宽度,用$W$替换参数$H$,即$n_{W}^{[l]} = \lfloor\frac{n_{W}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f{[l]}}{s{[l]}} +1\rfloor$,公式一样,只要变化高度和宽度的参数我们便能计算输出图像的高度或宽度。这就是由$n_{H}^{\left\lbrack l - 1 \right\rbrack}$推导$n_{H}{[l]}$以及$n_{W}$推导$n_{W}^{[l]}$的过程。
那么通道数量又是什么?这些数字从哪儿来的?我们来看一下。输出图像也具有深度,通过上一个示例,我们知道它等于该层中过滤器的数量,如果有2个过滤器,输出图像就是4×4×2,它是二维的,如果有10个过滤器,输出图像就是4×4×10。输出图像中的通道数量就是神经网络中这一层所使用的过滤器的数量。如何确定过滤器的大小呢?我们知道卷积一个6×6×3的图片需要一个3×3×3的过滤器,因此过滤器中通道的数量必须与输入中通道的数量一致。因此,输出通道数量就是输入通道数量,所以过滤器维度等于$f^{[l]} \times f^{[l]} \times n_{c}^{\left\lbrack l - 1 \right\rbrack}$。

应用偏差和非线性函数之后,这一层的输出等于它的激活值$a{[l]}$,也就是这个维度(输出维度)。$a$是一个三维体,即$n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}{[l]}$。当你执行批量梯度下降或小批量梯度下降时,如果有$m$个例子,就是有$m$个激活值的集合,那么输出$A = m \times n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}$。如果采用批量梯度下降,变量的排列顺序如下,首先是索引和训练示例,然后是其它三个变量。
该如何确定权重参数,即参数W呢?过滤器的维度已知,为$f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]}$,这只是一个过滤器的维度,有多少个过滤器,这($n_{c}{[l]}$)是过滤器的数量,权重也就是所有过滤器的集合再乘以过滤器的总数量,即$f \times f^{[l]} \times n_{c}^{[l - 1]} \times n_{c}^{[l]}$,损失数量L就是$l$层中过滤器的个数。
最后我们看看偏差参数,每个过滤器都有一个偏差参数,它是一个实数。偏差包含了这些变量,它是该维度上的一个向量。后续课程中我们会看到,为了方便,偏差在代码中表示为一个1×1×1×$n_{c}^{[l]}$的四维向量或四维张量。

简单卷积网络示例(A simple convolution network example)
一个典型的卷积神经网络通常有三层,一个是卷积层,我们常常用Conv来标注。上一个例子,我用的就是CONV。还有两种常见类型的层,我们留在后两节课讲。一个是池化层,我们称之为POOL。最后一个是全连接层,用FC表示。虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络架构师依然会添加池化层和全连接层。幸运的是,池化层和全连接层比卷积层更容易设计。后两节课我们会快速讲解这两个概念以便你更好的了解神经网络中最常用的这几种层,你就可以利用它们构建更强大的网络了。
池化层(Pooling layers)

最大池化
平均池化
卷积神经网络示例(Convolutional neural network example)

在神经网络中,另一种常见模式就是一个或多个卷积后面跟随一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个softmax。这是神经网络的另一种常见模式。
接下来我们讲讲神经网络的激活值形状,激活值大小和参数数量。输入为32×32×3,这些数做乘法,结果为3072,所以激活值$a^{[0]}$有3072维,激活值矩阵为32×32×3,输入层没有参数。计算其他层的时候,试着自己计算出激活值,这些都是网络中不同层的激活值形状和激活值大小。

有几点要注意,第一,池化层和最大池化层没有参数;第二卷积层的参数相对较少,前面课上我们提到过,其实许多参数都存在于神经网络的全连接层。观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为6000,然后减少到1600,慢慢减少到84,最后输出softmax结果。我们发现,许多卷积网络都具有这些属性,模式上也相似。
神经网络的基本构造模块我们已经讲完了,一个卷积神经网络包括卷积层、池化层和全连接层。许多计算机视觉研究正在探索如何把这些基本模块整合起来,构建高效的神经网络,整合这些基本模块确实需要深入的理解。根据我的经验,找到整合基本构造模块最好方法就是大量阅读别人的案例。下周我会演示一些整合基本模块,成功构建高效神经网络的具体案例。
浙公网安备 33010602011771号