点击左上方蓝字关注我们
本栏目由百度飞桨工程师联手精心打造,对深度学习的知识点进行由浅入深的剖析和讲解。大家可视它为深度学习百科(面试秘籍也是可以哒),当然也可收藏为深度学习查询手册~
在上期中,主桨人步步高为大家讲解了不同种类优化器的原理以及在实践过程中如何选择合适的优化器。本期中主桨人见见再次回归,为大家带来内容:卷积的变体-转置卷积。
转置卷积
(Transpose Convolution)
1. 转置卷积提出背景
通常情况下,对图像进行卷积运算时,经过多层的卷积运算后,输出图像的尺寸会变得很小,即图像被约减。而对于某些特定的任务(比如:图像分割、GAN),我们需要将图像恢复到原来的尺寸再进行进一步的计算。这个恢复图像尺寸,实现图像由小分辨率到大分辨率映射的操作,叫做上采样(Upsample),如图1所示。
图1 上采样示例
上采样的方法有很多种,常见的包括:最近邻插值、双线性插值等,但是这些上采样方法都是基于人们的先验经验来设计的,在很多场景中效果并不理想。因此,我们希望神经网络自己学习如何更好地进行插值,这就是接下来要介绍的转置卷积的方法。
2. 转置卷积的其应用
转置卷积在有些文献中也被称为反卷积(Deconvolution)。与传统的上采样方法相比,转置卷积不会使用预先设定的插值方法。它具有可学习的参数,通过让网络自行学习,来获取最优的上采样方式。转置卷积在某些特定的领域有着非常广泛的应用,比如:
在DCGAN[1],生成器将随机值转变为一个全尺寸(full-size)的图片,这个时候就需要用到转置卷积。
在语义分割中,会使用卷积层在编码器中进行特征提取,然后在解码层中恢复原先的尺寸,这样才可以对原来图像的每个像素都进行分类。这个过程同样需要用到转置卷积。经典方法如:FCN[2]和U-net[3]。
CNN的可视化[4]:通过转置卷积将CNN中得到的特征图还原到像素空间,以观察特定的特征图对哪些模式的图像敏感。
3. 转置卷积与标准卷积的区别
标准卷积的运算操作其实是对卷积核中的元素与输入矩阵上对应位置的元素进行逐像素的乘积并求和。然后卷积核在输入矩阵上以步长为单位进行滑动,直到遍历完输入矩阵的所有位置。
这里举一个简单的例子演示一下具体的操作过程。假设输入是一个4 * 4的矩阵,使用3 * 3的标准卷积进行计算,同时不使用填充,步长设置为1。最终输出的结果应该是一个2 * 2的矩阵,如图2所示。
图2 标准卷积示例
在上边的例子中,输入矩阵右上角3 * 3的值会影响输出矩阵中右上角的值,这其实也就对应了标准卷积中感受野的概念。所以,我们可以说3 * 3的标准卷积核建立了输入矩阵中9个值与输出矩阵中1个值的对应关系。
综上所述,我们也就可以认为标准卷积操作实际上就是建立了一个多对一的关系。
对于转置卷积而言,我们实际上是想建立一个逆向操作,也就是建立一对多的关系。对于上边的例子,我们想要建立的其实是输出卷积中的1个值与输入卷积中的9个值的关系,如图3所示。
图3 卷积逆向运算示例
当然,从信息论的角度,卷积操作是不可逆的,所以转置卷积并不是通过输出矩阵和卷积核计算原始的输入矩阵,而是计算得到保持了相对位置关系的矩阵。
4. 转置卷积数学推导
定义一个尺寸为4 * 4的输入矩阵 input:
一个尺寸为3 * 3的标准卷积核 kernel:
步长 stride=1,填充padding=0,按照输出特征图的计算方式,我们可以得到尺寸为2 * 2的输出矩阵 output :
这里,我们换一个表达方式,我们将输入矩阵 input 和输出矩阵 output 展开成列向量X 和列向量Y ,那么向量X 和向量Y 的尺寸就分别是16 * 1 和4 *1,可以分别用如下公式表示:
我们再用矩阵运算来描述标准卷积运算,这里使用矩阵C来表示新的卷积核矩阵:
经过推导,我们可以得到这个稀疏矩阵C,它的尺寸为4 * 16:
这里,我们用 图4 为大家直观的展示一下上边的矩阵运算过程。
图4 标准卷积矩阵运算示例
而转置卷积其实就是要对这个过程进行逆运算,即通过 C 和 Y 得到 X :
此时,新的稀疏矩阵就变成了尺寸为16 * 4的,这里我们通过 图5 为大家直观展示一下转置后的卷积矩阵运算示例。这里,用来进行转置卷积的权重矩阵不一定来自于原卷积矩阵。只是权重矩阵的形状和转置后的卷积矩阵相同。
我们再将16 * 1的输出结果进行重新排序,这样就可以通过尺寸为2 * 2的输入矩阵得到尺寸为4 * 4的输出矩阵了。
5. 转置卷积输出特征图尺寸
stride=1的转置卷积
我们同样使用上文中的卷积核矩阵C:
对应的输出矩阵 output 为 :
我们将输出矩阵展开为列向量Y :
带入到上文中提到的转置卷积计算公式,则转置卷积的计算结果为:
这其实就等价于填充 padding=2,输入为:
同时,标准卷积核进行转置:
之后的标准卷积的结果,运算过程如图6所示。
对于卷积核尺寸为 k,步长 stride=1,填充 padding=0 的标准卷积,等价的转置卷积在尺寸为 i' 的输入矩阵上进行运算,输出特征图的尺寸 o' 为:
同时,转置卷积的输入矩阵需要进行 padding'=k-1 的填充。
stride>1的转置卷积
在实际使用的过程中,我们大多数时候使用的会是stride>1的转置卷积,从而获得较大的上采样倍率。这里,我们令输入尺寸为5 * 5,标准卷积核的设置同上,步长 stride=2,填充 padding=0,标准卷积运算后,输出尺寸为2 * 2 。
这里,步长stride=2,转换后的稀疏矩阵尺寸变为25 * 4,由于矩阵太大这里不展开进行罗列。最终转置卷积的结果为:
此时,等价于输入矩阵添加了空洞,同时也添加了填充,标准卷积核进行转置之后的运算结果。运算过程如图7所示。
对于卷积核尺寸为 k,步长 stride>1,填充 padding=0 的标准卷积,等价的转置卷积在尺寸为 i' 的输入矩阵上进行运算,输出特征图的尺寸 o' 为:
同时,转置卷积的输入矩阵需要进行 padding'=k-1 的填充,相邻元素间的空洞大小为 s-1。因此,可以通过控制步长 stride 来控制上采样倍率。
本节课见见老师详细讲解了转置卷积的数学推导以及应用。有疑问的同学可以及时留言,主桨人会及时回复哦。下节课将为大家带来空洞卷积的介绍,大家期待一下~
对于本系列所有课程内容,大家可以在飞桨公众号/获取资料/听六小桨讲AI系列获取,记得点赞收藏~
参考文献
[1] Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks
[2] Fully Convolutional Networks for Semantic Segmentation
[3] U-Net: Convolutional Networks for Biomedical Image Segmentation
[4] Visualizing and Understanding Convolutional Networks
回顾往期:
听六小桨讲AI | 第3期:优化器及其三种形式BGD、SGD以及MBGD
如在使用过程中有问题,可加入官方QQ群进行交流:793866180。
如果您想详细了解更多飞桨的相关内容,请参阅以下文档。
·飞桨官网地址·
https://www.paddlepaddle.org.cn/
·飞桨开源框架项目地址·
GitHub: https://github.com/PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle
????长按上方二维码立即star!????
飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台,包括飞桨开源平台和飞桨企业版。飞桨开源平台包含核心框架、基础模型库、端到端开发套件与工具组件,持续开源核心能力,为产业、学术、科研创新提供基础底座。飞桨企业版基于飞桨开源平台,针对企业级需求增强了相应特性,包含零门槛AI开发平台EasyDL和全功能AI开发平台BML。EasyDL主要面向中小企业,提供零门槛、预置丰富网络和模型、便捷高效的开发平台;BML是为大型企业提供的功能全面、可灵活定制和被深度集成的开发平台。
END