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

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

1.1 计算机视觉(Computer vision)

所以即使你在计算机视觉方面没有做出成果,我也希望你也可以将所学的知识应用到其他算法和结构。
你应该早就听说过图片分类,或者说图片识别。比如给出这张 64×64 的图片,让计算机去分辨出这是一只猫。
 
 
还有一个例子,在计算机视觉中有个问题叫做目标检测,比如在一个无人驾驶项目中, 你不一定非得识别出图片中的物体是车辆,但你需要计算出其他车辆的位置,以确保自己能 够避开它们。
 
 
所以在目标检测项目中,首先需要计算出图中有哪些物体,比如汽车,还有图 片中的其他东西,再将它们模拟成一个个盒子,或用一些其他的技术识别出它们在图片中的 位置。注意在这个例子中,在一张图片中同时有多个车辆,每辆车相对与你来说都有一个确切的距离。
 
 
还有一个更有趣的例子,就是神经网络实现的图片风格迁移,比如说你有一张图片,但你想将这张图片转换为另外一种风格。所以图片风格迁移,就是你有一张满意的图片和一张 风格图片,实际上右边这幅画是毕加索的画作,而你可以利用神经网络将它们融合到一起, 描绘出一张新的图片。它的整体轮廓来自于左边,却是右边的风格,最后生成下面这张图片。 这种神奇的算法创造出了新的艺术风格,所以在这门课程中,你也能通过学习做到这样的事情。
 
 
但在应用计算机视觉时要面临一个挑战,就是数据的输入可能会非常大。
 
如果你要操作更大的图片,比如一张 1000×1000 的图片,它足有 1 兆那么大,但是特征向量的维度达到了 1000×1000×3 ,因为有 3 RGB 通道,所以数字将会是 300 万。如果你在尺寸很小的屏幕上观察,可能察觉不出上面的图片只有 64×64 那么大,而下面一张是 1000×1000 的大图。
 
 
如果你要输入 300 万的数据量,这就意味着,特征向量 𝑥 的维度高达 300 万。所以在第 一隐藏层中,你也许会有 1000 个隐藏单元,而所有的权值组成了矩阵 𝑊 [1] 。如果你使用了 标准的全连接网络,就像我们在第一门和第二门的课程里说的,这个矩阵的大小将会是 1000×300 万。因为现在 𝑥 的维度为 3𝑚 3𝑚 通常用来表示 300 万。这意味着矩阵 𝑊 [1] 会有 30 亿个参数,这是个非常巨大的数字。在参数如此大量的情况下,难以获得足够的数据来防止 神经网络发生过拟合和竞争需求,要处理包含 30 亿参数的神经网络,巨大的内存需求让人 不太能接受。
 
但对于计算机视觉应用来说,你肯定不想它只处理小图片,你希望它同时也要能处理大 图。为此,你需要进行卷积计算,它是卷积神经网络中非常重要的一块。我将用 边缘检测 的例子来向你说明卷积的含义。
 
 

1.2 边缘检测示例(Edge detection example)

卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。
 
 
我说过神经网络的前几层是如何检测边缘的,然后,后面的层有可能 检测到物体的部分区域更靠后的一些层可能检测到完整的物体,这个例子中就是人脸。
 
        给了这样一张图片,让电脑去搞清楚这张照片里有什么物体,你可能做的第一件事是检测图片中的垂直边缘。比如说,在这张图片中的栏杆就对应垂直线,与此 同时,这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,你 可能也想检测水平边缘,比如说这些栏杆就是很明显的水平线,它们也能被检测到,结果在 这。 所以如何在图像中检测这些边缘?
 
 
看一个例子,这是一个 6×6 的灰度图像。因为是灰度图像,所以它是 6×6×1 的矩阵,而 不是 6×6×3 的,因为没有 RGB 三通道。为了检测图像中的垂直边缘,你可以构造一个 3×3 矩阵。在共用习惯中,在卷积神经网络的术语中,它被称为过滤器。我要构造一个 3×3 的过滤器,像这样
 
在论文它有时候会被称为核,而不是过滤器,但在这个视频中,我将使用过滤器这个术语。对这个 6×6 的图像进行卷积运算,卷积运算用 “∗” 来表示,用 3×3 的过滤器对其进行卷积.
 
 
有一些问题,在数学中 就是卷积的标准标志,但是在 Python 中,这个标识常常被用来表示乘法或者元素乘法。所以这个“ 有多层含义,它是一个重载符号, 在这个视频中,当“ 表示卷积的时候我会特别说明。
 
 
 
这个卷积运算的输出将会是一个 4×4 的矩阵,你可以将它看成一个 4×4 的图像。下面来 说明是如何计算得到这个 4×4 矩阵的。为了计算第一个元素,在 4×4 左上角的那个元素,使 用 3×3 的过滤器,将其覆盖在输入图像,如下图所示。然后进行 元素乘法(element-wise products)运算 ,所以
 
 
然后将该矩阵每个元素相加得到最左上角的元素,即 3 + 1 + 2 + 0 + 0 + 0 + (−1) + (−8) + (−2) = −5
 
 
 
把这 9 个数加起来得到 - 5 ,当然,你可以把这 9 个数按任何顺序相加,我只是先写了第 一列,然后第二列,第三列。
接下来,为了弄明白第二个元素是什么,你要把蓝色的方块,向右移动一步,像这样, 把这些绿色的标记去掉:
 
继续做同样的元素乘法,然后加起来,所以是 0 × 1 + 5 × 1 + 7 × 1 + 1 × 0 + 8 × 0 + 2 × 0 + 2 × (−1) + 9 × (−1) + 5 × (−1)=-4
 
 
接下来也是一样,继续右移一步,把 9 个数的点积加起来得到 0
 
 
接下来为了得到下一行的元素,现在把蓝色块下移,现在蓝色块在这个位置:
 
 
 
      为了说得更清楚一点,这个 -16 是通过底部右下角的 3×3 区域得到的。 因此 6×6 矩阵和 3×3 矩阵进行卷积运算得到 4×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)

你已经见识到用卷积运算实现垂直边缘检测, 你将学习如何区分正边和负边这实际就是由亮到暗与由暗到亮的区别,也就是边缘的过渡。你还能了解到其他类型的边缘检测以及如何去实现这些算法,而不要总想着去自己编写一个边缘检测程序,让我们开 始吧。
 
 
 
还是上一个视频中的例子,这张 6×6 的图片,左边较亮,而右边较暗,将它与垂直边缘 检测滤波器进行卷积,检测结果就显示在了右边这幅图的中间部分。
 
 
 
现在这幅图有什么变化呢?它的颜色被翻转了,变成了左边比较暗,而右边比较亮。现在亮度为 10 的点跑到了右边,为 0 的点则跑到了左边。如果你用它与相同的过滤器进行卷积,最后得到的图中间会是-30 ,而不是 30 。如果你将矩阵转换为图片,就会是该矩阵下面 图片的样子。现在中间的过渡部分被翻转了,之前的 30 翻转成了 -30 表明是由暗向亮过渡, 而不是由亮向暗过渡。
 
 
 
如果你不在乎这两者的区别,你可以取出矩阵的绝对值。但这个特定的过滤器确实可以为我们区分这两种明暗变化的区别。
再来看看更多的边缘检测的例子,我们已经见过这个 3×3 的过滤器,它可以检测出垂直的边缘。所以,看到右边这个过滤器,我想你应该猜出来了,它能让你检测出水平的边缘。 提醒一下,一个垂直边缘过滤器是一个 3×3 的区域,它的左边相对较亮,而右边相对较暗。 相似的,右边这个水平边缘过滤器也是一个 3×3 的区域,它的上边相对较亮,而下方相对较暗。
 
 
 
这里还有个更复杂的例子,左上方和右下方都是亮度为 10 的点。如果你将它绘成图片, 右上角是比较暗的地方,这边都是亮度为 0 的点,我把这些比较暗的区域都加上阴影。而左 上方和右下方都会相对较亮。如果你用这幅图与水平边缘过滤器卷积,就会得到右边这个矩阵。
 
 
再举个例子,这里的 30 右边矩阵中绿色方框标记元素)代表了左边这块 3×3 的区域 (左边矩阵 绿色 方框标记部分),这块区域确实是上边比较亮,而下边比较暗的,所以它在这里发现了一条正边缘。而这里的-30 右边矩阵中紫色方框标记元素 )又代表了左边另一块区域(左边矩阵紫色方框标记部分),这块区域确实是底部比较亮,而上边则比较暗,所以在这里它是一条负边。
 
 
 
再次强调,我们现在所使用的都是相对很小的图片,仅有 6×6 。但这些中间的数值,比如说这个 10 (右边矩阵中 黄色 方框标记元素)代表的是左边这块区域(左边 6×6 矩阵中黄色方框标记的部分)。这块区域 左边两列是正边,右边一列是负边,正边和负边的值加在一起得到了一个中间值。但假如这个一个非常大的 1000×1000 的类似这样棋盘风格的大图,就不会出现这些亮度为 10 的过渡带了,因为图片尺寸很大,这些中间值就会变得非常小。 总而言之,通过使用不同的过滤器,你可以找出垂直的或是水平的边缘。但事实上,对于这个 3×3 的过滤器来说,我们使用了其中的一种数字组合。
 
 
 
 
 
比这种单纯的垂直边缘和水平边缘,它可以检测出 45°70°73° 甚至是任何角度的边缘 所以将矩阵的所有数字都设置为参数,通过数据反馈,让神经网络自动去学习它们,我们会发现神经网络可以学习一些低级的特征,例如这些边缘的特征 。尽管比起那些研究者们,我们要更费劲一些,但确实可以动手写出这些东西。不过构成这些计算的基础依然是卷积运算,
使得反向传播算法能够让神经网络学习任何它所需要的 3×3 的过滤器,并在整幅图片上去 应用它。这里,这里,还有这里(左边矩阵蓝色方框标记部分),去输出这些,任何它所检测到的特征,不管是垂直的边缘,水平的边缘,还有其他奇怪角度的边缘,甚至是其它的连名字都没有的过滤器。
 
所以这种将这 9 个数字当成参数的思想,已经成为计算机视觉中最为有效的思想之一。在接下来的课程中,也就是下个星期,我们将详细去探讨如何使用反向传播去让神经网络学习这 9 个数字。但在此之前,我们需要先讨论一些其它细节,比如一些基础的卷积运算的变量。在下面两节视频中,我将与你们讨论如何去使用 padding ,以及卷积各种不同的发展, 这两节内容将会是卷积神经网络中卷积模块的重要组成部分,所以我们下节视频再见。
 

1.4 Padding

为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是 padding ,让我们 来看看它是如何工作的。

 

 如果你用一个 3×3 的过滤器卷积一个 6×6 的图像,你最后会得到一个 4×4 的输出,也就是一个 4×4 矩阵。那是因为你的 3×3 过滤器在 6×6 矩阵中,只可能有 4×4 种可能的位置。这背后的数学解释是,如果我们有一个 𝑛 × 𝑛的图像,用𝑓 × 𝑓的过滤器做卷积,那么输出的维度就是(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1) 。在这个例子里是 6 − 3 + 1 = 4 , 因此得到了一个 4×4 的输出。

 

 

这样的话会有两个缺点 第一 个缺点是每次做卷积操作,你的图像就会缩小,从 6×6 缩小到 4×4 ,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有 1×1 的大小。 
 
第二 个缺点时,如果你注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输出所触碰或者使用,因为它位于这个 3×3 的区域的一角。但如果是在中间的像素点,比如这个(红色方框标记),就会有许多 3×3 的区域与之重叠。所以那些在角落或者边缘区域的像 素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。
 
 
 
为了解决这两个问题, 一是输出缩小 。当我们建立深度神经网络时,你就会知道你为什么不希望每进行一步操作图像都会缩小。比如当你有 100 层深层的网络,如果图像每经过一层都缩小的话,经过 100 层网络后,你就会得到一个很小的图像,所以这是个问题。 另一个 问题是图像边缘的大部分信息都丢失了。
 
为了解决这些问题 你可以在卷积操作之前填充这幅图像 。在这个案例中,你可以沿着图像边缘再填充一层像素。如果你这样操作了,那么 6×6 的图像就被你填充成了一个 8×8 的图像。如果你用 3×3 的图像对这个 8×8 的图像卷积,你得到的输出就不是 4×4 的,而是 6×6的图像,你就得到了一个尺寸和原始图像 6×6 的图像。习惯上,你可以用 0 去填充,如果 𝑝 是填充的数量,在这个案例中,𝑝 = 1 ,因为我们在周围都填充了一个像素点,输出也就变 成了(𝑛 + 2𝑝 − 𝑓 + 1) × (𝑛 + 2𝑝 − 𝑓 + 1) ,所以就变成了 (6 + 2 × 1 − 3 + 1) × (6 + 2 × 1 − 3 + 1) = 6 × 6,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些
格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。
 
 
刚才我已经展示过用一个像素点来填充边缘,如果你想的话,也可以填充两个像素点, 也就是说在这里填充一层。实际上你还可以填充更多像素。我这里画的这种情况,填充后𝑝 = 2.
 
至于选择填充多少像素,通常有两个选择 ,分别叫做 Valid 卷积和 Same 卷积。 Valid 卷积意味着不填充,这样的话,如果你有一个 𝑛 × 𝑛 的图像,用一个 𝑓 × 𝑓 的过滤器 卷积,它将会给你一个(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1) 维的输出。这类似于我们在前面的视频中展 示的例子,有一个 6×6 的图像,通过一个 3×3 的过滤器,得到一个 4×4 的输出。
 
另一个经常被用到的填充方法 叫做 Same 卷积,那意味你填充后,你的输出大小和输入大小是一样的。根据这个公式𝑛 − 𝑓 + 1 ,当你填充 𝑝 个像素点, 𝑛 就变成了 𝑛 + 2𝑝 ,最后公式变为𝑛 + 2𝑝 − 𝑓 + 1 。因此如果你有一个 𝑛 × 𝑛 的图像,用 𝑝 个像素填充边缘,输出的大小就是这样的(𝑛 + 2𝑝 − 𝑓 + 1) × (𝑛 + 2𝑝 − 𝑓 + 1) 。如果你想让 𝑛 + 2𝑝 − 𝑓 + 1 = 𝑛 的话,使得输出和输入大小相等,如果你用这个等式求解𝑝 ,那么 𝑝 = (𝑓 − 1)/2 。所以当 𝑓 是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。这也是为什么前面的例子,当过滤器是 3×3 时,和上一张幻灯片的例子一样,使得输出尺寸等于输入尺寸,所需要的填充是(3-1)/2 ,也就是 1 个像素。另一个例子,当你的过滤器是 5×5 ,如果 𝑓 = 5,然后代入那个式子,你就会发现需要 2 层填充使得输出和输入一样大,这是过滤器 5×5 的情况。
 
        计算机视觉中,𝑓通常是奇数,甚至可能都是这样。 你很少看到一个偶数的过滤器在计算机视觉里使用,我认为有两个原因。 其中一个可能是 ,如果𝑓 是一个偶数,那么你只能使用一些不对称填充。只有 𝑓 是奇数的情况下,Same 卷积才会有自然的填充,我们可以以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。
第二个原因 是当你有一个奇数维过滤器,比如 3×3 或者 5×5 的,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更方便,便于指出过滤器的位置。 也许这些都不是为什么𝑓 通常是奇数的充分原因,但如果你看了卷积的文献,你经常会
看到 3×3 的过滤器,你也可能会看到一些 5×5 7×7 的过滤器。后面我们也会谈到 1×1 的过 滤器,以及什么时候它是有意义的。但是习惯上,我推荐你只使用奇数的过滤器。 
 

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
 
 
 
 
 
 
 
 
 
 
 
里(左边的图像矩阵),你要把这个翻转矩阵的元素相乘来计算输出的 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 了。
 
 
我们研究下这背后的细节,首先先换一张好看的图片。这个是 6×6×3 的图像,这个是 3×3×3 的过滤器,最后一个数字通道数必须和过滤器中的通道数相匹配。为了简化这个 3×3×3 过滤器的图像,我们不把它画成 3 个矩阵的堆叠,而画成这样,一个三维的立方体。
 
为了计算这个卷积操作的输出,你要做的就是把这个 3×3×3 的过滤器先放到最左上角的位置,这个 3×3×3 的过滤器有 27 个数, 27 个参数就是 3 的立方。依次取这 27 个数,然后乘以相应的红绿蓝通道中的数字。先取红色通道的前 9 个数字,然后是绿色通道,然后再是蓝色通道,乘以左边黄色立方体覆盖的对应的 27 个数,然后把这些数都加起来,就得到 了输出的第一个数字。
如果要计算下一个输出,你把这个立方体滑动一个单位,再与这 27 个数相乘,把它们都加起来,就得到了下一个输出,以此类推。
 
 
 
 
 
按照计算机视觉的惯例,当你的输入有特定的高宽和通道数时,你的过滤器可以有不同的高,不同的宽,但是必须一样的通道数。理论上,我们的过滤器只关注红色通道,或者只关注绿色或者蓝色通道也是可行的。
再注意一下这个卷积立方体,一个 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 的来源于我们用了两个不同的过滤器。
 
 
 
 
这个对立方体卷积的概念真的很有用,你现在可以用它的一小部分直接在三个通道的 RGB 图像上进行操作。更重要的是,你可以检测两个特征,比如垂直和水平边缘或者 10 个 或者 128 个或者几百个不同的特征,并且输出的通道数会等于你要检测的特征数。 对于这里的符号,我一直用通道数(𝑛 𝑐 )来表示最后一个维度,在文献里大家也把它叫 做 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 矩阵,它是卷积神经网络的一层,把它映射到标准神经网络中四个卷积层中的某一层或者一个非卷积神经网络中。
 
 
这一部分(图中蓝色边框标记的部分)就是应用激活函数 ReLU 之前的值,它的作用类 似于𝑧 [1] ,最后应用非线性函数,得到的这个 4×4×2 矩阵,成为神经网络的下一层,也就是激活层。
这就是 𝑎 [0] 𝑎 [1] 的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差,然后应用激活函数 ReLU 。这样就通过神经网络的一层把一个6×6×3 的维度 𝑎 [0] 演化为一个 4×4×2 维度的 𝑎 [1] ,这就是卷积神经网络的一层。示例中我们有两个过滤器,也就是有两个特征,因此我们才最终得到一个 4×4×2 的输 出。但如果我们用了 10 个过滤器,而不是 2 个,我们最后会得到一个 4×4×10 维度的输出图像,因为我们选取了其中 10 个特征映射,而不仅仅是 2 个,将它们堆叠在一起,形成一个4×4×10 的输出图像,也就是 𝑎 [1]
 
 
 
 
 
为了加深理解,我们来做一个练习。假设你有 10 个过滤器,而不是 2 个,神经网络的一层是 3×3×3 ,那么,这一层有多少个参数呢?我们来计算一下,每一层都是一个 3×3×3 的矩阵,因此每个过滤器有 27 个参数,也就是 27 个数。然后加上一个偏差,用参数 𝑏 表示, 现在参数增加到 28 个。上一页幻灯片里我画了 2 个过滤器,而现在我们有 10 个,加在一起
28×10 ,也就是 280 个参数。
请注意一点,不论输入图片有多大, 1000×1000 也好, 5000×5000 也好,参数始终都是 280 个。用这 10 个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片 很大,参数却很少,这就是卷积神经网络的一个特征,叫作“ 避免过拟合 。你已经知道到如 何提取 10 个特征,可以应用到大图片中,而参数数量固定不变,此例中只有 28 个,相对较
少。 最后我们总结一下用于描述卷积神经网络中的一层(以𝑙 层为例),也就是卷积层的各 种标记。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他人是一面镜子,保持谦虚的态度

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值