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

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

1.1 计算机视觉(Computer vision)

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

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

卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
我说过神经网络的前几层是如何检测边缘的,然后,后面的层有可能 检测到物体的部分区域更靠后的一些层可能检测到完整的物体,这个例子中就是人脸。
 
        给了这样一张图片,让电脑去搞清楚这张照片里有什么物体,你可能做的第一件事是检测图片中的垂直边缘。比如说,在这张图片中的栏杆就对应垂直线,与此 同时,这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,你 可能也想检测水平边缘,比如说这些栏杆就是很明显的水平线,它们也能被检测到,结果在 这。所以如何在图像中检测这些边缘?
 
 
看一个例子,这是一个 6×6 的灰度图像。因为是灰度图像,所以它是 6×6×1 的矩阵,而 不是 6×6×3 的,因为没有 RGB 三通道。为了检测图像中的垂直边缘,你可以构造一个 3×3 矩阵。在共用习惯中,在卷积神经网络的术语中,它被称为过滤器。我要构造一个 3×3 的过滤器,像这样
第四门课 卷积神经网络(Convolutional Neural Networks)
 
在论文它有时候会被称为核,而不是过滤器,但在这个视频中,我将使用过滤器这个术语。对这个 6×6 的图像进行卷积运算,卷积运算用“∗”来表示,用 3×3 的过滤器对其进行卷积.
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
有一些问题,在数学中就是卷积的标准标志,但是在 Python 中,这个标识常常被用来表示乘法或者元素乘法。所以这个“有多层含义,它是一个重载符号, 在这个视频中,当“表示卷积的时候我会特别说明。
 
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
这个卷积运算的输出将会是一个 4×4 的矩阵,你可以将它看成一个 4×4 的图像。下面来 说明是如何计算得到这个 4×4 矩阵的。为了计算第一个元素,在 4×4 左上角的那个元素,使 用 3×3 的过滤器,将其覆盖在输入图像,如下图所示。然后进行元素乘法(element-wise products)运算,所以
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
然后将该矩阵每个元素相加得到最左上角的元素,即3 + 1 + 2 + 0 + 0 + 0 + (−1) + (−8) + (−2) = −5
 
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
把这 9 个数加起来得到-5,当然,你可以把这 9 个数按任何顺序相加,我只是先写了第 一列,然后第二列,第三列。
接下来,为了弄明白第二个元素是什么,你要把蓝色的方块,向右移动一步,像这样, 把这些绿色的标记去掉:
 
第四门课 卷积神经网络(Convolutional Neural Networks)
继续做同样的元素乘法,然后加起来,所以是 0 × 1 + 5 × 1 + 7 × 1 + 1 × 0 + 8 × 0 + 2 × 0 + 2 × (−1) + 9 × (−1) + 5 × (−1)=-4
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
接下来也是一样,继续右移一步,把 9 个数的点积加起来得到 0
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
接下来为了得到下一行的元素,现在把蓝色块下移,现在蓝色块在这个位置:
 
 
第四门课 卷积神经网络(Convolutional Neural Networks)
第四门课 卷积神经网络(Convolutional Neural Networks)
 
      为了说得更清楚一点,这个-16 是通过底部右下角的 3×3 区域得到的。 因此 6×6 矩阵和 3×3 矩阵进行卷积运算得到 4×4 矩阵。这些图片和过滤器是不同维度的矩阵,但左边矩阵容易被理解为一张图片,中间的这个被理解为过滤器,右边的图片我们
可以理解为另一张图片。这个就是垂直边缘检测器,下一页中你就会明白。
      在往下讲之前,多说一句,如果你要使用编程语言实现这个运算,不同的编程语言有不 同的函数,而不是用“来表示卷积。所以在编程练习中,你会使用一个叫 conv_forward 的 函数。如果在 tensorflow 下,这个函数叫 tf.conv2d。在其他深度学习框架中,在后面的课程中,你将会看到 Keras 这个框架,在这个框架下用 Conv2D 实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。
 
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
为什么这个可以做垂直边缘检测呢? 让我们来看另外一个例子。为了讲清楚,我会用一个简单的例子。这是一个简单的 6×6 图像,左边的一半是 10,右边一般是 0。如果你把它当成一个图片,左边那部分看起来是白色的,像素值 10 是比较亮的像素值,右边像素值比较 暗,我使用灰色来表示 0,尽管它也可以被画成黑的。图片里,有一个特别明显的垂直边缘 在图像中间,这条垂直线是从黑到白的过渡线,或者从白色到深色。
 
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
 
第四门课 卷积神经网络(Convolutional Neural Networks)
 
 
如果把最右边的矩阵当成图像,它是这个样子。在中间有段亮一点的区域,对应检查到这个 6×6 图像中间的垂直边缘。这里的维数似乎有点不正确,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个 1000×1000 的图像,而不是 6×6 的图片,你会发现其会很好地检测出图像中的垂直边缘。在这个例子中,在输出图像中间的亮处,表示在图像 中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用 3×3 的矩阵(过滤器),所以垂直边缘是一个 3×3 的区域,左边是明亮的像素,中间的并不需要 考虑,右边是深色像素。在这个 6×6 图像的中间部分,明亮的像素在左边,深色的像素在右 边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘。 所以你已经了解卷积是怎么工作的,在下一个视频中,你将会看到如何使用卷积运算作为卷积神经网络的基本模块的。
 
 

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

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

1.4 Padding