吴恩达CS230深度学习笔记(四)

2020-02-13

涉及 卷积神经网络。

前言:因为CNN我用的不多,也不感兴趣,所以会减少篇幅。

卷积神经网络

卷积Conv

常用的边缘检测过滤器:$\begin{bmatrix}1 & 0 & - 1 \ 2 & 0 & - 2 \ 1 & 0 & - 1 \end{bmatrix}$,叫做Sobel的过滤器,$\begin{bmatrix} 3& 0 & - 3 \ 10 & 0 & - 10 \ 3 & 0 & - 3\ \end{bmatrix}$,叫做Scharr过滤器。

卷积操作,就是这么回事,卷积核依次滑过,得到每个单元的结果。如果我们有一个$n×n​$的图像,用$f×f​$的过滤器做卷积,那么输出的维度就是$(n-f+1)×(n-f+1)​$。卷积神经网络善于捕捉平移不变。

这样的话会有两个缺点,第一个缺点是每次做卷积操作,你的图像就会缩小;第二个缺点时,如果你注意角落边缘的像素,四个顶点的像素点只被一个输出所触碰或者使用。但如果是在中间的像素点,就会有许多的卷积区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。

为了解决这些问题,你可以在卷积操作之前填充这幅图像,也就是padding操作。习惯上,你可以用0去填充,如果$p$是填充的数量,比如$p=1$,因为我们在周围都填充了一个像素点,输出也就变成了$(n+2p-f+1)×(n+2p-f+1)$。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。

至于选择填充多少像素,通常有两个选择,分别叫做Valid卷积和Same卷积。Valid卷积意味着不填充,这样的话,如果你有一个$n×n$的图像,用一个$f×f$的过滤器卷积,它将会给你一个$(n-f+1)×(n-f+1)$维的输出。另一个经常被用到的填充方法叫做Same卷积,那意味你填充后,你的输出大小和输入大小是一样的。根据这个公式$n-f+1$,当你填充$p$个像素点,$n$就变成了$n+2p$,最后公式变为$n+2p-f+1$。因此如果你有一个$n×n$的图像,用$p$个像素填充边缘,输出的大小就是这样的$(n+2p-f+1)×(n+2p-f+1)$。如果让$n+2p-f+1=n$的话,使得输出和输入大小相等,如果你用这个等式求解$p$,那么$p=(f-1)/2$。所以当$f$是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。

卷积中的步幅是另一个构建卷积神经网络的基本操作,指卷积核每次移动的长度。如果你用一个$f×f$的过滤器卷积一个$n×n$的图像,你的padding为$p$,步幅为$s$,输出于是变为$\frac{n+2p - f}{s} + 1 \times \frac{n+2p - f}{s} + 1$。卷积有很多种标记方法,这是我们最常用的卷积符号。关于高度,宽度和通道的顺序并没有完全统一的标准卷积。本文主要按照高度、宽度和通道损失数量的顺序来计算。

如果商不是一个整数怎么办?在这种情况下,我们向下取整。$⌊z⌋$这是向下取整的符号,这也叫做地板除(floor),这意味着$z$向下取整到最近的整数。这个原则实现的方式是,你只在卷积核完全在图像内或填充之后的图像内部时,才对它进行运算。如果有任意一个卷积核单元移动到了外面,那你就不要进行相乘操作,这是一个惯例。因此正确计算输出维度的方法是向下取整,以免$\frac{n + 2p - f}{s}$不是整数。

多层卷积,无非就是把卷积核的维数++,不再赘述。在卷积网络层中,用$f^{[l]}$表示过滤器大小,我们说过过滤器大小为$f×f$,上标$\lbrack l\rbrack$表示$l$层中过滤器大小为$f×f$。通常情况下,上标$\lbrack l\rbrack$用来标记$l$层。用$p^{[l]}$来标记padding的数量,用$s^{[l]}$标记步幅。每一层$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}$,为上一层的激活值,输出大小为$n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]}$,其中$n_{H}^{[l]} = \lfloor\frac{n_{H}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f^{[l]}}{s^{[l]}} +1\rfloor$,$n_{W}^{[l]} = \lfloor\frac{n_{W}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f^{[l]}}{s^{[l]}} +1\rfloor$。过滤器中通道的数量必须与输入中通道的数量一致。因此,输出通道数量就是输入通道数量,所以过滤器维度等于$f^{[l]} \times f^{[l]} \times n_{c}^{\left\lbrack l - 1 \right\rbrack}$。$f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]}$只是一个过滤器的维度,$n_{c}^{[l]}$则是过滤器的数量。

卷积层的参数就是卷积核的单元总数加上偏置数,比如每个过滤器都是5×5,一个过滤器有25个参数,再加上偏差参数,那么每个过滤器就有26个参数,一共有6个过滤器,所以参数共计156个。卷积网络映射这么少参数有两个原因:一是参数共享。整张图片共享特征检测器,每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取特征。它不仅适用于低阶特征,同样适用于高阶特征。第二个是稀疏链接。某一个位置的输出值$o$只和与它相关的$f×f$个元素相连接,而其他的$n×n-f×f$个元素不会对输出产生影响,这就是稀疏连接的概念。神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。

池化Pooling

除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。

MaxPooling操作的功能就是只要在任何一个象限内提取到某个特征,它都会保留在最大化的池化输出里。所以MaxPooling的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,可能在右上象限中不存在这个特征,那么其中的最大值也还是很小,这就是最大池化的直观理解。

一个有意思的特点就是,它有一组超参数,但并没有参数需要学习。实际上,梯度下降没有什么可学的,一旦确定了$f$和$s$,它就是一个固定运算,梯度下降无需改变任何值。之前讲的计算卷积层输出大小的公式同样适用于最大池化,即$\frac{n + 2p - f}{s} + 1$,这个公式也可以计算最大池化的输出大小。

另外还有一种类型的池化,平均池化,它不太常用。我简单介绍一下,这种运算顾名思义,选取的不是每个过滤器的最大值,而是平均值。在很深的神经网络中,可以用平均池化来分解规模到一个小的网络表示层。池化的超级参数包括过滤器大小$f$和步幅$s$,最大池化时,往往很少用到超参数padding。需要注意的一点是,池化过程中没有需要学习的参数。执行反向传播时,反向传播没有参数适用于最大池化。只有这些设置过的超参数,可能是手动设置的,也可能是通过交叉验证设置的。

注意:池化层没有参数。

有几个经典的深度卷积网络:LeNet-5、AlexNet和VGGNet,还有目标检测,因为不搞CV,不看了。

【原文出自黄海广博士 deeplearning_ai_books

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者,更多文章请访问想飞的小菜鸡