本栏目由百度飞桨RD们联手精心打造,对深度学习的知识点进行由浅入深的剖析和讲解。大家可视它为深度学习百科(面试秘籍也是可以哒),当然也可收藏为深度学习查询手册~
卷积产生的背景
在全连接网络[1]中,一张图像上的所有像素点会被展开成一个1维向量输入网络,如图1所示,28 x 28的输入数据被展开成为784 x 1的数据作为输入。
图1 全连接神经网络结构图
往往会存在如下两个问题:
1. 输入数据的空间信息被丢失。 空间上相邻的像素点往往具有相似的RGB值,RGB的各个通道之间的数据通常密切相关,但是转化成1维向量时,这些信息将会丢失。如图2所示,空间位置相邻的两个点A和B,转化成1维向量后并没有体现出他们之间的空间关联性。
图2 卷积计算过程
2. 模型参数过多,容易发生过拟合。 由于每个像素点都要跟所有输出的神经元相连接。当图片尺寸变大时,输入神经元的个数会按图片尺寸的平方增大,导致模型参数过多,容易发生过拟合。例如:对于一幅1000 x 1000的输入图像而言,如果下一个隐含层的神经元数目为
个,那么将会有
个权重参数,可以想象,如此大规模的参数量使得网络很难训练。
为了解决上述问题,引入卷积(Convolution)来对输入的图像进行特征提取。卷积的计算范围是在像素点的空间邻域内进行的,因此可以利用输入图像的空间信息;此外,由于卷积具有局部连接、权重共享等特性,卷积核参数的数目也远小于全连接层。
卷积基础概念
- 卷积核(kernel):也被叫做滤波器(filter),假设卷积核的高和宽分别为
和
,则称其为
卷积。比如某卷积核高为3, 宽为5,则叫做3 x 5卷积。卷积核中数值即进行卷积计算时所采用的权重。
- 卷积计算(convolution):图像中像素点具有很强的空间依赖性,卷积就是针对像素点的空间依赖性来对图像进行处理的一种技术。
- 特征图(feature map):卷积滤波结果。
应用示例1
在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关 (cross-correlation)运算,具体的计算过程如 图3 所示,每张图的左图表示输入数据是一个维度为3 x 3的二维数组;中间的图表示卷积核是一个维度为2 x 2的二维数组。
图3 卷积计算过程
- 如图3(a)所示:先将卷积核的左上角与输入数据的左上角(即:输入数据的(0, 0)位置)对齐,把卷积核的每个元素跟其位置对应的输入数据中的元素相乘,再把所有乘积结果相加,得到卷积输出的第一个结果:
- 如图3(b)所示:将卷积核向右滑动,同样将卷积核的每个元素跟其位置对应的输入数据中的元素相乘,再把所有乘积结果相加,得到卷积输出的第二个结果:
- 如图3(c)所示:将卷积核向下滑动,让卷积核左上角与输入数据中的(1, 0)位置对齐,可以计算得到卷积输出的第三个结果:
- 如图3(d)所示:将卷积核向右滑动,让卷积核左上角与输入数据中的(1, 1)位置对齐,可以计算得到卷积输出的第四个结果:
最终可以得到图3(d)右侧所示的特征图。
说明:
- 输入图像的边缘像素因其处于边缘位置,因此无法参与卷积计算;
- 图像卷积计算实质上是对图像进行了下采样 (down sampling)操作。对卷积得到的图像结果不断卷积滤波,则原始图像就会被“层层抽象、层层约减”,从而使得蕴涵在图像中的重要信息“显山露水”;
- 卷积核中的权重系数是通过数据驱动机制学习得到,用来捕获图像中某像素点及其邻域像素点所构成的特有空间模式。一旦从数据中学习得到权重系数,这些权重系数就刻画了图像中像素点构成的空间分布不同模式。
填充(Padding)
输入图像边缘位置的像素点无法进行卷积滤波,为了使边缘像素也参与卷积滤波,填充技术应运而生。填充是指在边缘像素点周围填充“0”(即0填充),使得输入图像的边缘像素也可以参与卷积计算。注意,在这种填充机制下,卷积后的图像分辨率将与卷积前图像分辨率一致,不存在下采样。
应用示例2
当卷积核尺寸大于1时,输出特征图的尺寸会小于输入图片尺寸。如果经过多次卷积,输出图片尺寸会不断减小。为了避免卷积之后图片尺寸变小,通常会在图片的外围进行填充(padding),如 图4 所示。
图4 图形填充
- 如图4(a)所示:填充的大小为1,填充值为0。填充之后,输入图片尺寸从4 x 4变成了6 x 6,使用3 x 3的卷积核,输出图片尺寸为4 x 4。
- 如图4(b)所示:填充的大小为2,填充值为0。填充之后,输入图片尺寸从4 x 4变成了8 x 8,使用3 x 3的卷积核,输出图片尺寸为6 x 6。
如果在输入图片第1行之前和最后1行之后填充
行;在输入图片第1列之前和最后1列之后填充
列;则填充之后的图片尺寸为
。经过大小为
的卷积核操作之后,输出图片的尺寸为:
为了便于padding,卷积核大小通常使用1,3,5,7这样的奇数,这样如果使用的填充大小为
,则可以使得卷积之后图像尺寸不变。例如当卷积核大小为3时,padding大小为1,卷积之后图像尺寸不变;同理,如果卷积核大小为5,padding大小为2,也能保持图像尺寸不变。
步长(Stride)
在卷积操作时,通常希望输出图像分辨率与输入图像分辨率相比会逐渐减少,即图像被约减。因此,可以通过改变卷积核在输入图像中移动步长大小来跳过一些像素,进行卷积滤波。当Stride=1时,卷积核滑动跳过1个像素,这是最基本的单步滑动,也是标准的卷积模式。Stride=k表示卷积核移动跳过的步长是k。
应用示例3
图3 中卷积核每次滑动一个像素点,这是步长为1的特殊情况。图5是步长为2的卷积过程,卷积核在图片上移动时,每次移动大小为2个像素点。
图5 步幅为2的卷积过程
当输入图像尺寸H x W,卷积核大小
,填充
,步长为
时,输出特征图尺寸的计算公式是:
感受野(Receptive Field)
卷积所得结果中,每个特征图像素点取值依赖于输入图像中的某个区域,该区域被称为感受野(receptive field),正所谓“管中窥豹、见微知著”。那么这个区域在哪呢,在卷积神经网络中,感受野是特征图(feature map)上的点对应输入图像上的区域。感受野内每个元素数值的变动,都会影响输出点的数值变化。
应用示例4
比如3 x 3卷积对应的感受野大小就是3 x 3,如 图6 所示。
图6 感受野为3×3的卷积
而当通过两层3 x 3的卷积之后,感受野的大小将会增加到5 x 5,如 图7 所示。
图7 感受野为5×5的卷积
因此,当增加卷积网络深度的同时,感受野将会增大,输出特征图中的一个像素点将会包含更多的图像语义信息。
卷积的优势
- 保留空间信息
在卷积运算中,计算范围是在像素点的空间邻域内进行的,它代表了对空间邻域内某种特征模式的提取。对比全连接层将输入展开成一维的计算方式,卷积运算可以有效学习到输入数据的空间信息。
- 局部连接
在上文中,我们介绍了感受野的概念,可以想像,在卷积操作中,每个神经元只与局部的一块区域进行连接。对于二维图像,局部像素关联性较强,这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征。全连接与局部连接的对比如图8所示。
图8 全连接与局部连接
同时,由于使用了局部连接,隐含层的每个神经元仅与部分图像相连,考虑本文开篇提到的例子,对于一幅1000 × 1000的输入图像而言,下一个隐含层的神经元数目同样为
个,假设每个神经元只与大小为 的局部区域相连,那么此时的权重参数量仅为
,相较于全连接层,参数量少了4个数量级。
- 权重共享
卷积计算实际上是使用一组卷积核在图片上进行滑动,计算乘加和。因此,与图像计算的过程中,卷积核的权重是共享的。这就大大降低了网络的训练难度,图9为权重共享的示意图。这里还使用上面的例子,对于一幅1000 × 1000的输入图像,下一个隐含层的神经元数目为
个,隐含层中的每个神经元与大小为10 x 10的局部区域相连,因此有10 x 10个权重参数。将这10 x 10个权重参数共享给其他位置对应的神经元,也就是
个神经元的权重参数保持一致,那么最终需要训练的参数就只有这10 x 10个权重参数了。
图9 权重共享示意图
- 不同层级卷积提取不同特征
在CNN网络中,通常使用多层卷积进行堆叠,从而达到提取不同类型特征的作用。比如:浅层卷积提取的是图像中的边缘等信息;中层卷积提取的是图像中的局部信息;深层卷积提取的则是图像中的全局信息。这样,通过加深网络层数,CNN就可以有效地学习到图像从细节到全局的所有特征了。对一个简单的5层CNN进行特征图可视化后的结果如图10所示 [2]。
图10 特征图可视化示意图
通过上图可以看到,Layer1和Layer2中,网络学到的基本上是边缘、颜色等底层特征;Layer3开始变的稍微复杂,学习到的是纹理特征;Layer4中,学习到了更高维的特征,比如:狗头、鸡脚等;Layer5则学习到了更加具有辨识性的全局特征。
本期内容详细介绍了深度学习中卷积的相关基础概念以及卷积计算,下一期将继续由见见老师为大家带来卷积的复杂操作以及1*1卷积,感兴趣的记得关注『听六小桨讲AI』系列内容,下期见~~
参考文献
[1] https://www.paddlepaddle.org.cn/tutorials/projectdetail/724126
[2] Visualizing and Understanding Convolutional Networks:
https://arxiv.org/pdf/1311.2901.pdf
如在使用过程中有问题,可加入官方QQ群进行交流:778260830。
如果您想详细了解更多飞桨的相关内容,请参阅以下文档。
·飞桨官网地址·
https://www.paddlepaddle.org.cn/
·飞桨开源框架项目地址·
GitHub: https://github.com/PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle