吴恩达卷积神经网络章节笔记(一)——卷积神经网络


视频课程链接:
https://www.bilibili.com/video/BV1FT4y1E74V?
笔记参考链接:
https://blog.csdn.net/weixin_36815313/article/details/105728919

1. 边缘检测示例 (Edge Detection Example)

1.1 卷积运算

卷积运算是卷积神经网络最基本的组成部分。
在这里插入图片描述

假设有一张 6 6 6× 6 6 6的灰度图像。因为是灰度图像,即没有RGB三通道,所以它是 6 6 6× 6 6 6× 1 1 1的矩阵(如上图)。为了检测图像中的垂直边缘,你可以构造一个 3 3 3× 3 3 3矩阵。在卷积神经网络的术语中,它被称为过滤器(filter),或者也被称为核(kernel)
在这里插入图片描述

假设构造一个 3 3 3× 3 3 3的过滤器(如上图),对上述的 6 6 6× 6 6 6的图像进行卷积运算,卷积运算用 ∗ * 来表示。
在这里插入图片描述

这个卷积运算的输出将会是一个 4 4 4× 4 4 4的矩阵,你可以将它看成一个 4 4 4× 4 4 4的图像(如上图)。
在这里插入图片描述

首先计算 4 4 4× 4 4 4矩阵中第一个元素,使用 3 3 3× 3 3 3的过滤器,将其覆盖在输入图像,然后进行元素乘法(element-wise products)运算,即 [ 3 × 1 0 × 0 1 × ( − 1 ) 1 × 1 5 × 0 8 × ( − 1 ) 2 × 1 7 × 0 2 × ( − 1 ) ] = [ 3 0 − 1 1 0 − 8 2 0 − 2 ] \left[ \begin{matrix} 3×1 & 0×0 & 1×(-1)\\ 1×1 & 5×0 & 8×(-1)\\ 2×1 & 7×0 & 2×(-1)\\ \end{matrix} \right]=\left[ \begin{matrix} 3 & 0 & -1\\ 1 & 0 & -8\\ 2 & 0 & -2\\ \end{matrix} \right] 3×11×12×10×05×07×01×(1)8×(1)2×(1)=312000182,最后将该矩阵每个元素相加得到最左上角的元素,即 3 + 1 + 2 + 0 + 0 + 0 + ( − 1 ) + ( − 8 ) + ( − 2 ) = − 5 3+1+2+0+0+0+(-1)+(-8)+(-2)=-5 3+1+2+0+0+0+(1)+(8)+(2)=5
在这里插入图片描述

接下来计算第二个元素,因此要把 3 3 3× 3 3 3的过滤器向右移动一步(如上图)。继续做同样的元素乘法,然后加起来,即 0 × 1 + 5 × 1 + 7 × 1 + 1 × 0 + 8 × 0 + 2 × 0 + 2 × ( − 1 ) + 9 × ( − 1 ) + 5 × ( − 1 ) = − 4 0×1+5×1+7×1+1×0+8×0+2×0+2×(−1)+9×(−1)+5×(−1)=−4 0×1+5×1+7×1+1×0+8×0+2×0+2×(1)+9×(1)+5×(1)=4。然后继续将 3 3 3× 3 3 3的过滤器右移,直到计算完这一行的元素。
在这里插入图片描述

接下来为了计算下一行的元素,将 3 3 3× 3 3 3的过滤器下移(如上图)。重复进行元素乘法,然后加起来。通过计算得到 − 10 -10 10。以此类推,从而计算得到矩阵中的其他元素。
在这里插入图片描述

因此 6 6 6× 6 6 6矩阵和 3 3 3× 3 3 3矩阵进行卷积运算得到 4 4 4× 4 4 4矩阵。这些图片和过滤器是不同维度的矩阵,但左边矩阵容易被理解为一张图片,中间的这个被理解为过滤器,右边的图片我们可以理解为另一张图片。这个就是垂直边缘检测器

1.2 垂直边缘检测器的应用案例

在这里插入图片描述

上图是一个简单的 6 6 6× 6 6 6图像,左边一半的像素值是10,右边一半的像素值是0。如果将它看成一个图片,左边像素值为10的部分比较亮,右边像素值为0的部分则比较暗。图片中间有一个特别明显的垂直边缘,这条垂直线是从黑到白的过渡线。
当你使用上图中的 3 3 3× 3 3 3过滤器进行卷积运算,这个 3 3 3× 3 3 3的过滤器可视为这样一张图片,左边较为明亮,中间有一个过渡,颜色与左边相比较深,然后右边是深色的。
在这里插入图片描述

经过卷积运算后,得到右边的矩阵。如果把这个 4 4 4× 4 4 4矩阵当成图像,可以看到在中间有一段较亮的区域,两边是较深的区域,表示在图像中间有一个特别明显的垂直边缘。

2. 更多边缘检测内容 (More Edge Detection Example)

计算机视觉中, 3 3 3× 3 3 3过滤器的几种常规数字组合:

  • 垂直边缘过滤器: [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \left[ \begin{matrix} 1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\\ \end{matrix} \right] 111000111
  • 水平边缘过滤器: [ 1 1 1 0 0 0 − 1 − 1 − 1 ] \left[ \begin{matrix} 1 & 1 & 1\\ 0 & 0 & 0\\ -1 & -1 & -1\\ \end{matrix} \right] 101101101
  • Sobel过滤器:它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。 [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \left[ \begin{matrix} 1 & 0 & -1\\ 2 & 0 & -2\\ 1 & 0 & -1\\ \end{matrix} \right] 121000121
  • Scharr过滤器: [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \left[ \begin{matrix} 3 & 0 & -3\\ 10 & 0 & -10\\ 3 & 0 & -3\\ \end{matrix} \right] 31030003103

在深度学习中,我们需要做的就是,把这矩阵中的9个数字当成9个参数,并且使用反向传播算法,让神经网络学习任何它所需要的 3 3 3× 3 3 3的过滤器,并在整幅图片上应用它,其目标就是去理解这9个参数。

3. Padding

为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是padding
在前一章节的例子中,如果用一个 3 3 3× 3 3 3的过滤器卷积一个 6 6 6× 6 6 6的图像,最后会得到一个 4 4 4× 4 4 4的输出,也就是一个 4 4 4× 4 4 4矩阵。那是因为 3 3 3× 3 3 3的过滤器在 6 6 6× 6 6 6的矩阵中,只可能有4×4种可能的位置。这背后的数学解释是,如果我们有一个 n n n× n n n的图像,用 f f f× f f f的过滤器做卷积,那么输出图像的维度就是 ( n − f + 1 ) (n-f+1) (nf+1)× ( n − f + 1 ) (n-f+1) (nf+1)
但是在这过程中存在如下两个缺点:
⒈缺点一:输出缩小

  • 每次进行卷积运算,输出图像就会缩小,比如上个例子中从 6 6 6× 6 6 6缩小到 4 4 4× 4 4 4。假如有一个深层的神经网络,图像每经过一层都缩小的话,就会得到一张很小的图片。

⒉缺点二:图像边缘的信息丢失

  • 6 6 6× 6 6 6的图像中看到,角落边缘的像素(绿色阴影标记)只被 3 3 3× 3 3 3的过滤器卷积过一次,即在输出中仅使用过一次,因为它位于这个 3 3 3× 3 3 3的区域的一角。但如果是在中间的像素点(红色方框标记),就会有许多 3 3 3× 3 3 3的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,也意味着丢失了图像边缘位置的许多信息。
    在这里插入图片描述

为了解决以上两种问题,通常有如下的解决方法:

  • 在卷积操作之前填充(padding)这幅图像。你可以沿着图像边缘再填充一层像素,那么 6 6 6× 6 6 6的图像就被填充成了一个 8 8 8× 8 8 8的图像。这时如果使用 3 3 3× 3 3 3的过滤器对这个 8 8 8× 8 8 8的图像卷积,就得到了一个输出尺寸和原始图像相同的 6 6 6× 6 6 6的图像。一般情况下可以用像素值0去填充。
    在这里插入图片描述

因为我们在周围都填充了一个像素点,则填充的数量 p = 1 p=1 p=1,输出的尺寸大小也就变成了 ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)× ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)。这样一来,角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。
实际上还可以填充更多像素,至于选择填充多少像素,通常有两个选择,分别叫做Valid卷积Same卷积

  • Valid卷积 —— 不填充。如果有一个 n n n× n n n的图像,用一个 f f f× f f f的过滤器卷积,将会得到一个 ( n − f + 1 ) (n-f+1) (nf+1)× ( n − f + 1 ) (n-f+1) (nf+1)维的输出。
  • Same卷积 —— 填充后,输出大小和输入大小相同。如果你有一个 n n n× n n n的图像,用 p p p个像素填充边缘,输出的大小就是 ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)× ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)。因此如果想让 n + 2 p − f + 1 = n n+2p-f+1=n n+2pf+1=n的话,使得输出和输入大小相等,那么 p = ( f − 1 ) / 2 p=(f-1)/2 p=(f1)/2

习惯上,计算机视觉中, f f f通常是奇数。这可能有如下几个原因:

  1. 如果 f f f是一个偶数,那么你只能使用一些不对称填充。只有 f f f是奇数的情况下,Same卷积才会有自然的填充。我们才能以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。
  2. 当你有一个奇数维度的过滤器,比如 3 3 3× 3 3 3 5 5 5× 5 5 5,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更加便于指出过滤器的位置。

4. 卷积步长 (Strided Convolutions)

卷积中的步幅(stride)是另一个构建卷积神经网络的基本操作。
在这里插入图片描述

假设使用一个 3 3 3× 3 3 3的过滤器来卷积这个 7 7 7× 7 7 7的图像,和之前一样取左上方的 3 3 3× 3 3 3区域的元素的乘积再求和,最后结果为91。
在这里插入图片描述

和之前不同的是,我们把步幅(stride)设置成了2。因此接下来把 3 3 3× 3 3 3的过滤器向右移动两步,将每个元素相乘并求和,得到的结果是100。
在这里插入图片描述

然后继续将 3 3 3× 3 3 3的过滤器移动两个步长,计算得到结果83。

在这里插入图片描述

完成第一行之后,再移动到下一行,此时也是移动两个步长(如上图)。同样的,将元素相乘并求和,得到结果69。
在这里插入图片描述

以此类推,最终得到一个 3 3 3× 3 3 3的输出(如上图)。如果使用一个 f f f× f f f的过滤器卷积一个 n n n× n n n的图像,padding p p p步幅 s s s,那么输出的尺寸大小为 ⌊ n + 2 p − f s + 1 × n + 2 p − f s + 1 ⌋ \lfloor \frac{n+2p-f}{s}+1×\frac{n+2p-f}{s}+1 \rfloor sn+2pf+1×sn+2pf+1
注:符号 ⌊ ⌋ \lfloor \rfloor 表示向下取整,即如果遇到计算出来的商不是整数,则向下取整。

5. 三维卷积 (Convolutions Over Volumes)

前面章节讲的是对二维图像进行卷积,这一章节则是对三维立体进行卷积操作。

5.1 三维卷积的计算

在这里插入图片描述

假设有一张 6 6 6× 6 6 6× 3 3 3的RGB彩色图像,这里的 3 3 3指的是三个颜色通道。为了检测图像的边缘或者其他的特征,使用一个 3 3 3× 3 3 3× 3 3 3的过滤器进行卷积,这个过滤器也有三层,分别对应红、绿、蓝三个通道。
在这里插入图片描述

为了计算这个卷积操作的输出,你要做的就是把这个 3 3 3× 3 3 3× 3 3 3的过滤器先放到最左上角的位置,这个 3 3 3× 3 3 3× 3 3 3的过滤器有27个数,依次取这27个数,乘以输入图像中对应通道的数字,即先取红色通道的前9个数字,乘以输入图像中对应的红色通道的9个数字,然后取绿色通道的9个数字,乘以输入图像中对应的绿色通道的9个数字,最后取蓝色通道的9个数字,乘以输入图像中对应的绿色通道的9个数字,分别乘以输入图像中对应的蓝色通道的9个数字,然后把这些数相加,就得到了输出的第一个数字。
在这里插入图片描述

然后把这个立方体滑动一个单位,再将27个数与之对应的3个通道中的数字相乘并相加,就得到了下一个输出,以此类推。

5.2 多个过滤器的三维卷积

在实际图像处理中,仅靠单个过滤器很难将复杂的图像特征进行充分提取。因此通常而言,我们用来进行卷积的过滤器远不止一个。
在这里插入图片描述

我们用第一个过滤器进行卷积得到一个 4 4 4× 4 4 4的输出,然后用第二个过滤器进行卷积又得到一个4×4的输出,将第二个输出放到第一个输出后面,从而形成了一个4×4×2的输出,这里的2表示滤波器的个数。
总的来说,如果你有一个 n n n× n n n× n c n_c nc的输入图像,卷积上一个 f f f× f f f× n c n_c nc的过滤器,然后就得到了一个 ( n − f + 1 ) (n−f+1) (nf+1)× ( n − f + 1 ) (n−f+1) (nf+1)× n c ′ n_{c^{'}} nc 输出图像,这里 n c ′ n_{c^{'}} nc表示过滤器的个数,也表示下一层的通道数。
注:这里假设步幅为1,并且没有padding

6. 单层卷积网络 (One Layer of a Convolutional Network)

6.1 单层卷积网络的简单案例

在这里插入图片描述

以上一章节中的例子来说,使用两个过滤器卷积处理一个三维图像,输出两个不同的4×4矩阵。首先对第一个输出增加偏差 b 1 b_1 b1(这里 b 1 b_1 b1是一个实数),然后应用非线性激活函数(这里使用ReLu函数),输出结果是一个 4 4 4× 4 4 4的矩阵。
对于第二个输出增加不同的偏差 b 2 b_2 b2(这里 b 2 b_2 b2是一个实数),然后应用非线性激活函数(这里使用ReLu函数),最终得到另一个 4 4 4× 4 4 4的矩阵。然后将这两个矩阵堆叠起来,最终得到一个 4 4 4× 4 4 4× 2 2 2的矩阵。
单层卷积神经网络中的前向传播过程:
(1) z [ l ] = w [ l ] a [ l − 1 ] + b [ l ] z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]} z[l]=w[l]a[l1]+b[l]
(2) a [ l ] = g ( z [ l ] ) a^{[l]}=g(z^{[l]}) a[l]=g(z[l])
其中 w [ l ] a [ l − 1 ] w^{[l]}a^{[l-1]} w[l]a[l1]对应的是 6 6 6× 6 6 6× 3 3 3的输入图像与 3 3 3× 3 3 3× 3 3 3的过滤器卷积得到的 4 4 4× 4 4 4的输出矩阵, z [ l ] z^{[l]} z[l]对应的是增加了偏置的 4 4 4× 4 4 4的输出矩阵(如下图)。
在这里插入图片描述

这就是 a [ l ] a^{[l]} a[l] a [ l + 1 ] a^{[l+1]} a[l+1]的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差,然后应用激活函数ReLU。这样就通过神经网络的一层把一个 6 6 6× 6 6 6× 3 3 3的维度 a [ 0 ] a^{[0]} a[0]演化为一个 4 4 4× 4 4 4× 2 2 2维度的 a [ 1 ] a^{[1]} a[1],这就是卷积神经网络的一层。
假设每一层都是 3 3 3× 3 3 3× 3 3 3的过滤器,因此每个过滤器有27个参数,再加上一个偏差 b b b,一共有28个参数。现在我们有10个 3 3 3× 3 3 3× 3 3 3的过滤器,加在一起是28×10,也就是280个参数。
不论输入图片有多大,参数始终都是280个。用这10个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作避免过拟合

6.2 符号定义

以卷积神经网络中的第 l l l层卷积层为例,定义卷积层的各种标记。

  • f [ l ] f^{[l]} f[l]表示第 l l l层过滤器的大小;
  • p [ l ] p^{[l]} p[l]表示第 l l lpadding的数量,padding数量可指定为valid卷积,即无padding,也可指定same卷积,即选定padding
  • s [ l ] s^{[l]} s[l]表示第 l l l层的步幅
  • l l l层的输入图像的维度为 n H [ l − 1 ] n^{[l-1]}_H nH[l1]× n W [ l − 1 ] n^{[l-1]}_W nW[l1]× n c [ l − 1 ] n_c^{[l-1]} nc[l1],它是上一层的激活值;
  • l l l层的输出图像的维度为 n H [ l ] n^{[l]}_H nH[l]× n W [ l ] n^{[l]}_W nW[l]× n c [ l ] n_c^{[l]} nc[l]
  • n H [ l ] n^{[l]}_H nH[l]表示第 l l l层输出图像的高度,即 n H [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_H^{[l]}=\lfloor\frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nH[l]=s[l]nH[l1]+2p[l]f[l]+1
  • n W [ l ] n_W^{[l]} nW[l]表示第 l l l层输出图像的宽度,即 n W [ l ] = ⌊ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_W^{[l]}=\lfloor\frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nW[l]=s[l]nW[l1]+2p[l]f[l]+1
  • n c [ l ] n_c^{[l]} nc[l]表示输出图像的通道数。
  • 单个过滤器的维度是 f [ l ] f^{[l]} f[l]× f [ l ] f^{[l]} f[l]× n c [ l − 1 ] n_c^{[l-1]} nc[l1],过滤器中的通道数必须与输入图像中的通道数一致;
  • 对于单个样本而言,激活值 a [ l ] a^{[l]} a[l]是一个三维体,其维度是 n H [ l ] n_H^{[l]} nH[l]× n W [ l ] n_W^{[l]} nW[l]× n c [ l ] n_c^{[l]} nc[l];对于 m m m个样本,即 m m m个激活值 a [ l ] a^{[l]} a[l]的集合,则输出 A [ l ] A^{[l]} A[l]的维度是 m m m× n H [ l ] n_H^{[l]} nH[l]× n W [ l ] n_W^{[l]} nW[l]× n c [ l ] n_c^{[l]} nc[l]
  • 权重参数 W [ l ] W^{[l]} W[l]是所有过滤器的集合再乘以过滤器的总数量,它的维度是 f [ l ] f^{[l]} f[l]× f [ l ] f^{[l]} f[l]× n c [ l − 1 ] n_c^{[l-1]} nc[l1]× n c [ l ] n_c^{[l]} nc[l]
  • 偏差参数 b [ l ] b^{[l]} b[l]在代码中通常表示为一个 1 1 1× 1 1 1× 1 1 1× n c [ l ] n_c^{[l]} nc[l]的四维向量或四维张量。每个过滤器都有一个偏差参数,它是一个实数。
    在这里插入图片描述

7. 简单卷积网络示例 (A Simple Convolution Network Example)

在这里插入图片描述

假设输入一张图片,定义为 x x x,用于图片分类或图片识别。输入图片的大小是 39 39 39× 39 39 39× 3 3 3,所以 n H [ 0 ] = n W [ 0 ] n_H^{[0]}=n_W^{[0]} nH[0]=nW[0],即高度和宽度都等于39, n c [ 0 ] = 3 n_c^{[0]}=3 nc[0]=3,即第0层的通道数为3。
假设第一层我们用10个 3 3 3× 3 3 3× 3 3 3的过滤器来提取特征,即过滤器大小 f [ 1 ] = 3 f^{[1]}=3 f[1]=3过滤器个数 n c [ 1 ] = 10 n_c^{[1]}=10 nc[1]=10。 高度和宽度使用valid卷积,即padding数量 p [ 1 ] = 0 p^{[1]}=0 p[1]=0步幅 s [ 1 ] = 1 s^{[1]}=1 s[1]=1
因此卷积得到的输出图像的大小,或者说第一层激活值 a [ 1 ] a^{[1]} a[1]的维度为 37 37 37× 37 37 37× 10 10 10,其中37是公式 n + 2 p − f s + 1 \frac{n+2p-f}{s}+1 sn+2pf+1的计算结果,也就是 39 + 0 − 3 1 + 1 = 37 \frac{39+0-3}{1}+1=37 139+03+1=37。这样就构建完成了第一个卷积层。
在这里插入图片描述

接下来进入下一个卷积层,这次我们采用的过滤器是 5 5 5× 5 5 5的矩阵,过滤器大小 f [ 2 ] = 5 f^{[2]}=5 f[2]=5,因为上一层的输出图像的通道数 n c [ 1 ] n_c^{[1]} nc[1]为10,因此这一层的过滤器维度是 5 5 5× 5 5 5× 10 10 10。另外步幅 s [ 2 ] = 2 s^{[2]}=2 s[2]=2padding数量 p [ 2 ] = 0 p^{[2]}=0 p[2]=0,并且有20个这样的过滤器,因此这一层输出结果的维度为 17 17 17× 17 17 17× 20 20 20,即输出图像的高度和宽度 n H [ 2 ] = n W [ 2 ] = 17 n_H^{[2]}=n_W^{[2]}=17 nH[2]=nW[2]=17通道数 n c [ 2 ] = 20 n_c^{[2]}=20 nc[2]=20。因为步幅是2,维度缩小得很快,所以维度大小从 37 37 37× 37 37 37减小到 17 17 17× 17 17 17,减小了一半还多。这样就构建完成了第二个卷积层。
在这里插入图片描述

然后来构建最后一个卷积层,假设过滤器还是 5 5 5× 5 5 5,即过滤器大小 f [ 3 ] = 5 f^{[3]}=5 f[3]=5,因为输入图像的维度是 17 17 17× 17 17 17× 20 20 20,所以这一层的过滤器维度是 5 5 5× 5 5 5× 20 20 20。假设步幅 s [ 3 ] = 2 s^{[3]}=2 s[3]=2padding数量 p [ 3 ] = 0 p^{[3]}=0 p[3]=0,并且使用了40个这样的过滤器,因此最后的输出维度为 7 7 7× 7 7 7× 40 40 40。到此,这张 39 39 39× 39 39 39× 3 3 3的输入图像就处理完毕,为图片提取了 7 7 7× 7 7 7× 40 40 40个特征,即1960个特征。
在这里插入图片描述

然后对这1960个特征进行卷积处理,可以将其平滑或展开成1960个单元,平滑处理后可以保存到一个长向量中,然后输入到logistic回归单元softmax回归单元,最后用 y ^ \hat{y} y^表示神经网络的预测输出。

8. 池化层 (Pooling Layers)

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

8.1 最大池化 (Max Pooling)

在这里插入图片描述

假如输入是一个 4 4 4× 4 4 4矩阵,执行最大池化的树池是一个 2 2 2× 2 2 2矩阵,即 f = 2 f=2 f=2。为了计算出右侧这4个元素值,我们需要对输入矩阵的 2 2 2× 2 2 2区域做最大值运算。首先对紫色的 2 2 2× 2 2 2区域计算最大值,得到结果为9。假设步幅 s = 2 s=2 s=2,因此再向右移动2个步幅,得到蓝色的 2 2 2× 2 2 2区域中最大值为2。然后向下移动2步,得到绿色的 2 2 2× 2 2 2区域中最大值为6。最后再向右移动2步,得到红色的 2 2 2× 2 2 2区域中最大值为3。最后输出得到一个 2 2 2× 2 2 2矩阵。
对于这个 2 2 2× 2 2 2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。其中过滤器大小 f = 2 f=2 f=2步幅 s = 2 s=2 s=2是最大池化的超参数,但这两个超参数是固定值,因为其并不能在梯度下降中进行学习。

8.2 平均池化 (Average Pooling)

在这里插入图片描述

这种运算顾名思义,选取的不是每个过滤器的最大值,而是平均值。假设过滤器大小 f = 2 f=2 f=2,步幅 s = 2 s=2 s=2,因此依次计算得到紫色区域的平均值是3.75,蓝色区域的平均值是1.25,绿色区域的平均值是4,红色区域的平均值是2。
目前来说,最大池化比平均池化更常用。但也有例外,就是深度很深的神经网络,你可以用平均池化来分解规模为 7 7 7× 7 7 7× 1000 1000 1000的输出矩阵,在整个空间内求平均值,最后得到 1 1 1× 1 1 1× 1000 1000 1000的输出矩阵。

9. 卷积神经网络示例 (Convolutional neural network example)

假设有一张大小为 32 32 32× 32 32 32× 3 3 3的图片,这张RGB图片中含有某个手写体数字,比如7,你想识别它是0-9这10个数字中的哪一个,因此我们来构建一个卷积神经网络来实现这个功能。
在这里插入图片描述

首先构建第一层卷积层,输入是一个 32 32 32× 32 32 32× 3 3 3的矩阵,假设第一层使用过滤器的维度为 5 5 5× 5 5 5× 3 3 3步幅为1,padding为0,过滤器个数为6,那么该卷积层的输出矩阵的维度为 28 28 28× 28 28 28× 6 6 6,将这层标记为CONV1
然后紧接着在卷积层后面构建一个池化层,这里选择用最大池化。假设参数 f = 2 f=2 f=2 s = 2 s=2 s=2 p = 0 p=0 p=0,即最大池化使用的过滤器为 2 2 2× 2 2 2步幅为2,padding为0,因此输出的高度和宽度会减少一半,通道数量保持不变,最终的输出矩阵维度为 14 14 14× 14 14 14× 6 6 6,将该池化层标记为POOL1
人们在计算神经网络的层数时,通常只统计具有权重和参数的层,而池化层没有权重和参数,只有一些超参数。因此这里我们把CONV1POOL1共同作为一个卷积,并标记为Layer1
注:另一类划分方法是把卷积层作为一层,而池化层单独作为一层。
在这里插入图片描述

接下来对Layer1应用另一个卷积层,假设过滤器的维度为 5 5 5× 5 5 5× 3 3 3,即 f = 5 f=5 f=5步幅为1,padding为0,过滤器个数为16个,所以卷积层CONV2的输出维度为 10 10 10× 10 10 10× 16 16 16
继续执行最大池化计算,假设参数为 f = 2 f=2 f=2 s = 2 s=2 s=2,因此高度和宽度减半,通道数和之前一样,输出矩阵的维度为 5 5 5× 5 5 5× 16 16 16,标记为POOL2。卷积层CONV2和池化层POOL2这两个是一个卷积,即Layer2,因为它只有一个权重集和一个卷积层CONV2
在这里插入图片描述

Layer2的输出是一个 5 5 5× 5 5 5× 16 16 16的矩阵,即包含了400个元素。现在将POOL2平整化为一个大小为400的一维向量。我们可以把平整化结果想象成这样的一个神经元集合,然后利用这400个单元构建下一层。
下一层含有120个单元,这400个单元与120个单元紧密相连,这就是我们第一个全连接层。它相当于一个单神经网络层,它的权重矩阵为 W [ 3 ] W^{[3]} W[3],维度为 120 120 120× 400 400 400,还有一个偏差参数 b [ 3 ] b^{[3]} b[3],维度为 120 120 120× 1 1 1
然后我们对这个120个单元再添加一个全连接层,假设它含有84个单元,标记为FC4。最后用这84个单元填充一个softmax单元。如果我们想通过手写数字识别来识别0-9这10个数字,这个softmax单元就会有10个输出。
关于如何选定这些超参数,常规做法是尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,那么它也有可能适用于你自己的应用程序。
在神经网络中,另一种常见模式就是一个或多个卷积后面跟随一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个softmax层。
接下来讲一下神经网络的激活值维度,激活值大小和参数数量。
在这里插入图片描述

有以下几点要注意:

  • 池化层和最大池化层没有参数;
  • 卷积层的参数相对较少,许多参数都存在于神经网络的全连接层。

从上图可以发现,随着神经网络的深度加深,激活值的尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为6000,然后减少到1600,慢慢减少到84,最后输出softmax结果。

10. 为什么使用卷积? (Why Convolutions?)

和只用全连接层相比,卷积层的两个主要优势在于参数共享稀疏连接
在这里插入图片描述

假设有一张 32 32 32× 32 32 32× 3 3 3的图片,使用6个维度为 5 5 5× 5 5 5× 3 3 3的过滤器,则输出矩阵的维度为 28 28 28× 28 28 28× 6 6 6。32×32×3=3072,28×28×6=4704。假如我们构建一个普通的神经网络,其中一层含有32×32×3=3072个单元,下一层含有28×28×6=4704个单元,两层中的每个神经元彼此相连,然后计算权重矩阵 W W W,它的维度等于4074×3072≈1400万,因此需要训练的参数很多。虽然以现在的技术,我们可以用1400多万个参数来训练网络,因为这张32×32×3的图片非常小,训练这么多参数没有问题。但是如果这是一张 1000 1000 1000× 1000 1000 1000的图片,权重矩阵 W W W会变得非常大。
假如我们构建一个卷积层,每个过滤器的维度都是 5 5 5× 5 5 5× 3 3 3,一个过滤器有75个参数,再加上偏差参数 b b b,那么每个过滤器就有76个参数,因为一共有6个过滤器,所以参数共计456个,可以看到相对而言,卷积操作中涉及的参数数量明显变少。

  • 参数共享 — 假设使用一个 3 3 3× 3 3 3的过滤器检测垂直边缘,那么图片的左上角区域,以及旁边的各个区域(左边矩阵中蓝色方框标记的部分)都可以使用这个 3 3 3× 3 3 3的过滤器,即每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取垂直边缘或其它特征。它不仅适用于边缘特征这样的低阶特征,同样适用于高阶特征,例如提取脸上的眼睛,猫或者其他特征对象。
  • 稀疏连接 — 例如输出矩阵中左上角的0是通过 3 3 3× 3 3 3的卷积计算得到的,它只依赖于这个 3 3 3× 3 3 3的输入的单元格,右边的输出矩阵的某一个元素仅与36个输入特征中9个相连接,而其它像素值都不会对输出产生任何影响。

在这里插入图片描述

卷积神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过拟合。

猜你喜欢

转载自blog.csdn.net/baoli8425/article/details/119378163