Deeplearnng.AI第四部分第一周、卷积神经网络

1.2边缘检测

在这里插入图片描述
在数学中“∗”就是卷积的标准标志,但是在Python中,这个标识常常被用来表示乘法或者元素乘法。

在这里插入图片描述

为了计算第一个元素,在4×4左上角的那个元素,使
用3×3的过滤器,将其覆盖在输入图像,如下图所示。然后进行元素乘法(element-wise products)运算,所以 [ 3 1    0 0    1 ( 1 ) 1 1    5 0    8 ( 1 ) 1 2    7 0    2 ( 1 ) ] = [ 3    0    ( 1 ) 1    0    ( 8 ) 2    0    ( 2 ) ] \begin{bmatrix} 3*1\ \ 0*0\ \ 1*(-1)\\ 1*1\ \ 5*0\ \ 8*(-1)\\ 1*2\ \ 7*0\ \ 2*(-1) \end{bmatrix}= \begin{bmatrix} 3\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-8)\\ 2\ \ 0\ \ (-2) \end{bmatrix} ,然后将矩阵每个元素相加得到最左上角的元素,即 -5.
同理,得到第二个元素-4,
在这里插入图片描述
以此类推得到:
在这里插入图片描述
在不同的编程语言要实现这个运算,会有不同的函数。所以在编程练习中,你会使用一个叫conv_forward的函数。如果在tensorflow下,这个函数叫tf.conv2d,在其他深度学习框架中,如Keras,这个框架下用Conv2D实现卷积运算。所有编程框架都有函数来实现卷积运算。
以上是“卷积”的计算过程,那么什么是垂直边缘检测呢。下面来看另外一个例子。这是一个简单的6×6图像,左边的一半是10,右边一般是0。如果你把它当成一个图片,左边那部分看起来是白色的,像素值10是比较亮的像素值,右边像素值比较暗,我使用灰色来表示0,尽管它也可以被画成黑的。图片里,有一个特别明显的垂直边缘在图像中间,这条垂直线是从黑到白的过渡线,或者从白色到深色。
在这里插入图片描述
如果把最右边的矩阵当成图像,它是这个样子。在中间有段亮一点的区域,对应检查到这个6×6图像中间的垂直边缘。这里的维数似乎有点不正确,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个1000×1000的图像,而不是6×6的图片,你会发现其会很好地检测出图像中的垂直边缘。在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用3×3的矩阵(过滤器),所以垂直边缘是一个3×3的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素。在这个6×6图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘。

1.3更多边缘检测内容(More edge detection)

这里还有个更复杂的例子,左上方和右下方都是亮度为10的点。如果你将它绘成图片,右上角是比较暗的地方,这边都是亮度为0的点,我把这些比较暗的区域都加上阴影。而左上方和右下方都会相对较亮。如果你用这幅图与水平边缘过滤器卷积,就会得到右边这个矩阵。
在这里插入图片描述
再次强调,我们现在所使用的都是相对很小的图片,仅有6×6。但这些中间的数值,比如说这个10(右边矩阵中黄色方框标记元素)代表的是左边这块区域(左边6×6矩阵中黄色方框标记的部分)。这块区域左边两列是正边,右边一列是负边,正边和负边的值加在一起得到了一个中间值。但假如这个一个非常大的1000×1000的类似这样棋盘风格的大图,就不会出现这些亮度为10的过渡带了,因为图片尺寸很大,这些中间值就会变得非常小。
总而言之,通过使用不同的过滤器,你可以找出垂直的或是水平的边缘。但事实上,对于这个3×3的过滤器来说,我们使用了其中的一种数字组合。
在这里插入图片描述
但在历史上,在计算机视觉的文献中,曾公平地争论过怎样的数字组合才是最好的,所以你还可以使用这种: [ 1    0    ( 1 ) 2    0    ( 2 ) 1    0    ( 1 ) ] \begin{bmatrix} 1\ \ 0\ \ (-1)\\ 2\ \ 0\ \ (-2)\\ 1\ \ 0\ \ (-1) \end{bmatrix} ,叫做 s o b e l sobel 的过滤器,它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。
但计算机视觉的研究者们也会经常使用其他的数字组合,比如这种: [ 3     0    ( 3 ) 10    0    ( 10 ) 3     0    ( 3 ) ] \begin{bmatrix} 3\ \ \ 0\ \ (-3)\\ 10\ \ 0\ \ (-10)\\ 3\ \ \ 0\ \ (-3) \end{bmatrix} 这种叫做 S c h a r r Scharr 过滤器,它有着和之前完全不同的特性,实际上也是一种垂直边缘检测,如果你将其翻转90度,你就能得到对应水平边缘检测。

1.4 Padding

为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是padding,让我们来看看它是如何工作的。
在这里插入图片描述
在前面的学习,我们知道对于一个是6x6的图像,通过一个3x3的卷积之后会得到4x4的图像。如果我们有 n n n*n 的图像,同 f f f*f 的卷积核过滤器做卷积,那么输出的维度就是: ( n f + 1 ) ( n f + 1 ) (n-f+1)*(n-f+1)
但是这么卷积会使每次做卷积的时候图像缩小。如果不想让你的图像在每次卷积之后缩小,可以这样:
在这里插入图片描述
先在图像边缘填充一些像素,如上图,那么 6 6 6*6 的图像就编程 8 8 8*8 的图像,再用卷积核卷积作用之后会得到 ( 8 3 + 1 ) ( 8 3 + 1 ) (8-3+1)*(8-3+1) ,即还是 6 6 6*6 的图像,这样你就得到了一个尺寸和原图像相等的图像。习惯上,你可以用0去填充,如果 p p 是填充的数量,在这个案例中, p = 1 p=1 ,因为我们在周围都填充了一个像素点,输出也就变成了 ( n + 2 p f + 1 ) ( n + 2 p f + 1 ) (n+2p-f+1)*(n+2p-f+1) ,所以就变成了,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。

卷积的padding通常有两种选择:分别是 V a l i d S a m e Valid卷积和 Same卷积

  • Valid卷积,即,不填充,如果有一个 n n n*n 的图像,用一个 f f f*f 的过滤器卷积,它将会输出 ( n f + 1 ) ( n f + 1 ) (n-f+1)*(n-f+1) 维的图像。
  • Same卷积,即填充后输出和输入大小一样。根据公式 n + 2 p f + 1 n+2p-f+1 ,如果有一个 n n n*n 的图像,同 p p 个像素填充,输出大小就是 ( n + 2 p f + 1 ) ( n + 2 p f + 1 ) (n+2p-f+1)*(n+2p-f+1) 。如果想让 n + 2 p f + 1 = n n+2p-f+1=n ,使得输入输出相等,那么用此等式求解p, p = f 1 2 p=\frac{f-1}{2} 。所以当卷积核尺寸 f f 是一个奇数的时候,只要选择相应的填充尺寸 p p ,你就能确保得到和输入相同尺寸的输出。

1.5 卷积步长(Strided convolutions)

在这里插入图片描述
如果你想用3×3的过滤器卷积这个7×7的图像,和之前不同的是,我们把步幅设置成了2。你还和之前一样取左上方的3×3区域的元素的乘积,再加起来,最后结果为91。
在这里插入图片描述
计算第二个值的时候和之前有所不同,之前我们移动蓝框的步长是1,现在移动的步长是2,我们让过滤器跳过2个步长,注意一下左上角,这个点移动到其后两格的点,跳过了一个位置。然后你还是将每个元素相乘并求和,你将会得到的结果是100。
以此类推计算出卷积后的值:
在这里插入图片描述
所以在这个例子中,我们用3×3的矩阵卷积一个7×7的矩阵,得到一个3×3的输出。输入和输出的维度是由下面的公式决定的。如果你用一个 f f f*f 的过滤器卷积一个 n n n*n 的图像,你的padding为 p p ,步幅为s,在这个例子中 s = 2 s=2 ,你会得到一个输出,因为现在你不是一次移动一个步子,而是一次移动 s s 个步子,输出于是变为 ( n + 2 p f s + 1 ) ( n + 2 p f s + 1 ) (\frac{n+2p-f}{s}+1)*(\frac{n+2p-f}{s}+1)
此例中,n = 7, p = 0, f = 3, s = 2, 代入公式得(7-3)/2 + 1 = 3。
现在只剩下最后的一个细节了,如果商不是一个整数怎么办?在这种情况下,我们向下取整。 x \lfloor x \rfloor 这是向下取整的符号,这意味着x向下取整到最近的整数。这个原则实现的方式是,你只在蓝框完全包括在图像或填充完的图像内部时,才对它进行运算。如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作,这是一个惯例。你的3×3的过滤器必须完全处于图像中或者填充之后的图像区域内才输出相应结果,这就是惯例。因此正确计算输出维度的方法是向下取整,以免 n + 2 p f s + 1 \frac{n+2p-f}{s}+1 不是整数。
从技术上讲,我们实际上做的,我们在前面视频中使用的操作,有时被称为互相关(cross-correlation)而不是卷积(convolution)。但在深度学习文献中,按照惯例,我们将这(不进行翻转操作)叫做卷积操作。

1.6 三维卷积(Convolutions over volumes)

从一个例子开始,假如说你不仅想检测灰度图像的特征,也想检测RGB彩色图像的特征。彩色图像如果是
6×6×3,这里的3指的是三个颜色通道,你可以把它想象成三个6×6图像的堆叠。为了检测图像的边缘或者其
他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的过滤器,它的维度是3×3×3,这样这个过滤器也有三层,对应红绿、蓝三个通道。
在这里插入图片描述
给这些命个名字(原图像),这里的第一个6代表图像高度,第二个6代表宽度,这个3代表通道的数目。同样你的过滤器也有一个高,宽和通道数,并且图像的通道数必须和过滤器的通道数匹配,所以这两个数(紫色方框标记的两个数)必须相等。下一张图里,我们就会知道这个卷积操作是如何进行的了,这个的输出会是一个4×4的图像,注意是4×4×1,最后一个数不是3了。
在这里插入图片描述
上面左边的图像是6x6x3,中间是3x3x3的filter,最后一个数字通道数3必须和卷积核中的通道数3相匹配(一致
)。为了简化这个3x3x3的卷积核,我们将它画成一个三维的立方体。
在这里插入图片描述
为了计算这个卷积操作的输出,先把这个3x3x3的卷积核放到最左上角的位置,这个卷积核有3x3x3=27个数,依次取这27个数,然后乘以相应的RGB通道中的数字,先是红色通道的前9个数字,然后是绿色通道,然后再是蓝色通道,乘以左边黄色立方体覆盖的对应的27个数,然后把这些数都加起来,就得到了输出的第一个数字。
要计算下一个输出,你把这个立方体滑动一个单位,再与这27个数相乘,把它们都加起来,就得到了下一个输出,以此类推。
在这里插入图片描述

  • 例如这个过滤器是3×3×3的,你只想检测图像红色通道的边缘,那么你可以将第一个过滤器设为 [ 1    0    ( 1 ) 1    0    ( 1 ) 1    0    ( 1 ) ] \begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix} ,和之前一样,而绿色通道全为0, [ 0    0    0 0    0    0 0    0    0 ] \begin{bmatrix} 0\ \ 0\ \ 0\\ 0\ \ 0\ \ 0\\ 0\ \ 0\ \ 0 \end{bmatrix} ,蓝色的通道也全为零,如果你把这三个堆叠在一起形成一个3×3×3的过滤器,那么这就是一个检测垂直边界的过滤器,但只对红色通道有用。

  • 者如果你不关心垂直边界在哪个颜色通道里,那么你可以用一个这样的过滤器, [ 1    0    ( 1 ) 1    0    ( 1 ) 1    0    ( 1 ) ] \begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix} [ 1    0    ( 1 ) 1    0    ( 1 ) 1    0    ( 1 ) ] \begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix} [ 1    0    ( 1 ) 1    0    ( 1 ) 1    0    ( 1 ) ] \begin{bmatrix} 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1)\\ 1\ \ 0\ \ (-1) \end{bmatrix} ,所有三个通道都一样。所以通过设置第二个过滤器参数,你就有了一个边界检测器,3×3×3的边界检测器,用来检测任意颜色通道里的边界。参数的选择不同,你就可以得到不同的特征检测器,所有的都是3×3×3的过滤器。按照计算机视觉的惯例,当你的输入有特定的高宽和通道数时,你的过滤器可以有不同的高,不的宽,但是必须一样的通道数。理论上,我们的过滤器只关注红色通道,或者只关注绿色或者蓝色通道也是可行的。再注意一下这个卷积立方体,一个6×6×6的输入图像卷积上一个3×3×3的过滤器,得到一个4×4的二维输出。现在你已经了解了如何对立方体卷积,还有最后一个概念,对建立卷积神经网络至关重要。就是,如果我们不仅仅想要检测垂直边缘怎么办?如果我们同时检测垂直边缘和水平边缘,还有45°倾斜的边缘,还有70°倾斜的边缘怎么做?换句话说,如果你想同时用多个过滤器怎么办?这是我们上一张幻灯片的图片,我们让这个6×6×3的图像和这个3×3×3的过滤器卷积,得到4×4的输出。(第一个)这可能是一个垂直边界检测器或者是学习检测其他的特征。第二个过滤器可以用橘色来表示,它可以是一个水平边缘检测器。
    在这里插入图片描述
    所以和第一个卷积核卷积,可以得到第一个4×4的输出,然后卷积第二个过滤器,得到一个不同的4×4的输出。把这两个输出堆叠在一起,这样你就都得到了一个4×4×2的输出立方体,一个立方盒子,所以这就是一个4×4×2的输出立方体。它用6×6×3的图像,然后卷积上这两个不同的3×3×3的过滤器,得到两个4×4的输出,它们堆叠在一起,形成一个4×4×2的立方体,这里的2的来源于我们用了两个不同的过滤器。
    现在总结一下维度,如果你有一个 n n n c ( ) n*n*n_c(通道数) 的输入图像,在这个例子中就是663,其中 n c n_c 就是通道数,然后卷积上一个 f f n c f*f*n_c 的卷积核,最后得到了 ( n f + 1 ) ( n f + 1 ) n c (n-f+1)*(n-f+1)*n_c' ,其中 n c n_c' 就是下一层的通道数,就是你所用的卷积核的个数(一个卷积核有RBG三层),此例中就是442。此时的步长是2,无padding。
    现在你可以用它的一小部分直接在三个通道的RGB图像上进行操作。更重要的是,你可以检测两个特征,比如垂直和水平边缘或者10个或者128个或者几百个不同的特征,并且输出的通道数会等于你要检测的特征数。
    对于这里的符号,吴恩达先生常用通道数( n c n_c )来表示最后一个维度,在文献里大家也把它叫做3维立方体的深度。这两个术语,即通道或者深度,经常被用在文献中。

1.7 单层卷积网络(One layer of a convolutional network)

前面已经讲了如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的4×4矩阵。假设使用第一个过滤器进行卷积,得到第一个4×4矩阵。使用第二个过滤器进行卷积得到另外一个4×4矩阵。
在这里插入图片描述
形成一个卷积神经网络层,然后加入偏差 b 1 b_1 ,它是一个实数,通过Python的广播机制给这16个元素都加上同一偏差。然后应用非线性激活函数ReLU,输出结果是一个4×4矩阵。
同样,对于第二个4*4矩阵,我们加上不同的偏差,它也是一个实数,16个数字都加上同一个实数,然后应用非线性激活函数ReLU,最终得到另一个4×4矩阵。然后重复我们之前的步骤,把这两个矩阵堆叠起来,最终得到一个4×4×2的矩阵。我们通过计算,从6×6×3的输入推导出一个4×4×2矩阵,它是卷积神经网络的一层,把它映射到标准神经网络中四个卷积层中的某一层或者一个非卷积神经网络中。
在这里插入图片描述
注意前向传播中一个操作就是 z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]}=W^{[1]}a^{[0]}+b^{[1]} ,其中 a [ 0 ] = x a^{[0]}=x ,执行激活函数操作得 a [ 1 ] a^{[1]} ,即 a [ 1 ] = g ( z [ 1 ] ) a^{[1]}=g(z^{[1]}) 。这里的输入是 a [ 0 ] a^{[0]} ,即 x x ,卷积核用变量 W [ 1 ] W^{[1]} 表示。

这就是 a [ 0 ] a^{[0]} a [ 1 ] a^{[1]} 的操作,即卷积神经网络的一层。

  • 为了加深理解,我们来做一个练习。
    在这里插入图片描述
    假设你有10个过滤器,而不是2个,神经网络的一层是3×3×3,那么,这一层有多少个参数呢?
    每一层都是一个333的矩阵,就有27个参数,再加入一个偏差就是28个,如果是10个卷积核,那就有28*10=280个参数。

  • 最后我们总结一下用于描述卷积神经网络中的一层(以 l l 层为例),也就是卷积层的各种标记。
    在这里插入图片描述
    f [ l ] f^{[l]} 表示卷积核的大小,为 f f f*f
    上标 [ l ] ^{[l]} 表示 l l 层,
    p [ l ] p^{[l]} 表示padding的填充像素数量,可以指定为(Valid or Same),
    s [ l ] s^{[l]} 表示步长。
    该层的输入表示为 n n n c n*n*n_c n c n_c 表示该层的颜色通道数。此时需要对其进行修改,增加上标 [ l 1 ] [l-1] ,即 n [ l 1 ] n [ l 1 ] n c [ l 1 ] n^{[l-1]}*n^{[l-1]}*n_c^{[l-1]} ,因为它是上一层的激活值。由于有时候所用图片高度和宽度可能不等,分别用下标 H , W H,W 标记,即, n H [ l 1 ] n W [ l 1 ] n c [ l 1 ] n_H^{[l-1]}*n_W^{[l-1]}*n_c^{[l-1]} 。那么在第 l l 层,图片的维数是 n H [ l 1 ] n W [ l 1 ] n c [ l 1 ] n_H^{[l-1]}*n_W^{[l-1]}*n_c^{[l-1]} ,第 l l 层的输入就是上一层的激活输出。而此层的输出其图片的维数是 n H [ l ] n W [ l ] n c [ l ] n_H^{[l]}*n_W^{[l]}*n_c^{[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 ,
    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
    下面确定卷积核的大小。一般用33k大小的卷积核(当然也可以是55k等等),那么k如何确定?输入的通道数必须和卷积核的通道数一致。因此卷积核的维度就是
    f [ l ] f [ l ] n c [ l 1 ] f^{[l]}*f^{[l]}*n_c^{[l-1]}

在这里插入图片描述
应用偏差和非线性函数之后,这一层的输出等于它的激活值 a [ l ] a^{[l]} ,其维度是 n H [ l ] n W [ l ] n c [ l ] n_H^{[l]}*n_W^{[l]}*n_c^{[l]} 。当我们有m个例子,就有输出 A [ l ] = m n H [ l ] n W [ l ] n c [ l ] A^{[l]}=m*n_H^{[l]}*n_W^{[l]}*n_c^{[l]} 。了解了卷积神经网络中某一卷积层的工作原理,我们就可以把它们堆叠起来形成一个深度卷积神经网络。

1.8 简单卷积网络示例(A simple convolutional network example)

a

1.9池化层(Pooling layers)

除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们来看一下。先举一个池化层的例子,然后我们再讨论池化层的必要性。假如输入是一个4×4矩阵,用到的池化类型是最大池化(max pooling)。执行最大池化的树池是一个2×2矩阵。执行过程非常简单,把4×4的输入拆分成不同的区域,我把这些区域用不同颜色来标记。对于2×2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。
在这里插入图片描述
在这里插入图片描述
左上区域的最大值是9,右上区域的最大元素值是2,左下区域的最大值是6,右下区域的最大值是3。为了计算出右侧这4个元素值,我们需要对输入矩阵的2×2区域做最大值运算。这就像是应用了一个规模为2的过滤器,因为我们选用的是2×2区域,步幅是2,这些就是最大池化的超参数。因为我们使用的过滤器为2×2,最后输出是9。然后向右移动2个步幅,计算出最大值2。然后是第二行,向下移动2步得到最大值6。最后向右移动3步,得到最大值3。这是一个2×2矩阵,即 f = 2 f=2 ,步幅是2,即 s = 2 s=2
之前讲的计算卷积层输出大小的公式同样适用于最大池化,即 n + 2 p f s + 1 \frac{n+2p-f}{s}+1

下面来看另一个例子:
在这里插入图片描述
此例是计算3*3输出的每个元素,我们看左上角这些元素 ,注意这是一个3x3 区域,因为有 3 个过滤器,取最大值 9。然后移动一个元素,因为步幅是 1,蓝色区域的最大值是 9.继续向右移动,蓝色区域的最大值是 5。然后移到下一行,因为步幅是 1,我们只向下移动一个格,所以该区域的最大值是 9。这个区域也是 9。这两个区域的最大值都是 5。最后这三个区域的最大值分别为 8,6 和 9。超参数f = 3,s = 1,最终输出如下图所示。
在这里插入图片描述
以上就是一个二维输入的最大池化的演示,如果输入是三维的,那么输出也是三维的。例如,输入是 5×5×2,那么输出是 3×3×2。计算最大池化的方法就是分别对每个通道执行刚刚的计算过程。如上图所示,第一个通道依然保持不变。对于第二个通道,我刚才画在下面的,在这个层做同样的计算,得到第二个通道的输出。一般来说,如果输入是5x5x n c n_c ,输出就是3x3x n c n_c n c n_c 个通道中每个通道都单独执行最大池化计算,以上就是最大池化算法。

另外还有一种池化类型,平均池化,但是它不太常用。这种运算取的不是每个过滤器的最大值,而是平均值。如下图所示
在这里插入图片描述
示例中,紫色区域的平均值是 3.75,后面依次是 1.25、4 和 2。这个平均池化的超级参数f = 2,s = 2,我们也可以选择其它超参数。

总结一下,池化的超级参数包括过滤器大小f和步幅s,常用的参数值为f = 2,s = 2,应用频率非常高,其效果相当于高度和宽度缩减一半。也有使用f = 3,s = 2的情况。至于其它超级参数就要看你用的是最大池化还是平均池化了。你也可以根据自己意愿增加表示padding 的其他超级参数,虽然很少这么用。最大池化时,往往很少用到超参数 padding,当然也有例外的情况,我们下周会讲。大部分情况下,最大池化很少用 padding。目前p最常用的值是 0,即 p=0。最大池化的输入就是 n H n W n c n_H*n_W*n_c ,假设没有 padding,则输出 n H f s + 1 n W f s + 1 n c \lfloor \frac{n_{_H}-f}{s}+1\rfloor *\lfloor \frac{n_{_W}-f}{s}+1\rfloor*n_c

1.10 卷及神经网络例子(Convolutional neural network example)

  • 假设,有一张大小为 32×32×3 的输入图片,这是一张 RGB 模式的图片,你想做手写体数字识别。32×32×3 的 RGB 图片中含有某个数字,比如 7,你想识别它是从 0-9 这 10 个数字中的哪一个,我们构建一个神经网络来实现这个功能。
    在这里插入图片描述
    下面这个网络模型和经典网络 LeNet-5 非常相似,灵感也来源于此。LeNet-5 是多年前 Yann LeCun 创建的,我所采用的模型并不是 LeNet-5,但是受它启发,许多参数选择都与LeNet-5 相似。输入是 32×32×3 的矩阵,假设第一层使用过滤器大小为 5×5,步幅是 1, padding是 0,过滤器个数为 6,那么输出为 28×28×6。将这层标记为 CONV1,它用了 6 个过滤器,增加了偏差,应用了非线性函数,可能是 ReLU 非线性函数,最后输出 CONV1 的结果。
    在这里插入图片描述
    然后构建一个池化层,这里我选择用最大池化,参数f = 2, s = 2,因为 padding 为 0。现在开始构建池化层,最大池化使用的过滤器为 2×2,步幅为 2,表示层的高度和宽度会减少一半。因此,28×28 变成了 14×14,通道数量保持不变,所以最终输出为 14×14×6,将该输出标记为 POOL1。
    人们发现在卷积神经网络文献中,卷积有两种分类。一类卷积是一个卷积层和一个池化层一起作为一层,这就是神经网络的 Layer1。另一类卷积是把卷积层作为一层,而池化层单独作为一层。人们在计算神经网络有多少层时,通常只统计具有权重和参数的层。因为池化层没有权重和参数,只有一些超参数。这里,我们把 CONV1和 POOL1 共同作为一个卷积,并标记为 Layer1。在此例中,Layer1的输出为14x14x6
    在这里插入图片描述接着构建第二个卷积层大小为 5×5,步幅为 1,这次我们用 10 个过滤器,最后输出一个 10×10×10 的矩阵,标记为 CONV2。然后加入最大池化超参数f = 2,s = 2。最后输出为 5×5×10,标记为 POOL2,这就是神经网络的第二个卷积层,即 Layer2。
    在这里插入图片描述
    hadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FubnkwMDAx,size_16,color_FFFFFF,t_70)
    现在将 POOL2 平整化为一个大小为 400 的一维向量。可以把平整化结果想象成这样的一个神经元集合,然后利用这 400 个单元构建下一层。下一层含有 120 个单元,这就是我们第一个全连接层,标记为 FC3。这 400 个单元与 120 个单元紧密相连,这就是全连接层。它很像我们在第一和第二门课中讲过的单神经网络层,这是一个标准的神经网络。它的权重矩阵为 W [ 3 ] W^{[3]} ,维度为 120×40。这就是所谓的“全连接”,因为这 400 个单元与这 120 个单元的每一项连接,还有一个偏差参数。输出 120 个维度,因为有 120 个输出。
    然后我们对这个 120 个单元再添加一个全连接层,这层更小,假设它含有 84 个单元,标记为 FC4。
    最后,用这 84 个单元后面接一个 softmax 单元。如果我们想通过手写数字识别来识别手写 0-9 这 10 个数字,这个 softmax 就会有 10 个输出。

  • 接下来我们讲神经网络的激活值形状,激活值大小和参数数量。输入为 32×32×3,这些数做乘法,结果为 3072,所以激活值 a [ 0 ] a^{[0]} 有 3072 维,激活值矩阵为 32×32×3,输入层没有参数。计算其他层的时候,试着自己计算出激活值,这些都是网络中不同层的激活值形状和激活值大小。
    在这里插入图片描述
    第二卷积层的参数相对较少,前面课上我们提到过,其实许多参数都存在于神经网络的全连接层。观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为 6000+,然后减少到 1600左右,慢慢减少到 84,最后输出 softmax结果。我们发现,许多卷积网络都具有这些属性,模式上也相似。

*1.11为什么使用卷积?

猜你喜欢

转载自blog.csdn.net/anny0001/article/details/86381637