吴恩达深度学习 | (16) 卷积神经网络专项课程第一周学习笔记

课程视频

第一周PPT汇总

吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第四部分卷积神经网络专项的第一周课程:卷积神经网络。

目录

1. 计算机视觉

2. 边缘检测示例

3. 更多边缘检测内容

4. Padding

5. 卷积步长

6. 三维卷积

7. 单层卷积网络

8. 简单卷积网络示例

9. 池化层

10. 卷积神经网络示例

11. 为什么使用卷积?


1. 计算机视觉

欢迎参加这次的卷积神经网络课程,计算机视觉是一个飞速发展的一个领域,这多亏了深度学习。深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们。还使得人脸识别技术变得更加效率和精准,你们即将能够体验到或早已体验过仅仅通过刷脸就能解锁手机或者门锁。当你解锁了手机,我猜手机上一定有很多分享图片的应用。 在上面,你能看到美食,酒店或美丽风景的图片。有些公司在这些应用上使用了深度学习技术来向你展示最为生动美丽以及与你最为相关的图片。机器学习甚至还催生了新的艺术类型。深度学习之所以让我兴奋有下面两个原因,我想你们也是这么想的。

第一,计算机视觉的高速发展标志着新型应用产生的可能,这是几年前,人们所不敢想象的。通过学习使用这些工具,你也许能够创造出新的产品和应用。

其次,即使到头来你未能在计算机视觉上有所建树,但我发现,人们对于计算机视觉的研究是如此富有想象力和创造力,由此衍生出新的神经网络结构与算法,这实际上启发人们去创造出计算机视觉与其他领域的交叉成果。举个例子,之前我在做语音识别的时候,我经常从计算机视觉领域中寻找灵感, 并将其应用于我的文献当中。所以即使你在计算机视觉方面没有做出成果,我也希望你也可以将所学的知识应用到其他算法和结构。就介绍到这儿, 让我们开始学习吧。

这是我们本节课将要学习的一些问题,你应该早就听说过图片分类,或者说图片识别。比如给出这张 64×64 的图片,让计算机去分辨出这是一只猫。

还有一个例子,在计算机视觉中有个问题叫做目标检测,比如在一个无人驾驶项目中, 你不一定非得识别出图片中的物体是车辆,但你需要计算出其他车辆的位置,以确保自己能够避开它们。所以在目标检测项目中,首先需要计算出图中有哪些物体,比如汽车,还有图片中的其他东西,再将它们模拟成一个个盒子,或用一些其他的技术识别出它们在图片中的位置。注意在这个例子中,在一张图片中同时有多个车辆,每辆车相对与你来说都有一个确切的距离。

还有一个更有趣的例子,就是神经网络实现的图片风格迁移,比如说你有一张图片,但你想将这张图片转换为另外一种风格。所以图片风格迁移,就是你有一张满意的图片和一张风格图片,实际上右边这幅画是毕加索的画作,而你可以利用神经网络将它们融合到一起, 描绘出一张新的图片。它的整体轮廓来自于左边,却是右边的风格,最后生成下面这张图片。 这种神奇的算法创造出了新的艺术风格,所以在这门课程中,你也能通过学习做到这样的事情。

过去的课程中,你们一般操作的都是 64×64 的小图片,实际上,它的数据量是 64×64×3,因为每张图片都有 3 个颜色通道。如果计算一下的话,可得知数据量为 12288,所以我们的特征向量𝑥维度为12288。这其实还好,因为 64×64 真的是很小的一张图片。

如果你要操作更大的图片,比如一张 1000×1000 的图片,它足有 1 兆那么大,但是特征向量的维度达到了 1000×1000×3,因为有 3 个 RGB 通道,所以数字将会是 300 万。如果你在尺寸很小的屏幕上观察,可能察觉不出上面的图片只有 64×64 那么大,而下面一张是 1000×1000 的大图。

如果你要输入 300 万的数据量,这就意味着,特征向量𝑥的维度高达 300 万。所以在第一隐藏层中,你也许会有 1000 个隐藏单元,而所有的权值组成了矩阵W^{[1]}.如果你使用了标准的全连接网络,就像我们之前学习的那样,这个矩阵的大小将会是 1000×300 万。因为现在𝑥的维度为3𝑚,3𝑚通常用来表示 300 万。这意味着矩阵W^{[1]}会有30 亿个参数,这是个非常巨大的数字。在参数如此大量的情况下,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,要处理包含 30 亿参数的神经网络,巨大的内存需求让人不太能接受。

但对于计算机视觉应用来说,你肯定不想它只处理小图片,你希望它同时也要能处理大图。为此,你需要进行卷积计算,它是卷积神经网络中非常重要的一块。下一讲,我会为你介绍如何进行这种运算,我将用边缘检测的例子来向你说明卷积的含义。

 

2. 边缘检测示例

卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。在本小节中,你会看到卷积是如何进行运算的。

在之前的视频中,我说过神经网络的前几层是如何检测边缘的,然后,后面的层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体,这个例子中就是人脸。在本小节中,你会看到如何在一张图片中进行边缘检测。

让我们举个例子,给了这样一张图片,让电脑去搞清楚这张照片里有什么物体,你可能做的第一件事是检测图片中的垂直边缘。比如说,在这张图片中的栏杆就对应垂直线,与此同时,这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,你可能也想检测水平边缘,比如说这些栏杆就是很明显的水平线,它们也能被检测到,结果在这。所以如何在图像中检测这些边缘?

看一个例子,这是一个 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 的过滤器,将其覆盖在输入图像,如下图所示。然后进行元素乘法:

然后将该矩阵每个元素相加得到最左上角的元素,即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。继续移得到8,验证下:2×1+9×1+5×1+7×0+3×0+1×0+4×(−1)+ 1 × (−1) + 3 × (−1) = 8。

接下来为了得到下一行的元素,现在把蓝色块下移,现在蓝色块在这个位置:

重复进行元素乘法,然后加起来。通过这样做得到-10。再将其右移得到-2,接着是 2, 3。以此类推,这样计算完矩阵中的其他元素。

为了说得更清楚一点,这个-16 是通过底部右下角的 3×3 区域得到的。

因此 6×6 矩阵和 3×3 矩阵进行卷积运算得到 4×4 矩阵。这些图片和过滤器是不同维度的矩阵,但左边矩阵容易被理解为一张图片,中间的这个被理解为过滤器,右边的图片我们可以理解为另一张图片。这个就是垂直边缘检测器。

在往下讲之前,多说一句,如果你要使用编程语言实现这个运算,不同的编程语言有不同的函数,而不是用“∗”来表示卷积。所以在编程练习中,你会使用一个叫 conv_forward 的函数。如果在 tensorflow 下,这个函数叫 tf.conv2d。在其他深度学习框架中,在后面的课程 中,你将会看到 Keras 这个框架,在这个框架下用 Conv2D 实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。

为什么这个可以做垂直边缘检测呢?让我们来看另外一个例子。为了讲清楚,我会用一个简单的例子。这是一个简单的 6×6 图像,左边的一半是 10,右边一般是 0。如果你把它当成一个图片,左边那部分看起来是白色的,像素值 10 是比较亮的像素值,右边像素值比较暗,我使用灰色来表示0,尽管它也可以被画成黑的。图片里,有一个特别明显的垂直边缘在图像中间,这条垂直线是从黑到白的过渡线,或者从白色到深色。

所以,当你用一个 3×3 过滤器进行卷积运算的时候,这个 3×3 的过滤器可视化为下面这 个样子,在左边有明亮的像素,然后有一个过渡,0 在中间,然后右边是深色的。卷积运算 后,你得到的是右边的矩阵。如果你愿意,可以通过数学运算去验证。举例来说,最左上角 的元素 0,就是由这个 3×3 块(绿色方框标记)经过元素乘积运算再求和得到的,10 × 1 + 10 × 1 + 10 × 1 + 10 × 0 + 10 × 0 + 10 × 0 + 10 × (−1) + 10 × (−1) + 10 × (−1) = 0。相反这个30 是由这个(红色方框标记)得到的,10×1+10×1+10×1+10×0+10×0+10×0+0×(−1)+0×(−1)+0× (−1) = 30。

如果把最右边的矩阵当成图像,它是这个样子。在中间有段亮一点的区域,对应检查到这个 6×6 图像中间的垂直边缘。这里的维数似乎有点不正确,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个 1000×1000 的图像,而不是 6×6 的图片,你会发现其会很好地检测出图像中的垂直边缘。在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用 3×3 的矩阵(过滤器),所以垂直边缘是一个 3×3 的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素。在这个 6×6 图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘。

所以你已经了解卷积是怎么工作的,在下一讲中,你将会看到如何使用卷积运算作为卷积神经网络的基本模块的。

 

3. 更多边缘检测内容

你已经见识到用卷积运算实现垂直边缘检测,在本小节中,你将学习如何区分正边和负边,这实际就是由亮到暗与由暗到亮的区别,也就是边缘的过渡。你还能了解到其他类型的边缘检测以及如何去实现这些算法,而不要总想着去自己编写一个边缘检测程序,让我们开始吧。

还是上一小节中的例子,这张 6×6 的图片,左边较亮,而右边较暗,将它与垂直边缘检测滤波器进行卷积,检测结果就显示在了右边这幅图的中间部分。

现在这幅图有什么变化呢?它的颜色被翻转了,变成了左边比较暗,而右边比较亮。现在亮度为 10 的点跑到了右边,为 0 的点则跑到了左边。如果你用它与相同的过滤器进行卷积,最后得到的图中间会是-30,而不是 30。如果你将矩阵转换为图片,就会是该矩阵下面图片的样子。现在中间的过渡部分被翻转了,之前的 30 翻转成了-30,表明是由暗向亮过渡, 而不是由亮向暗过渡(30)。

如果你不在乎这两者的区别,你可以取出矩阵的绝对值。但这个特定的过滤器确实可以为我们区分这两种明暗变化的区别。

再来看看更多的边缘检测的例子,我们已经见过这个 3×3 的过滤器,它可以检测出垂直的边缘。所以,看到右边这个过滤器,我想你应该猜出来了,它能让你检测出水平的边缘。 提醒一下,一个垂直边缘过滤器是一个 3×3 的区域,它的左边相对较亮,而右边相对较暗。相似的,右边这个水平边缘过滤器也是一个 3×3 的区域,它的上边相对较亮,而下方相对较暗。

这里还有个更复杂的例子,左上方和右下方都是亮度为 10 的点。如果你将它绘成图片, 右上角是比较暗的地方,这边都是亮度为 0 的点,我把这些比较暗的区域都加上阴影。而左上方和右下方都会相对较亮。如果你用这幅图与水平边缘过滤器卷积,就会得到右边这个矩阵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值