吴恩达深度学习课程笔记Lesson10(下)

第四门课 卷积神经网络(Convolutional Neural Networks)(下)

第一周 卷积神经网络(Foundations of Convolutional Neural Networks)

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了。

在这里插入图片描述

我们研究下这背后的细节,首先先换一张好看的图片。这个是6×6×3的图像,这个是3×3×3的过滤器,最后一个数字通道数必须和过滤器中的通道数相匹配。为了简化这个3×3×3过滤器的图像,我们不把它画成3个矩阵的堆叠,而画成这样,一个三维的立方体。

在这里插入图片描述

为了计算这个卷积操作的输出,你要做的就是把这个3×3×3的过滤器先放到最左上角的位置,这个3×3×3的过滤器有27个数,27个参数就是3的立方。依次取这27个数,然后乘以相应的红绿蓝通道中的数字。先取红色通道的前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} 111000111 ,和之前一样,而绿色通道全为0, [ 0 0 0 0 0 0 0 0 0 ] \begin{bmatrix} 0& 0 & 0 \\ 0 &0 & 0 \\ 0 & 0 & 0 \\\end{bmatrix} 000000000 ,蓝色也全为0。如果你把这三个堆叠在一起形成一个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} 111000111 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\ \end{bmatrix} 111000111 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\\end{bmatrix} 111000111 ,所有三个通道都是这样。所以通过设置第二个过滤器参数,你就有了一个边界检测器,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的输出,取第一个把它放到前面,然后取第二个过滤器输出,我把它画在这,放到后面。所以把这两个输出堆叠在一起,这样你就都得到了一个4×4×2的输出立方体,你可以把这个立方体当成,重新画在这,就是一个这样的盒子,所以这就是一个4×4×2的输出立方体。它用6×6×3的图像,然后卷积上这两个不同的3×3的过滤器,得到两个4×4的输出,它们堆叠在一起,形成一个4×4×2的立方体,这里的2的来源于我们用了两个不同的过滤器。

在这里插入图片描述

我们总结一下维度,如果你有一个 n × n × n c n \times n \times n_{c} n×n×nc(通道数)的输入图像,在这个例子中就是6×6×3,这里的 n c n_{c} nc就是通道数目,然后卷积上一个 f × f × n c f×f×n_{c} f×f×nc,这个例子中是3×3×3,按照惯例,这个(前一个 n c n_{c} nc)和这个(后一个 n c n_{c} nc)必须数值相同。然后你就得到了 ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1)×(n-f+1)×n_{c^{'}} nf+1×nf+1×nc,这里 n c ′ n_{c^{'}} nc其实就是下一层的通道数,它就是你用的过滤器的个数,在我们的例子中,那就是4×4×2。我写下这个假设时,用的步幅为1,并且没有padding。如果你用了不同的步幅或者padding,那么这个 n − f + 1 n-f+1 nf+1数值会变化,正如前面的视频演示的那样。

这个对立方体卷积的概念真的很有用,你现在可以用它的一小部分直接在三个通道的RGB图像上进行操作。更重要的是,你可以检测两个特征,比如垂直和水平边缘或者10个或者128个或者几百个不同的特征,并且输出的通道数会等于你要检测的特征数。

对于这里的符号,我一直用通道数( n c n_{c} nc)来表示最后一个维度,在文献里大家也把它叫做3维立方体的深度。这两个术语,即通道或者深度,经常被用在文献中。但我觉得深度容易让人混淆,因为你通常也会说神经网络的深度。所以,在这些视频里我会用通道这个术语来表示过滤器的第三个维度的大小。

所以你已经知道怎么对立方体做卷积了,你已经准备好了实现卷积神经其中一层了,在下个视频里让我们看看是怎么做的。

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

今天我们要讲的是如何构建卷积神经网络的卷积层,下面来看个例子。

在这里插入图片描述

上节课,我们已经讲了如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的4×4矩阵。假设使用第一个过滤器进行卷积,得到第一个4×4矩阵。使用第二个过滤器进行卷积得到另外一个4×4矩阵。

在这里插入图片描述

最终各自形成一个卷积神经网络层,然后增加偏差,它是一个实数,通过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]} z[1]=W[1]a[0]+b[1],其中 a [ 0 ] = x a^{[0]} =x a[0]=x,执行非线性函数得到 a [ 1 ] a^{[1]} a[1],即 a [ 1 ] = g ( z [ 1 ] ) a^{[1]} = g(z^{[1]}) a[1]=g(z[1])。这里的输入是 a [ 0 ] a^{\left\lbrack 0\right\rbrack} a[0],也就是 x x x,这些过滤器用变量 W [ 1 ] W^{[1]} W[1]表示。在卷积过程中,我们对这27个数进行操作,其实是27×2,因为我们用了两个过滤器,我们取这些数做乘法。实际执行了一个线性函数,得到一个4×4的矩阵。卷积操作的输出结果是一个4×4的矩阵,它的作用类似于 W [ 1 ] a [ 0 ] W^{[1]}a^{[0]} W[1]a[0],也就是这两个4×4矩阵的输出结果,然后加上偏差。

在这里插入图片描述

这一部分(图中蓝色边框标记的部分)就是应用激活函数ReLU之前的值,它的作用类似于 z [ 1 ] z^{[1]} z[1],最后应用非线性函数,得到的这个4×4×2矩阵,成为神经网络的下一层,也就是激活层。

这就是 a [ 0 ] a^{[0]} a[0] a [ 1 ] a^{[1]} a[1]的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差,然后应用激活函数ReLU。这样就通过神经网络的一层把一个6×6×3的维度 a [ 0 ] a^{[0]} a[0]演化为一个4×4×2维度的 a [ 1 ] a^{[1]} a[1],这就是卷积神经网络的一层。

示例中我们有两个过滤器,也就是有两个特征,因此我们才最终得到一个4×4×2的输出。但如果我们用了10个过滤器,而不是2个,我们最后会得到一个4×4×10维度的输出图像,因为我们选取了其中10个特征映射,而不仅仅是2个,将它们堆叠在一起,形成一个4×4×10的输出图像,也就是 a [ 1 ] a^{\left\lbrack1 \right\rbrack} a[1]

在这里插入图片描述

为了加深理解,我们来做一个练习。假设你有10个过滤器,而不是2个,神经网络的一层是3×3×3,那么,这一层有多少个参数呢?我们来计算一下,每一层都是一个3×3×3的矩阵,因此每个过滤器有27个参数,也就是27个数。然后加上一个偏差,用参数 b b b表示,现在参数增加到28个。上一页幻灯片里我画了2个过滤器,而现在我们有10个,加在一起是28×10,也就是280个参数。

请注意一点,不论输入图片有多大,1000×1000也好,5000×5000也好,参数始终都是280个。用这10个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。你已经知道到如何提取10个特征,可以应用到大图片中,而参数数量固定不变,此例中只有28个,相对较少。

最后我们总结一下用于描述卷积神经网络中的一层(以 l l l层为例),也就是卷积层的各种标记。

在这里插入图片描述

这一层是卷积层,用 f [ l ] f^{[l]} f[l]表示过滤器大小,我们说过过滤器大小为 f × f f×f f×f,上标 [ l ] \lbrack l\rbrack [l]表示 l l l层中过滤器大小为 f × f f×f f×f。通常情况下,上标 [ l ] \lbrack l\rbrack [l]用来标记 l l l层。用 p [ l ] p^{[l]} p[l]来标记padding的数量,padding数量也可指定为一个valid卷积,即无padding。或是same卷积,即选定padding,如此一来,输出和输入图片的高度和宽度就相同了。用 s [ l ] s^{[l]} s[l]标记步幅。

这一层的输入会是某个维度的数据,表示为 n × n × n c n \times n \times n_{c} n×n×nc n c n_{c} nc某层上的颜色通道数。

我们要稍作修改,增加上标 [ l − 1 ] \lbrack l -1\rbrack [l1],即 n [ l − 1 ] × n [ l − 1 ] × n c [ l − 1 ] n^{\left\lbrack l - 1 \right\rbrack} \times n^{\left\lbrack l -1 \right\rbrack} \times n_{c}^{\left\lbrack l - 1\right\rbrack} n[l1]×n[l1]×nc[l1],因为它是上一层的激活值。

此例中,所用图片的高度和宽度都一样,但它们也有可能不同,所以分别用上下标 H H H W W W来标记,即 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] 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} nH[l1]×nW[l1]×nc[l1]。那么在第 l l l层,图片大小为 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] 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} nH[l1]×nW[l1]×nc[l1] l l l层的输入就是上一层的输出,因此上标要用 [ l − 1 ] \lbrack l - 1\rbrack [l1]。神经网络这一层中会有输出,它本身会输出图像。其大小为 n H [ l ] × n W [ l ] × n c [ l ] n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} nH[l]×nW[l]×nc[l],这就是输出图像的大小。

前面我们提到过,这个公式给出了输出图片的大小,至少给出了高度和宽度, ⌊ n + 2 p − f s + 1 ⌋ \lfloor\frac{n+2p - f}{s} + 1\rfloor sn+2pf+1(注意:( n + 2 p − f s + 1 ) \frac{n + 2p - f}{s} +1) sn+2pf+1)直接用这个运算结果,也可以向下取整)。在这个新表达式中, 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}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f^{[l]}}{s^{[l]}} +1\rfloor nH[l]=s[l]nH[l1]+2p[l]f[l]+1,同样我们可以计算出图像的宽度,用 W W W替换参数 H H H,即 n W [ l ] = ⌊ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_{W}^{[l]} = \lfloor\frac{n_{W}^{\left\lbrack l - 1 \right\rbrack} +2p^{[l]} - f^{[l]}}{s^{[l]}} +1\rfloor nW[l]=s[l]nW[l1]+2p[l]f[l]+1,公式一样,只要变化高度和宽度的参数我们便能计算输出图像的高度或宽度。这就是由 n H [ l − 1 ] n_{H}^{\left\lbrack l - 1 \right\rbrack} nH[l1]推导 n H [ l ] n_{H}^{[l]} nH[l]以及 n W [ l − 1 ] n_{W}^{\left\lbrack l - 1\right\rbrack} nW[l1]推导 n W [ l ] n_{W}^{[l]} nW[l]的过程。

那么通道数量又是什么?这些数字从哪儿来的?我们来看一下。输出图像也具有深度,通过上一个示例,我们知道它等于该层中过滤器的数量,如果有2个过滤器,输出图像就是4×4×2,它是二维的,如果有10个过滤器,输出图像就是4×4×10。输出图像中的通道数量就是神经网络中这一层所使用的过滤器的数量。如何确定过滤器的大小呢?我们知道卷积一个6×6×3的图片需要一个3×3×3的过滤器,因此过滤器中通道的数量必须与输入中通道的数量一致。因此,输出通道数量就是输入通道数量,所以过滤器维度等于 f [ l ] × f [ l ] × n c [ l − 1 ] f^{[l]} \times f^{[l]} \times n_{c}^{\left\lbrack l - 1 \right\rbrack} f[l]×f[l]×nc[l1]

在这里插入图片描述

应用偏差和非线性函数之后,这一层的输出等于它的激活值 a [ l ] a^{[l]} a[l],也就是这个维度(输出维度)。 a [ l ] a^{[l]} a[l]是一个三维体,即 n H [ l ] × n W [ l ] × n c [ l ] n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} nH[l]×nW[l]×nc[l]。当你执行批量梯度下降或小批量梯度下降时,如果有 m m m个例子,就是有 m m m个激活值的集合,那么输出 A [ l ] = m × n H [ l ] × n W [ l ] × n c [ l ] A^{[l]} = m \times n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} A[l]=m×nH[l]×nW[l]×nc[l]。如果采用批量梯度下降,变量的排列顺序如下,首先是索引和训练示例,然后是其它三个变量。

该如何确定权重参数,即参数W呢?过滤器的维度已知,为 f [ l ] × f [ l ] × n c [ l − 1 ] f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]} f[l]×f[l]×nc[l1],这只是一个过滤器的维度,有多少个过滤器,这( n c [ l ] n_{c}^{[l]} nc[l])是过滤器的数量,权重也就是所有过滤器的集合再乘以过滤器的总数量,即 f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] f^{[l]} \times f^{[l]} \times n_{c}^{[l - 1]} \times n_{c}^{[l]} f[l]×f[l]×nc[l1]×nc[l],损失数量L就是 l l l层中过滤器的个数。

最后我们看看偏差参数,每个过滤器都有一个偏差参数,它是一个实数。偏差包含了这些变量,它是该维度上的一个向量。后续课程中我们会看到,为了方便,偏差在代码中表示为一个1×1×1× n c [ l ] n_{c}^{[l]} nc[l]的四维向量或四维张量。

在这里插入图片描述

卷积有很多种标记方法,这是我们最常用的卷积符号。大家在线搜索或查看开源代码时,关于高度,宽度和通道的顺序并没有完全统一的标准卷积,所以在查看GitHub上的源代码或阅读一些开源实现的时候,你会发现有些作者会采用把通道放在首位的编码标准,有时所有变量都采用这种标准。实际上在某些架构中,当检索这些图片时,会有一个变量或参数来标识计算通道数量和通道损失数量的先后顺序。只要保持一致,这两种卷积标准都可用。很遗憾,这只是一部分标记法,因为深度学习文献并未对标记达成一致,但课上我会采用这种卷积标识法,按高度,宽度和通道损失数量的顺序依次计算。

在这里插入图片描述

我知道,忽然间接触到这么多新的标记方法,你可能会说,这么多怎么记呢?别担心,不用全都记住,你可以通过本周的练习来熟悉它们。而这节课我想讲的重点是,卷积神经网络的某一卷积层的工作原理,以及如何计算某一卷积层的激活函数,并映射到下一层的激活值。了解了卷积神经网络中某一卷积层的工作原理,我们就可以把它们堆叠起来形成一个深度卷积神经网络,我们下节课再讲。

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

上节课,我们讲了如何为卷积网络构建一个卷积层。今天我们看一个深度卷积神经网络的具体示例,顺便练习一下我们上节课所学的标记法。

假设你有一张图片,你想做图片分类或图片识别,把这张图片输入定义为 x x x,然后辨别图片中有没有猫,用0或1表示,这是一个分类问题,我们来构建适用于这项任务的卷积神经网络。针对这个示例,我用了一张比较小的图片,大小是39×39×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。

在这里插入图片描述

假设第一层我们用一个3×3的过滤器来提取特征,那么 f [ 1 ] = 3 f^{[1]} = 3 f[1]=3,因为过滤器时3×3的矩阵。 s [ 1 ] = 1 s^{[1]} = 1 s[1]=1 p [ 1 ] = 0 p^{[1]} =0 p[1]=0,所以高度和宽度使用valid卷积。如果有10个过滤器,神经网络下一层的激活值为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,所以输出是37×37,它是一个vaild卷积,这是输出结果的大小。第一层标记为 n H [ 1 ] = n W [ 1 ] = 37 n_{H}^{[1]} = n_{W}^{[1]} = 37 nH[1]=nW[1]=37 n c [ 1 ] = 10 n_{c}^{[1]} = 10 nc[1]=10 n c [ 1 ] n_{c}^{[1]} nc[1]等于第一层中过滤器的个数,这(37×37×10)是第一层激活值的维度。

在这里插入图片描述

假设还有另外一个卷积层,这次我们采用的过滤器是5×5的矩阵。在标记法中,神经网络下一层的 f = 5 f=5 f=5,即 f [ 2 ] = 5 f^{\left\lbrack 2 \right\rbrack} = 5 f[2]=5步幅为2,即 s [ 2 ] = 2 s^{\left\lbrack 2 \right\rbrack} = 2 s[2]=2padding为0,即 p [ 2 ] = 0 p^{\left\lbrack 2 \right\rbrack} = 0 p[2]=0,且有20个过滤器。所以其输出结果会是一张新图像,这次的输出结果为17×17×20,因为步幅是2,维度缩小得很快,大小从37×37减小到17×17,减小了一半还多,过滤器是20个,所以通道数也是20,17×17×20即激活值 a [ 2 ] a^{\left\lbrack 2 \right\rbrack} a[2]的维度。因此 n H [ 2 ] = n W [ 2 ] = 17 n_{H}^{\left\lbrack 2 \right\rbrack} = n_{W}^{\left\lbrack 2 \right\rbrack} = 17 nH[2]=nW[2]=17 n c [ 2 ] = 20 n_{c}^{\left\lbrack 2 \right\rbrack} = 20 nc[2]=20

在这里插入图片描述

我们来构建最后一个卷积层,假设过滤器还是5×5,步幅为2,即 f [ 2 ] = 5 f^{\left\lbrack 2 \right\rbrack} = 5 f[2]=5 s [ 3 ] = 2 s^{\left\lbrack 3 \right\rbrack} = 2 s[3]=2,计算过程我跳过了,最后输出为7×7×40,假设使用了40个过滤器。padding为0,40个过滤器,最后结果为7×7×40。

在这里插入图片描述

到此,这张39×39×3的输入图像就处理完毕了,为图片提取了7×7×40个特征,计算出来就是1960个特征。然后对该卷积进行处理,可以将其平滑或展开成1960个单元。平滑处理后可以输出一个向量,其填充内容是logistic回归单元还是softmax回归单元,完全取决于我们是想识图片上有没有猫,还是想识别 K K K种不同对象中的一种,用 y ^ \hat y y^表示最终神经网络的预测输出。明确一点,最后这一步是处理所有数字,即全部的1960个数字,把它们展开成一个很长的向量。为了预测最终的输出结果,我们把这个长向量填充到softmax回归函数中。

这是卷积神经网络的一个典型范例,设计卷积神经网络时,确定这些超参数比较费工夫。要决定过滤器的大小、步幅、padding以及使用多少个过滤器。这周和下周,我会针对选择参数的问题提供一些建议和指导。

在这里插入图片描述

而这节课你要掌握的一点是,随着神经网络计算深度不断加深,通常开始时的图像也要更大一些,初始值为39×39,高度和宽度会在一段时间内保持一致,然后随着网络深度的加深而逐渐减小,从39到37,再到17,最后到7。而通道数量在增加,从3到10,再到20,最后到40。在许多其它卷积神经网络中,你也可以看到这种趋势。关于如何确定这些参数,后面课上我会更详细讲解,这是我们讲的第一个卷积神经网络示例。

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

在这里插入图片描述

再次恭喜你已经掌握了第一个卷积神经网络,本周后几节课,我们会学习如何训练这些卷积神经网络。不过在这之前,我还要简单介绍一下池化层和全连接层。然后再训练这些网络,到时我会用到大家熟悉的反向传播训练方法。那么下节课,我们就先来了解如何构建神经网络的池化层。

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 f=2,步幅是2,即 s = 2 s=2 s=2

在这里插入图片描述

这是对最大池化功能的直观理解,你可以把这个4×4输入看作是某些特征的集合,也许不是。你可以把这个4×4区域看作是某些特征的集合,也就是神经网络中某一层的非激活值集合。数字大意味着可能探测到了某些特定的特征,左上象限具有的特征可能是一个垂直边缘,一只眼睛,或是大家害怕遇到的CAP特征。显然左上象限中存在这个特征,这个特征可能是一只猫眼探测器。然而,右上象限并不存在这个特征。最大化操作的功能就是只要在任何一个象限内提取到某个特征,它都会保留在最大化的池化输出里。所以最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,可能在右上象限中不存在这个特征,那么其中的最大值也还是很小,这就是最大池化的直观理解。

必须承认,人们使用最大池化的主要原因是此方法在很多实验中效果都很好。尽管刚刚描述的直观理解经常被引用,不知大家是否完全理解它的真正原因,不知大家是否理解最大池化效率很高的真正原因。

其中一个有意思的特点就是,它有一组超参数,但并没有参数需要学习。实际上,梯度下降没有什么可学的,一旦确定了 f f f s s s,它就是一个固定运算,梯度下降无需改变任何值。

我们来看一个有若干个超级参数的示例,输入是一个5×5的矩阵。我们采用最大池化法,它的过滤器参数为3×3,即 f = 3 f=3 f=3,步幅为1, s = 1 s=1 s=1,输出矩阵是3×3.之前讲的计算卷积层输出大小的公式同样适用于最大池化,即 n + 2 p − f s + 1 \frac{n + 2p - f}{s} + 1 sn+2pf+1,这个公式也可以计算最大池化的输出大小。

在这里插入图片描述

此例是计算3×3输出的每个元素,我们看左上角这些元素,注意这是一个3×3区域,因为有3个过滤器,取最大值9。然后移动一个元素,因为步幅是1,蓝色区域的最大值是9.继续向右移动,蓝色区域的最大值是5。然后移到下一行,因为步幅是1,我们只向下移动一个格,所以该区域的最大值是9。这个区域也是9。这两个区域的最大值都是5。最后这三个区域的最大值分别为8,6和9。超参数 f = 3 f=3 f=3 s = 1 s=1 s=1,最终输出如图所示。

在这里插入图片描述

以上就是一个二维输入的最大池化的演示,如果输入是三维的,那么输出也是三维的。例如,输入是5×5×2,那么输出是3×3×2。计算最大池化的方法就是分别对每个通道执行刚刚的计算过程。如上图所示,第一个通道依然保持不变。对于第二个通道,我刚才画在下面的,在这个层做同样的计算,得到第二个通道的输出。一般来说,如果输入是5×5× n c n_{c} nc,输出就是3×3× n c n_{c} nc n c n_{c} nc个通道中每个通道都单独执行最大池化计算,以上就是最大池化算法。

在这里插入图片描述

另外还有一种类型的池化,平均池化,它不太常用。我简单介绍一下,这种运算顾名思义,选取的不是每个过滤器的最大值,而是平均值。示例中,紫色区域的平均值是3.75,后面依次是1.25、4和2。这个平均池化的超级参数 f = 2 f=2 f=2 s = 2 s=2 s=2,我们也可以选择其它超级参数。

在这里插入图片描述

目前来说,最大池化比平均池化更常用。但也有例外,就是深度很深的神经网络,你可以用平均池化来分解规模为7×7×1000的网络的表示层,在整个空间内求平均值,得到1×1×1000,一会我们看个例子。但在神经网络中,最大池化要比平均池化用得更多。

总结一下,池化的超级参数包括过滤器大小 f f f和步幅 s s s,常用的参数值为 f = 2 f=2 f=2 s = 2 s=2 s=2,应用频率非常高,其效果相当于高度和宽度缩减一半。也有使用 f = 3 f=3 f=3 s = 2 s=2 s=2的情况。至于其它超级参数就要看你用的是最大池化还是平均池化了。你也可以根据自己意愿增加表示padding的其他超级参数,虽然很少这么用。最大池化时,往往很少用到超参数padding,当然也有例外的情况,我们下周会讲。大部分情况下,最大池化很少用padding。目前 p p p最常用的值是0,即 p = 0 p=0 p=0。最大池化的输入就是 n H × n W × n c n_{H} \times n_{W} \times n_{c} nH×nW×nc,假设没有padding,则输出 ⌊ n H − f s + 1 ⌋ × ⌊ n w − f s + 1 ⌋ × n c \lfloor\frac{n_{H} - f}{s} +1\rfloor \times \lfloor\frac{n_{w} - f}{s} + 1\rfloor \times n_{c} snHf+1×snwf+1×nc。输入通道与输出通道个数相同,因为我们对每个通道都做了池化。需要注意的一点是,池化过程中没有需要学习的参数。执行反向传播时,反向传播没有参数适用于最大池化。只有这些设置过的超参数,可能是手动设置的,也可能是通过交叉验证设置的。

在这里插入图片描述

除了这些,池化的内容就全部讲完了。最大池化只是计算神经网络某一层的静态属性,没有什么需要学习的,它只是一个静态属性。

关于池化我们就讲到这儿,现在我们已经知道如何构建卷积层和池化层了。下节课,我们会分析一个更复杂的可以引进全连接层的卷积网络示例。

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 f=2 f=2 s = 2 s=2 s=2,因为padding为0,我就不写出来了。现在开始构建池化层,最大池化使用的过滤器为2×2,步幅为2,表示层的高度和宽度会减少一半。因此,28×28变成了14×14,通道数量保持不变,所以最终输出为14×14×6,将该输出标记为POOL1

在这里插入图片描述

人们发现在卷积神经网络文献中,卷积有两种分类,这与所谓层的划分存在一致性。一类卷积是一个卷积层和一个池化层一起作为一层,这就是神经网络的Layer1。另一类卷积是把卷积层作为一层,而池化层单独作为一层。人们在计算神经网络有多少层时,通常只统计具有权重和参数的层。因为池化层没有权重和参数,只有一些超参数。这里,我们把CONV1POOL1共同作为一个卷积,并标记为Layer1。虽然你在阅读网络文章或研究报告时,你可能会看到卷积层和池化层各为一层的情况,这只是两种不同的标记术语。一般我在统计网络层数时,只计算具有权重的层,也就是把CONV1POOL1作为Layer1。这里我们用CONV1POOL1来标记,两者都是神经网络Layer1的一部分,POOL1也被划分在Layer1中,因为它没有权重,得到的输出是14×14×6。

在这里插入图片描述

我们再为它构建一个卷积层,过滤器大小为5×5,步幅为1,这次我们用10个过滤器,最后输出一个10×10×10的矩阵,标记为CONV2

在这里插入图片描述

然后做最大池化,超参数 f = 2 f=2 f=2 s = 2 s=2 s=2。你大概可以猜出结果, f = 2 f=2 f=2 s = 2 s=2 s=2,高度和宽度会减半,最后输出为5×5×10,标记为POOL2,这就是神经网络的第二个卷积层,即Layer2

在这里插入图片描述

如果对Layer1应用另一个卷积层,过滤器为5×5,即 f = 5 f=5 f=5,步幅是1,padding为0,所以这里省略了,过滤器16个,所以CONV2输出为10×10×16。我们看看CONV2,这是CONV2层。

在这里插入图片描述

继续执行做大池化计算,参数 f = 2 f=2 f=2 s = 2 s=2 s=2,你能猜到结果么?对10×10×16输入执行最大池化计算,参数 f = 2 f=2 f=2 s = 2 s=2 s=2,高度和宽度减半,计算结果猜到了吧。最大池化的参数 f = 2 f=2 f=2 s = 2 s=2 s=2,输入的高度和宽度会减半,结果为5×5×16,通道数和之前一样,标记为POOL2。这是一个卷积,即Layer2,因为它只有一个权重集和一个卷积层CONV2

在这里插入图片描述

5×5×16矩阵包含400个元素,现在将POOL2平整化为一个大小为400的一维向量。我们可以把平整化结果想象成这样的一个神经元集合,然后利用这400个单元构建下一层。下一层含有120个单元,这就是我们第一个全连接层,标记为FC3。这400个单元与120个单元紧密相连,这就是全连接层。它很像我们在第一和第二门课中讲过的单神经网络层,这是一个标准的神经网络。它的权重矩阵为 W [ 3 ] W^{\left\lbrack 3 \right\rbrack} W[3],维度为120×400。这就是所谓的“全连接”,因为这400个单元与这120个单元的每一项连接,还有一个偏差参数。最后输出120个维度,因为有120个输出。

然后我们对这个120个单元再添加一个全连接层,这层更小,假设它含有84个单元,标记为FC4

在这里插入图片描述

最后,用这84个单元填充一个softmax单元。如果我们想通过手写数字识别来识别手写0-9这10个数字,这个softmax就会有10个输出。

此例中的卷积神经网络很典型,看上去它有很多超参数,关于如何选定这些参数,后面我提供更多建议。常规做法是,尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,那么它也有可能适用于你自己的应用程序,这块下周我会细讲。

在这里插入图片描述

现在,我想指出的是,随着神经网络深度的加深,高度 n H n_{H} nH和宽度 n W n_{W} nW通常都会减少,前面我就提到过,从32×32到28×28,到14×14,到10×10,再到5×5。所以随着层数增加,高度和宽度都会减小,而通道数量会增加,从3到6到16不断增加,然后得到一个全连接层。

在神经网络中,另一种常见模式就是一个或多个卷积后面跟随一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个softmax。这是神经网络的另一种常见模式。

接下来我们讲讲神经网络的激活值形状,激活值大小和参数数量。输入为32×32×3,这些数做乘法,结果为3072,所以激活值 a [ 0 ] a^{[0]} a[0]有3072维,激活值矩阵为32×32×3,输入层没有参数。计算其他层的时候,试着自己计算出激活值,这些都是网络中不同层的激活值形状和激活值大小。

在这里插入图片描述

有几点要注意,第一,池化层和最大池化层没有参数;第二卷积层的参数相对较少,前面课上我们提到过,其实许多参数都存在于神经网络的全连接层。观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为6000,然后减少到1600,慢慢减少到84,最后输出softmax结果。我们发现,许多卷积网络都具有这些属性,模式上也相似。

神经网络的基本构造模块我们已经讲完了,一个卷积神经网络包括卷积层、池化层和全连接层。许多计算机视觉研究正在探索如何把这些基本模块整合起来,构建高效的神经网络,整合这些基本模块确实需要深入的理解。根据我的经验,找到整合基本构造模块最好方法就是大量阅读别人的案例。下周我会演示一些整合基本模块,成功构建高效神经网络的具体案例。我希望下周的课程可以帮助你找到构建有效神经网络的感觉,或许你也可以将别人开发的框架应用于自己的应用程序,这是下周的内容。下节课,也是本周最后一节课,我想花点时间讨论下,为什么大家愿意使用卷积,使用卷积的好处和优势是什么,以及如何整合多个卷积,如何检验神经网络,如何在训练集上训练神经网络来识别图片或执行其他任务,我们下节课继续讲。

1.11 为什么使用卷积?(Why convolutions?)

这是本周最后一节课,我们来分析一下卷积在神经网络中如此受用的原因,然后对如何整合这些卷积,如何通过一个标注过的训练集训练卷积神经网络做个简单概括。和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接,举例说明一下。

在这里插入图片描述

假设有一张32×32×3维度的图片,这是上节课的示例,假设用了6个大小为5×5的过滤器,输出维度为28×28×6。32×32×3=3072,28×28×6=4704。我们构建一个神经网络,其中一层含有3072个单元,下一层含有4074个单元,两层中的每个神经元彼此相连,然后计算权重矩阵,它等于4074×3072≈1400万,所以要训练的参数很多。虽然以现在的技术,我们可以用1400多万个参数来训练网络,因为这张32×32×3的图片非常小,训练这么多参数没有问题。如果这是一张1000×1000的图片,权重矩阵会变得非常大。我们看看这个卷积层的参数数量,每个过滤器都是5×5,一个过滤器有25个参数,再加上偏差参数,那么每个过滤器就有26个参数,一共有6个过滤器,所以参数共计156个,参数数量还是很少。

卷积网络映射这么少参数有两个原因:

一是参数共享。观察发现,特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。也就是说,如果你用一个3×3的过滤器检测垂直边缘,那么图片的左上角区域,以及旁边的各个区域(左边矩阵中蓝色方框标记的部分)都可以使用这个3×3的过滤器。每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取垂直边缘或其它特征。它不仅适用于边缘特征这样的低阶特征,同样适用于高阶特征,例如提取脸上的眼睛,猫或者其他特征对象。即使减少参数个数,这9个参数同样能计算出16个输出。直观感觉是,一个特征检测器,如垂直边缘检测器用于检测图片左上角区域的特征,这个特征很可能也适用于图片的右下角区域。因此在计算图片左上角和右下角区域时,你不需要添加其它特征检测器。假如有一个这样的数据集,其左上角和右下角可能有不同分布,也有可能稍有不同,但很相似,整张图片共享特征检测器,提取效果也很好。

在这里插入图片描述

第二个方法是使用稀疏连接,我来解释下。这个0是通过3×3的卷积计算得到的,它只依赖于这个3×3的输入的单元格,右边这个输出单元(元素0)仅与36个输入特征中9个相连接。而且其它像素值都不会对输出产生任影响,这就是稀疏连接的概念。

在这里插入图片描述

再举一个例子,这个输出(右边矩阵中红色标记的元素 30)仅仅依赖于这9个特征(左边矩阵红色方框标记的区域),看上去只有这9个输入特征与输出相连接,其它像素对输出没有任何影响。

神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。你们也可能听过,卷积神经网络善于捕捉平移不变。通过观察可以发现,向右移动两个像素,图片中的猫依然清晰可见,因为神经网络的卷积结构使得即使移动几个像素,这张图片依然具有非常相似的特征,应该属于同样的输出标记。实际上,我们用同一个过滤器生成各层中,图片的所有像素值,希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性。

这就是卷积或卷积网络在计算机视觉任务中表现良好的原因。

在这里插入图片描述

最后,我们把这些层整合起来,看看如何训练这些网络。比如我们要构建一个猫咪检测器,我们有下面这个标记训练集, x x x表示一张图片, y ^ \hat{y} y^是二进制标记或某个重要标记。我们选定了一个卷积神经网络,输入图片,增加卷积层和池化层,然后添加全连接层,最后输出一个softmax,即 y ^ \hat{y} y^。卷积层和全连接层有不同的参数 w w w和偏差 b b b,我们可以用任何参数集合来定义代价函数。一个类似于我们之前讲过的那种代价函数,并随机初始化其参数 w w w b b b,代价函数 J J J等于神经网络对整个训练集的预测的损失总和再除以 m m m(即 Cost  J = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) \text{Cost}\ J = \frac{1}{m}\sum_{i = 1}^{m}{L(\hat{y}^{(i)},y^{(i)})} Cost J=m1i=1mL(y^(i),y(i)))。所以训练神经网络,你要做的就是使用梯度下降法,或其它算法,例如Momentum梯度下降法,含RMSProp或其它因子的梯度下降来优化神经网络中所有参数,以减少代价函数 J J J的值。通过上述操作你可以构建一个高效的猫咪检测器或其它检测器。

恭喜你完成了这一周的课程,你已经学习了卷积神经网络的所有基本构造模块,以及如何在高效图片识别系统中整合这些模块。透过本周编程练习,你可以更加具体了解这些概念,试着整合这些构造模块,并用它们解决自己的问题。

下周,我们将继续深入学习卷积神经网络。我曾提到卷积神经网络中有很多超参数,下周,我打算具体展示一些最有效的卷积神经网络示例,你也可以尝试去判断哪些网络架构类型效率更高。人们通常的做法是将别人发现和发表在研究报告上的架构应用于自己的应用程序。下周看过更多具体的示例后,相信你会做的更好。此外,下星期我们也会深入分析卷积神经网络如此高效的原因,同时讲解一些新的计算机视觉应用程序,例如,对象检测和神经风格迁移以及如何利用这些算法创造新的艺术品形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值