吴恩达deeplearning.ai课程系列笔记10

来源:互联网 发布:适合抓握的鼠标 知乎 编辑:程序博客网 时间:2024/05/16 01:43
#写在最前,deeplearning.ai系列课程相较于之前的Andrew Ng在coursera上2014发布的机器学习课程内容更加丰富。
重要的是此次课程示例代码都是用python来实现,不需要去熟悉octave,对大部分需要用python来学习机器学习的同学来说是个福音!
原课程视频请移步网易云课堂或者coursera上学习。

#本文内容部分来自网络,只为自己学习以及分享供更多的人学习使用微笑

1、计算机视觉

计算机视觉为什么有前途?

第一,计算机视觉的高速发展标志着新型应用产生的可能,这是几年前,人们所不敢想象的。通过学习使用这些工具,你也许能够创造出新的产品和应用。
其次,吴大大说,即使到头来你未能在计算机视觉上有所建树,但是也有可能由此衍生出新的神经网络结构与算法,这实际上启发人们去创造出计算机视觉与其他领域的交叉成果。举个例子,之前他在做语音识别的时候,他经常从计算机视觉领域中寻找灵感, 并将其应用于他的文献当中。所以即使你在计算机视觉方面没有做出成果,你也可以将所学的知识应用到其他算法和结构。

计算机视觉领域包括很多方面:如图片分类,目标检测,人脸识别,图片风格迁移等等。



2、边缘检测

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


关于卷积运算:

当你用一个 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。


通过卷积运算,边界就能明显的被计算机用数值区分出来。不过你发现,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个 1000×1000 的图像,而不是 6×6 的图片,你会发现其会很好地检测出图像中的垂直边缘。

3、padding

为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是 padding。

没有padding的话,会有两个缺点:

第一个缺点是每次做卷积操作,你的图像就会缩小,从 6×6缩小到 4×4,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有 1×1 的大小。

第二个缺点是,如果你注意角落边缘的像素,这个像素点只被一个输出所触碰或者使用,因为它位于这个 3×3 的区域的一角。但如果是在中间的像素点,就会有许多 3×3 的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。

为了解决这些问题,你可以在卷积操作之前填充这幅图像。

至于选择填充多少像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。Valid 卷积意味着不填充,这样的话,如果你有一个 n×n 的图像,用一个 f×f 的过滤器卷积,它将会给你一个(n-f+1)×(n-f+1)维的输出。

另一个经常被用到的填充方法叫做 Same 卷积,那意味你填充后,你的输出大小和输入大小是一样的。根据这个公式 n-f+1,当你填充 p 个像素点, n 就变成了 n+2p,最后公式变为 n+2p-f+1。因此如果你有一个 n×n 的图像,用 p 个像素填充边缘,输出的大小就是这样的(n+2p-f+1)×(n+2p-f+1)。如果你想让 n+2p-f+1=n 的话,使得输出和输入大小相等,如果你用这个等式求解 p,那么 p=(f-1)/2。所以当 f 是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。



习惯上,计算机视觉中, f 通常是奇数,甚至可能都是这样。你很少看到一个偶数的过滤器在计算机视觉里使用,我认为有两个原因。
其中一个可能是,如果 f 是一个偶数,那么你只能使用一些不对称填充。只有 f 是奇数的情况下, Same 卷积才会有自然的填充,我们可以以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。
第二个原因是当你有一个奇数维过滤器,比如 3×3 或者 5×5 的,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更方便,便于指出过滤器的位置。

不过,吴大大又说,也许上面两个也不是根本的原因,只是在计算机视觉领域,大家都遵循这样的惯例。o(╯□╰)o

4、strides(步长)

卷积中的步幅是另一个构建卷积神经网络的基本操作。

之前我们移动蓝框的步长是 1,现在移动的步长是 2,我们让过滤器跳过 2 个步长,注意一下左上角,这个点移动到其后两格的点,跳过了一个位置。然后你还是将每个元素相乘并求和,你将会得到的结果是 100。


如果你用一个 f×f 的过滤器卷积一个 n×n 的图像,你的 padding 为 p,步幅为 s,在这个例子中 s=2,你会得到一个输出,因为现在你不是一次移动一个步子,而是一次移动 s 个步子,输出于是变为(n+2p−f )/s+ 1 × (n+2p−f) /s+ 1

如果商不是一个整数怎么办?在这种情况下,我们向下取整。 ⌊ ⌋ 这是向下取整的符号,这也叫做对 z 进行地板除(floor),这意味着 z 向下取整到最近的整数。

5、对于3维图像的卷积:



简单来说,就是把之前的2维filter看成一个3维的立体形状

为了计算这个卷积操作的输出,你要做的就是把这个 3×3×3 的过滤器先放到最左上角的位置,这个 3×3×3 的过滤器有 27 个数, 27 个参数就是 3 的立方。依次取这 27 个数,然后乘以相应的红绿蓝通道中的数字。先取红色通道的前 9 个数字,然后是绿色通道,然后再是蓝色通道,乘以左边黄色立方体覆盖的对应的 27 个数,然后把这些数都加起来,就得
到了输出的第一个数字。如果要计算下一个输出,你把这个立方体滑动一个单位,再与这 27 个数相乘,把它们
都加起来,就得到了下一个输出,以此类推。


卷积神经网络跟之前的神经网络一样,有权重跟偏差:



6、池化层

除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。


左上区域的最大值是 9,右上区域的最大元素值是 2,左下区域的最大值是 6,右下区域的最大值是 3。为了计算出右侧这 4 个元素值,我们需要对输入矩阵的 2×2 区域做最大值运算。这就像是应用了一个规模为 2 的过滤器,因为我们选用的是 2×2 区域,步幅是 2,这些就是最大池化的超参数。

另外还有一种类型的池化,平均池化,它不太常用。简单介绍一下,这种运算顾名思义,选取的不是每个过滤器的最大值,而是平均值。

总结一下,池化的超级参数包括过滤器大小 f 和步幅 s,常用的参数值为 f=2, s=2,应用频率非常高,其效果相当于高度和宽度缩减一半。也有使用 f=3, s=2 的情况。至于其它超级参数就要看你用的是最大池化还是平均池化了。