首页 > TensorFlow教程 > 卷积神经网络
阅读数:30
卷积是什么
卷积(Convolution)是分析数学中一种重要的运算,有着非常广泛的运用,在图像处理中,常用的是二维卷积。以单通道的灰度图像为例,对图像进行卷积操作,就是使用一个卷积核(也称滤波器,在本教程中统一称为卷积核)分别与图像的同等大小区域进行点乘。
卷积核依次从左往右、从上往下滑过该图像的所有区域,将点乘后得到的矩阵各个位置上的值累加,作为卷积后图像上的像素值。这种将图像和卷积核进行按位点乘后求和的操作,就是卷积神经网络中的卷积操作。
假定有一个图像 X,其大小为 M×N,给定一个卷积核 W,其大小为 m×n,则卷积的公式可定义为:

看一个简单的例子,如图 1 所示,有一张大小为 5×5 的图像(单通道),X 是其像素矩阵,矩阵 W 为卷积核,其大小为 3×3,矩阵 Y 是卷积得到的结果,称为特征映射或特征图(Feature Map)。

图 1:二维滤波器的卷积运算示例
根据上式,我们可以计算 y11 的值为
需要说明的是,这里我们所说的卷积实际上是互相关(Cross-correlation)。两者的区别在于,卷积的计算需要将卷积核进行翻转(相当于旋转 180°),互相关也可以理解为不对卷积核进行翻转的卷积。
这里不需要对卷积核进行翻转的原因是,卷积核是否进行翻转并不影响神经网络对特征的抽取,另外卷积神经网络中的卷积核是需要学习的参数,因此卷积和互相关在这里其实是等价的。由于互相关的计算更加简便,所以目前我们在深度学习中都是使用互相关来替代卷积的。
在图像处理中,卷积是用来做特征提取的一个有效方法。不同的卷积核可以用来检测图像中不同的特征,以手写数字识别为例,如图 2 左侧所示是一个手写数字“1”,右侧是它的像素值。

图 2:手写数字“1”
(左图:手写数字原始图像;右图:手写数字的像素值)
现在要用卷积操作来提取这个数字的特征,假设有如图 3 所示的两个卷积核。

图 3:用来识别手写数字的两个不同的卷积核 a(左)和 b(右)
如图 4 所示,当用卷积核 a 对原始图像做卷积操作时,

图 4:使用卷积核 a 对原始图像做卷积操作
(左:原始图像的像素表示。右:卷积核 a)
根据前面介绍的卷积计算方式,其结果为:
再换用卷积核 b 对原始图像进行卷积,如图 5 所示。

图 5:使用卷积核 b 对原始图像做卷积操作
(左:原始图像的像素表示。右:卷积核 b)
卷积得到的结果为:
从计算结果来看,卷积核 a 与原始图像卷积计算得到的值要远大于卷积核 b。通过观察也能发现,卷积核 a 的形状与原始图像的形状重合度较高,这也是卷积核提取图像特征的关键。如果图像的某一区域与卷积核所能检测的特征很相似,那么该区域就会激活卷积核,得到一个很高的值,反之,卷积操作之后,该区域的值就会相对较低。
如图 6 所示是在图像处理中常用的卷积核,图中最上面的卷积核是高斯卷积核,其作用是对图像进行平滑降噪处理,第二个和第三个卷积核可以用来进行边缘检测。

图 6:图像处理中的几种滤波器示例
现实中不可能针对每一种情况去设计一个卷积核,而卷积神经网络的强大就在于它可以通过从训练数据中学习到所需的卷积核,从而完成图像检测、分类的任务。
卷积核的滑动步长是指卷积核在卷积操作中每次移动的距离,如图 7 的上半部分所示是滑动步长为 1 时的情况。

图 7:滑动步长分别为 1(上)和 2(下)的卷积过程示例
如果将滑动步长设为 2,则卷积核每次在横向(或纵向)移动的距离就为 2,如图 7 的下半部分所示。
零填充是指在输入矩阵的四周填充零。如图 8 所示在输入矩阵的周围填充了宽度为 2 的零。

图 8:宽度为 2 的零填充示例
在卷积神经网络中,按照不同的零填充的方式可以划分为不同的卷积,如下是三种较为常用的卷积(假设输入矩阵的大小为 m×m,卷积核的大小为 n×n,滑动步长为 s,零填充的宽度为 p)。
1) 窄卷积(Narrow Convolution):图 7 上半部分所示的情况就是窄卷积,其中滑动步长 s=1,不进行零填充,卷积后输出的特征图大小为(m-n+1)×(m-n+1)。
2) 宽卷积(Wide Convolution):图 9 所示是宽卷积的示例,其中滑动步长 s=1,零填充的宽度为 p=n-1,卷积后输出的特征图大小为(m+n-1)×(m+n-1)。

图 9:宽卷积示例
3) 等宽卷积(Equal-width Convolution):图 10 所示是等宽卷积的示例,其中滑动步长 s=1,零填充的宽度为 p=(n-1)/2,卷积后输出的特征图大小为 m×m,等宽卷积得到的特征图和输入的原图大小一致。

图 10:等宽卷积示例
卷积核依次从左往右、从上往下滑过该图像的所有区域,将点乘后得到的矩阵各个位置上的值累加,作为卷积后图像上的像素值。这种将图像和卷积核进行按位点乘后求和的操作,就是卷积神经网络中的卷积操作。
假定有一个图像 X,其大小为 M×N,给定一个卷积核 W,其大小为 m×n,则卷积的公式可定义为:

看一个简单的例子,如图 1 所示,有一张大小为 5×5 的图像(单通道),X 是其像素矩阵,矩阵 W 为卷积核,其大小为 3×3,矩阵 Y 是卷积得到的结果,称为特征映射或特征图(Feature Map)。

图 1:二维滤波器的卷积运算示例
根据上式,我们可以计算 y11 的值为

需要说明的是,这里我们所说的卷积实际上是互相关(Cross-correlation)。两者的区别在于,卷积的计算需要将卷积核进行翻转(相当于旋转 180°),互相关也可以理解为不对卷积核进行翻转的卷积。
这里不需要对卷积核进行翻转的原因是,卷积核是否进行翻转并不影响神经网络对特征的抽取,另外卷积神经网络中的卷积核是需要学习的参数,因此卷积和互相关在这里其实是等价的。由于互相关的计算更加简便,所以目前我们在深度学习中都是使用互相关来替代卷积的。
在图像处理中,卷积是用来做特征提取的一个有效方法。不同的卷积核可以用来检测图像中不同的特征,以手写数字识别为例,如图 2 左侧所示是一个手写数字“1”,右侧是它的像素值。

图 2:手写数字“1”
(左图:手写数字原始图像;右图:手写数字的像素值)
现在要用卷积操作来提取这个数字的特征,假设有如图 3 所示的两个卷积核。

图 3:用来识别手写数字的两个不同的卷积核 a(左)和 b(右)
如图 4 所示,当用卷积核 a 对原始图像做卷积操作时,

图 4:使用卷积核 a 对原始图像做卷积操作
(左:原始图像的像素表示。右:卷积核 a)
根据前面介绍的卷积计算方式,其结果为:
0.6×0.3+0.8×0.5+0.7×0.6+1×1+...=14.78
再换用卷积核 b 对原始图像进行卷积,如图 5 所示。

图 5:使用卷积核 b 对原始图像做卷积操作
(左:原始图像的像素表示。右:卷积核 b)
卷积得到的结果为:
0.3×0.3+1×0.8+1×1+1×0.7=2.59
从计算结果来看,卷积核 a 与原始图像卷积计算得到的值要远大于卷积核 b。通过观察也能发现,卷积核 a 的形状与原始图像的形状重合度较高,这也是卷积核提取图像特征的关键。如果图像的某一区域与卷积核所能检测的特征很相似,那么该区域就会激活卷积核,得到一个很高的值,反之,卷积操作之后,该区域的值就会相对较低。
如图 6 所示是在图像处理中常用的卷积核,图中最上面的卷积核是高斯卷积核,其作用是对图像进行平滑降噪处理,第二个和第三个卷积核可以用来进行边缘检测。

图 6:图像处理中的几种滤波器示例
现实中不可能针对每一种情况去设计一个卷积核,而卷积神经网络的强大就在于它可以通过从训练数据中学习到所需的卷积核,从而完成图像检测、分类的任务。
滑动步长和零填充
在卷积神经网络中,为了达到更灵活的特征抽取,我们引入了卷积核的滑动步长(Stride)和零填充(Zero-padding)来增加卷积的多样性。卷积核的滑动步长是指卷积核在卷积操作中每次移动的距离,如图 7 的上半部分所示是滑动步长为 1 时的情况。

图 7:滑动步长分别为 1(上)和 2(下)的卷积过程示例
如果将滑动步长设为 2,则卷积核每次在横向(或纵向)移动的距离就为 2,如图 7 的下半部分所示。
零填充是指在输入矩阵的四周填充零。如图 8 所示在输入矩阵的周围填充了宽度为 2 的零。

图 8:宽度为 2 的零填充示例
在卷积神经网络中,按照不同的零填充的方式可以划分为不同的卷积,如下是三种较为常用的卷积(假设输入矩阵的大小为 m×m,卷积核的大小为 n×n,滑动步长为 s,零填充的宽度为 p)。
1) 窄卷积(Narrow Convolution):图 7 上半部分所示的情况就是窄卷积,其中滑动步长 s=1,不进行零填充,卷积后输出的特征图大小为(m-n+1)×(m-n+1)。
2) 宽卷积(Wide Convolution):图 9 所示是宽卷积的示例,其中滑动步长 s=1,零填充的宽度为 p=n-1,卷积后输出的特征图大小为(m+n-1)×(m+n-1)。

图 9:宽卷积示例
3) 等宽卷积(Equal-width Convolution):图 10 所示是等宽卷积的示例,其中滑动步长 s=1,零填充的宽度为 p=(n-1)/2,卷积后输出的特征图大小为 m×m,等宽卷积得到的特征图和输入的原图大小一致。

图 10:等宽卷积示例