本文是Deep Learning Specialization系列课程的第4课《Convolutional Neural Networks》中Convolutional Neural Networks部分的学习笔记。
本文是以计算机视觉为应用来对卷积神经网络做了一个全面的剖析,内容包括:
- 边缘检测
- 滤波器
- 填充
- 步长
- 池化
- 卷积运算中的参数
- 完整的卷积神经网络
计算机视觉
计算机视觉 + 深度学习:
- 使得计算机视觉飞速发展以产生更多直接拿来用的全新的应用
- 计算机视觉方面的研究也可以借用到其他方向,比如语音识别
计算机视觉主要是为解决以下4个问题:
- 图像识别,比如识别图像上的动物是不是猫
- 目标检测,比如识别图像中的对象是什么、在哪里
- 图像风格转移:通过两张图片来合成一张图片
- 描述图像:将图像中呈现出来的内容以文字形式表达出来
那么,为什么要在计算机视觉中引入卷积神经网络呢?
因为计算机视觉主要是处理图像,当将其转换为像素后,输入数据会非常的大,导致参数的维度也很大,通过传统的神经网络不能很好的处理。比如,当输入的是一个很小的64x64的图像,总共有3个通道,那么输入层的维度就为12288。
边缘检测
关于边缘检测,之前这篇《卷积神经网络与图像边缘检测》文章也做了一些描述,这里再来复习一下。
计算机视觉的处理是从简单到复杂,第一步一般都是对图像进行边缘检测。在边缘检测阶段,需要用到不同的边缘检测算子(滤波器,Filter),比如垂直滤波器(Vertical Filter),水平滤波器(Horizontal Filter)。
以垂直滤波器为例,其滤波器为3x3的一个矩阵,第一列为1,第二列为0,第三列为-1。通过滤波器的形状就能知道,其能将垂直方向的特征提取出来。其计算则是将滤波器放置在输入层,依次相乘后求和,得到输出层的值。
具体可以参考下图中的例子。
水平滤波器与垂直滤波器类似,即把垂直滤波器转了90度,以识别出水平方向的特征。
此外,将滤波器的值稍做修改,能得到Sobel等其他滤波器。
上面讲述的都是传统的计算机视觉进行边缘检测的方式,其所使用的滤波器都是提前定义好的。那么引入深度学习的计算机视觉,是将滤波器的参数作为训练时的参数来进行学习的。
下面来重点讲讲卷积运算的一些基本概念。
填充(Padding)
从上面的例子可以看到,在通过卷积计算后,输出的数据尺寸比输入数据变小了。这样,在继续往下计算时,会导致数据越来越小。
另外,在上面的计算中,我们也发现,在边缘的像素参与计算的次数要少于中间的像素,这就会导致卷积计算没有充分利用已有的数据。
基于上述两个原因,我们在卷积计算中需要引入填充(Padding),即在原始输入数据外围填充值为0的像素。
包含填充的卷积计算公式为: n + 2 p − f + 1 n+2p-f + 1 n+2p−f+1,其中n为输入层的维度,p为填充数,f为滤波器的大小。
具体如下图所示。
在卷积计算中,包含两个概念:Valid卷积和Same卷积
- Valid卷积是指在卷积计算中没有应用填充,即 p = 0 p=0 p=0。比如,输入数据大小为6,滤波器大小为3,那么输出数据大小为4。
- Same卷积则是指在经过卷积计算后,要保证输出于输入的尺寸相同,即 n + 2 p − f + 1 = n n+2p-f+1=n n+2p−f+1=n -> p = f − 1 2 p=\frac{f-1}{2} p=2f−1。比如,输入数据为6,滤波器大小为3,此时需要保证计算后输出数据的大小不变,则需要保证 p = 1 p=1 p=1。
步长(Stride)
在上面的卷积计算中,我们在水平方向和垂直方向采用的都是一个像素一个像素的移动滤波器,其中移动的间隔就是步长(Stride)。
将填充与步长结合起来,我们就能得到这样的计算公式: n + 2 p − f s + 1 \frac{n+2p-f}{s} + 1 sn+2p−f+1
互相关运算与卷积运算
在机器学习或深度学习领域,是把「互相关运算」都称为「卷积运算」。关于这部分内容,在后续文章中再来详细做一个说明。
Volumes的卷积计算
上面的例子中,都是以二维的矩阵来说明。但我们在处理计算机视觉的问题时,使用的图像一般都是三维(RGB)的体,下面就来继续进行扩充。
这里的第三维,我们可以将其称为通道(Channel),这样,我们的输入数据的维度为 ( n h , n w , n c ) (n_h,n_ w, n_c) (nh,nw,n