目录
- [第四门课 卷积神经网络(Convolutional Neural Networks)](#第四门课 卷积神经网络(Convolutional Neural Networks))
-
- [第一周 卷积神经网络(Foundations of Convolutional Neural Networks)](#第一周 卷积神经网络(Foundations of Convolutional Neural Networks))
-
- [1.5 卷积步长(Strided convolutions)](#1.5 卷积步长(Strided convolutions))
- [1.6 三维卷积(Convolutions over volumes)](#1.6 三维卷积(Convolutions over volumes))
第四门课 卷积神经网络(Convolutional Neural Networks)
第一周 卷积神经网络(Foundations of Convolutional Neural Networks)
1.5 卷积步长(Strided convolutions)
卷积中的步幅是另一个构建卷积神经网络的基本操作,让我向你展示一个例子。
如果你想用 3×3 的过滤器卷积这个 7×7 的图像,和之前不同的是,我们把步幅设置成了2。你还和之前一样取左上方的 3×3 区域的元素的乘积,再加起来,最后结果为 91。
只是之前我们移动蓝框的步长是 1,现在移动的步长是 2,我们让过滤器跳过 2 个步长,注意一下左上角,这个点移动到其后两格的点,跳过了一个位置。然后你还是将每个元素相乘并求和,你将会得到的结果是 100。
现在我们继续,将蓝色框移动两个步长,你将会得到 83 的结果。当你移动到下一行的时候,你也是使用步长 2 而不是步长 1,所以我们将蓝色框移动到这里:
注意到我们跳过了一个位置,得到 69 的结果,现在你继续移动两个步长,会得到 91,127,最后一行分别是 44,72,74。
所以在这个例子中,我们用 3×3 的矩阵卷积一个 7×7 的矩阵,得到一个 3×3 的输出。输入和输出的维度是由下面的公式决定的。如果你用一个𝑓 × 𝑓的过滤器卷积一个𝑛 × 𝑛的图像,你的 padding 为𝑝,步幅为𝑠,在这个例子中𝑠 = 2,你会得到一个输出,因为现在你不是一次移动一个步子,而是一次移动𝑠个步子,输出于是变为:
n + 2 p − f s + 1 \frac{n+2p−f}{s}+ 1 sn+2p−f+1
在我们的这个例子里,𝑛 = 7,𝑝 = 0,𝑓 = 3,𝑠 = 2,7+0−3/2+ 1 = 3,即 3×3 的输出。
现在只剩下最后的一个细节了,如果商不是一个整数怎么办?在这种情况下,我们向下取整。⌊ ⌋这是向下取整的符号,这也叫做对𝑧进行地板除(floor),这意味着𝑧向下取整到最近的整数。这个原则实现的方式是,你只在蓝框完全包括在图像或填充完的图像内部时,才对它进行运算。如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作,这是一个惯例。你的 3×3 的过滤器必须完全处于图像中或者填充之后的图像区域内才输出相应结果,这就是惯例。因此正确计算输出维度的方法是向下取整,以免𝑛+2𝑝−𝑓𝑠不是整数。
总结一下维度情况,如果你有一个𝑛 × 𝑛的矩阵或者𝑛 × 𝑛的图像,与一个𝑓 × 𝑓的矩阵卷积,或者说𝑓 × 𝑓的过滤器。Padding 是𝑝,步幅为𝑠没输出尺寸就是这样:
可以选择所有的数使结果是整数是挺不错的,尽管一些时候,你不必这样做,只要向下取整也就可以了。你也可以自己选择一些𝑛,𝑓,𝑝和𝑠的值来验证这个输出尺寸的公式是对的。
在讲下一部分之前,这里有一个关于互相关和卷积的技术性建议,这不会影响到你构建卷积神经网络的方式,但取决于你读的是数学教材还是信号处理教材,在不同的教材里符号可能不一致。如果你看的是一本典型的数学教科书,那么卷积的定义是做元素乘积求和,实际上还有一个步骤是你首先要做的,也就是在把这个 6×6 的矩阵和 3×3 的过滤器卷积之前,首先你将 3×3 的过滤器沿水平和垂直轴翻转,所以 [ 3 4 5 1 0 2 − 1 9 7 ] \begin{bmatrix} 3&4&5\\1&0&2\\−1&9&7 \end{bmatrix} 31−1409527 变为 [ 7 2 5 9 0 4 − 1 1 3 ] \begin{bmatrix} 7&2&5\\9&0&4\\−1&1&3 \end{bmatrix} 79−1201543 这相当于将 3×3 的过滤器做了个镜像,在水平和垂直轴上(整理者注:此处应该是先顺时针旋转 90得到 [ − 1 1 3 9 0 4 7 2 5 ] \begin{bmatrix} -1&1&3\\9&0&4\\7&2&5\end{bmatrix} −197102345 ,再水平翻转得到( [ 7 2 5 9 0 4 − 1 1 3 ] \begin{bmatrix} 7&2&5\\9&0&4\\−1&1&3 \end{bmatrix} 79−1201543 )。然后你再把这个翻转后的矩阵复制到这里(左边的图像矩阵),你要把这个翻转矩阵的元素相乘来计算输出的 4×4 矩阵左上角的元素,如图所示。然后取这 9 个数字,把它们平移一个位置,再平移一格,以此类推。
所以我们在这些视频中定义卷积运算时,我们跳过了这个镜像操作。从技术上讲,我们实际上做的,我们在前面视频中使用的操作,有时被称为互相关(cross-correlation)而不是卷积(convolution)。但在深度学习文献中,按照惯例,我们将这(不进行翻转操作)叫做卷积操作。
总结来说,按照机器学习的惯例,我们通常不进行翻转操作。从技术上说,这个操作可能叫做互相关更好。但在大部分的深度学习文献中都把它叫做卷积运算,因此我们将在这些视频中使用这个约定。如果你读了很多机器学习文献的话,你会发现许多人都把它叫做卷积运算,不需要用到这些翻转。
事实证明在信号处理中或某些数学分支中,在卷积的定义包含翻转,使得卷积运算符拥有这个性质,即(𝐴 ∗ 𝐵) ∗ 𝐶 = 𝐴 ∗ (𝐵 ∗ 𝐶),这在数学中被称为结合律。这对于一些信号处理应用来说很好,但对于深度神经网络来说它真的不重要,因此省略了这个双重镜像操作,就简化了代码,并使神经网络也能正常工作。
根据惯例,我们大多数人都叫它卷积,尽管数学家们更喜欢称之为互相关,但这不会影响到你在编程练习中要实现的任何东西,也不会影响你阅读和理解深度学习文献。现在你已经看到了如何进行卷积,以及如何使用填充,如何在卷积中选择步幅。但到目前为止,我们所使用的是关于矩阵的卷积,例如 6×6 的矩阵。在下一集视频中,你将看到如何对立体进行卷积,这将会使你的卷积变得更加强大,让我们继续下一个视频。
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 了。
为了计算这个卷积操作的输出,你要做的就是把这个 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} 111000−1−1−1 ,和之前一样,而绿色通道全为 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} 111000−1−1−1 , [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix} 1&0&-1\\1&0&-1\\1&0&-1 \end{bmatrix} 111000−1−1−1 , [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix} 1&0&-1\\1&0&-1\\1&0&-1 \end{bmatrix} 111000−1−1−1 ,所有三个通道都是这样。所以通过设置第二个过滤器参数,你就有了一个边界检测器,3×3×3 的边界检测器,用来检测任意颜色通道里的边
界。参数的选择不同,你就可以得到不同的特征检测器,所有的都是 3×3×3 的过滤器。
按照计算机视觉的惯例,当你的输入有特定的高宽和通道数时,你的过滤器可以有不同的高,不同的宽,但是必须一样的通道数。理论上,我们的过滤器只关注红色通道,或者只关注绿色或者蓝色通道也是可行的。
再注意一下这个卷积立方体,一个 6×6×3 的输入图像卷积上一个 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 的来源于我们用了两个不同的过滤器。
我们总结一下维度,如果你有一个𝑛 × 𝑛 × 𝑛𝑐(通道数)的输入图像,在这个例子中就是 6×6×3,这里的𝑛𝑐就是通道数目,然后卷积上一个𝑓 × 𝑓 × 𝑛𝑐,这个例子中是 3×3×3,按照惯例,这个(前一个𝑛𝑐)和这个(后一个𝑛𝑐)必须数值相同。然后你就得到了(𝑛 − 𝑓 + 1)× (𝑛 − 𝑓 + 1) × 𝑛𝑐′,这里𝑛𝑐′其实就是下一层的通道数,它就是你用的过滤器的个数,在我们的例子中,那就是 4×4×2。我写下这个假设时,用的步幅为 1,并且没有 padding。如果你用了不同的步幅或者 padding,那么这个𝑛 − 𝑓 + 1数值会变化,正如前面的视频演示的那样。
这个对立方体卷积的概念真的很有用,你现在可以用它的一小部分直接在三个通道的RGB 图像上进行操作。更重要的是,你可以检测两个特征,比如垂直和水平边缘或者 10 个或者 128 个或者几百个不同的特征,并且输出的通道数会等于你要检测的特征数。对于这里的符号,我一直用通道数(𝑛𝑐)来表示最后一个维度,在文献里大家也把它叫做 3 维立方体的深度。这两个术语,即通道或者深度,经常被用在文献中。但我觉得深度容易让人混淆,因为你通常也会说神经网络的深度。所以,在这些视频里我会用通道这个术语来表示过滤器的第三个维度的大小。
所以你已经知道怎么对立方体做卷积了,你已经准备好了实现卷积神经其中一层了,在下个视频里让我们看看是怎么做的。