本文为深度学习的学习总结,讲解卷积神经网络。欢迎交流
计算机视觉
如果我们想要输入的图片像素为 1000×1000×3,则此时神经网络特征维度为 3 百万, W [ 1 ] W^{[1]} W[1] 采用全连接时,维度更夸张。我们使用卷积运算来解决这个问题。
边缘检测 I
卷积运算是卷积神经网络最基本的组成部分。我们使用边缘检测作为入门样例。
为了让电脑搞清楚下面这张图片的内容,我们可能需要先检测图片中的垂直边缘,右上角的图为垂直边缘检测器的输出,右下角为水平边缘检测器的输出:
接下来我们讲解如何检测出这些边缘。下图中,左边为一个 6×6 的灰度图像,即 6×6×1 的矩阵,没有 RGB 三通道。我们可以构造图中中间的 3×3 矩阵,成为过滤器(或核), ∗ * ∗ 运算符为卷积运算。而矩阵运算的结果是一个 4×4 的矩阵,因为过滤器在图中左边的矩阵中有 4×4 个可能的位置,可将其看作 4×4 的图像:
我们计算右边矩阵中的第一个元素的值。将 3×3 的过滤器覆盖在输入图像的蓝色区域,并在每个元素上标记过滤器的值,将对应元素相乘后求和 1 × 3 + 0 × 0 + . . . + 2 × − 1 = − 5 1\times3+0\times0+...+2\times-1=-5 1×3+0×0+...+2×−1=−5 得到第一个元素的值:
计算第二个元素的值将过滤器覆盖在这里:
同理,可以计算出矩阵中所有元素的值。上图中间的矩阵为垂直边缘检测器。接下来对其进行解释。
下图左边图像中,左下角为其代表的图像,0 表示灰色,图像中间有一个明显的边缘。下图中间的过滤器可以可视化为其下面的图像。最右边为得到的矩阵,其对应的图像在右下角,中间的亮段对应到最左边的图像,就是检测到的边缘。
![aWEjgg.png](https://i-blog.csdnimg.cn/blog_migrate/86f4f126790d836c66a72885a77c4d7b.png)
因为图像维度太小,因此检测到的边缘很粗,图像维度很大时可以很好的检测到边缘。
边缘检测 II
检测正负边
我们还可以检测图像中的正边和负边,即从亮到暗和从暗到亮,也就是边缘的过渡。
当我们将前文中的矩阵进行翻转时,用相同的过滤器进行卷积,得到的结果为右下角的矩阵:
矩阵中的值为 -30,代表从暗到亮的过渡。因此这个过滤器可以区分两种明暗变化的区别。
同理,下图中右边的过滤器可以进行水平边缘的检测:
下图是一个更复杂的例子,最右边的检测结果中第 2 行第 1 列的 30 代表了最左边图像中的绿色区域,上边较亮下边较暗,是从亮到暗的过渡,检测到了一条正边缘。
同理,右边矩阵第二行第四列的 -30 表示了左图中的紫色区域,检测到了负边缘:
而第二行第二列的 10 表示了左图中的黄色区域,区域中左边两列是正边,右边一列是负边,求和后得到了中间值。
当图像很大时,则不会出现这样的过渡带。
选择过滤器
实际上,过滤器还有很多种选择,我们以垂直边缘过滤器为例进行介绍:
上图中间的过滤器称为 Sobel 过滤器,其增加了中间行的权重,就是图像中央的像素点,鲁棒性更高。右边的称为 Scharr 过滤器。
为了检测复杂图像的边缘,我们可以将过滤器中的 9 个值当作参数,使用反向传播算法学习过滤器。这种方式获取的特征可以胜过手动选择的过滤器,并可以检测到任何角度的边缘。我们会后面详细讲解这部分内容。
扩充图像—Padding
我们在前面的例子中已经看到,图像在进行卷积运算后会被缩小。如果我们有 n × n n\times n n×n 的图像和 f × f f\times f f×f 的过滤器做卷积,输出结果的维度是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1)\times(n-f+1) (n−f+1)×(n−f+1)。
注意角落边的像素,如左上角的像素只被一个输出使用,但是中间的像素会被多次使用,这意味着我们丢掉了图像边缘位置的许多信息。
为了解决以上两个问题,我们需要在进行卷积之前对图像进行扩充(padding)。例如,我们可以对下面的图像扩充一层像素,变成 8×8 的图像,卷积后得到 6×6 的输出,和原始图像大小相同。
通常我们会用 0 填充。设扩充层数为 p p p,则输出变为 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1)\times(n+2p-f+1) (n+2p−f+1)×(n+2p−f+1) 的图像。并且此时图中左边图像中左上角的像素影响了图中右边图像的绿色格子,更多的信息被我们利用了。
关于 p p p 的选择,通常有 2 种:
- Valid 卷积:不填充,即 p = 0 p=0 p=0
- Same 卷积:填充后输出大小与输入相同,即 n + 2 p − f + 1 = n + f − 1 n+2p-f+1=n+f-1 n+2p−f+1=n+f−1,解得 p = f − 1 2 p=\frac{f-1}{2} p=2f−1。习惯上 f f f 通常为奇数,因为偶数会出现不对称的填充,且过滤器只有一个中心,方便在输入图像中选择位置。
卷积步长
卷积中的步幅是另一个构建卷积神经网络的基本操作。我们还是用之前的例子进行说明。
在前面的例子中,我们的步幅为 1,即每次选择过滤器的位置时,向右或向下移动 1 个单位。当步幅为 2 时,我们就会移动 2 个单位。如下图中的例子,我们移动 2 个单位,最终得到了 3×3 的输出。
我们设步幅为 s s s,在蓝色图像不超出输入范围时,输出图像的大小为 ( n + 2 p − f s + 1 ) × ( n + 2 p − f s + 1 ) (\frac{n+2p-f}{s}+1)\times(\frac{n+2p-f}{s}+1) (sn+2p−f+1)×(sn+2p−f+1),为了解决商不是整数的问题,我们还需要对尺寸进行向下取整 ⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ \lfloor\frac{n+2p-f}{s}+1\rfloor\times\lfloor\frac{n+2p-f}{s}+1\rfloor ⌊s