直接理解转置卷积(Transposed convolution)的各种情况
使用GAN生成图像必不可少的层就是上采样,其中最常用的就是转置卷积(Transposed Convolution)。如果把卷积操作转换为矩阵乘法的形式,转置卷积实际上就是将其中的矩阵进行转置,从而产生逆向的效果。所谓效果仅仅在于特征图的形状,也就是说,如果卷积将特征图从形状a映射到形状b,其对应的转置卷积就是从形状b映射回形状a,而其中的值并不一一对应,是不可逆的。另外,不要把逆卷积(Deconvolution)和转置卷积混淆,逆卷积的目标在于构建输入特征图的稀疏编码(Sparse coding),并不是以上采样为目的的。但是转置卷积的确是来源于逆卷积,关于逆卷积与转置卷积的论文请看[1][2]。
下面直接对转置卷积的各种情况进行举例,从而全面理解转置卷积在Pytorch中的运算机制。使用Pytorch而不是TF的原因在于,TF中的padding方式只有两种,即valid与same,并不能很好地帮我们理解原理。而且TF和Pytorch插入0值的方式有些差异,虽然在模型层面,你只需关注模型输入输出的形状,隐层的微小差异可以通过训练来抵消,但是为了更好得把握模型结构,最好还是使用Pytorch。
对于Pytorch的nn.ConvTranspose2d()的参数,下面的讨论不考虑膨胀度dilation,默认为1;output_padding就是在最终的输出特征外面再加上几层0,所以也不讨论,默认为0;为了便于理解,bias也忽略不计,设为False;不失一般性,输入输出的channels都设为1。除了对将卷积转换成矩阵乘法的理解外,理解难点主要在于stride和padding的变化对转置卷积产生的影响,因此下面我们主要变化kernel_size、stride、padding三个参数来分析各种情况。
举例之前要注意,转换为矩阵的形式是由卷积的结果得到的,矩阵形式本身是不能直接获得的。要注意这个因果关系,转换为矩阵形式是为了便于理解,以及推导转置卷积。
实例分析
kernel_size = 2, stride = 1, padding = 0
首先是kernel_size = 2,stride=1,padding=0的情况,如下图:

图中上半部分表示将卷积转换为矩阵乘法的形式。在卷积中,我们是输入一个3x3的特征图,输出2x2的特征图,矩阵乘法形式如上图上中部分所示;转置卷积就是将这个矩阵乘法反过来,如上图下中部分所示。然后将下中部分的矩阵乘法转换为卷积的形式,即可得到转置卷积的示意图如上图右下部分所示。
kernel_size = 2, stride = 1, padding = 1
然后是kernel_size = 2,stride=1,padding=1的情况(因为第一张图中已有,虚线与注释都不加了):

与上一张图的主要不同之处在于转置卷积将卷积结果的最外层去掉,这是因为padding=1,也正符合与卷积相反的操作。也就是说,padding越大,转置卷积就会去掉越多的外层,输出就会越小。
kernel_size = 3, stride = 1, padding = 1
为了分析转置卷积的卷积核与卷积的卷积核的区别,这次把kernel_size变为3,如下图:

可以看出,转置卷积的先将输入padding 2层,用于抵消卷积核带来的规模上的减小,从而将输出扩增到相对应卷积操作的输入大小。然后,我们可以发现,卷积核是输入的卷积核的逆序。也就是说,我们输入函数中的是1~9的方阵,而它实际作为卷积核的是9~1的方阵。最后,因为padding=1,这对于卷积操作是向外加一层0,而对于逆卷积,就是去掉最外面的一层,所以得到最终3x3的结果。
kernel_size = 2, stride = 2, padding = 1
最后,分析stride对转置卷积的影响,将stride设为2,如下图:

分析在图中都已写明。你可能会奇怪,为什么这里转置卷积最终输出与卷积的输入形状不同,这是因为卷积的padding并没有被全都用上(只计算了一边),而转置卷积最后却把两边的padding都去掉了,所以造成了卷积与转置卷积不对应的情况。
总结
经过对以上各种实例的分析,对于某个$kernel \,size=k,stride=s,padding=p$的转置卷积,如果输入宽高都为$n$,则输出宽高为
$\begin{aligned} m&=ns-(s-1)+2(k-1)-(k-1)-2p\\ &=(n-1)s-2p+k \\ \end{aligned}$
实际上,卷积与转置卷积除了输入输出的形状上相反以外,没有别的联系,所以我们只要会计算转置卷积输出的形状即可。
以上图都是用excel作的,已上传至博客园文件,需要的可以下载(点击链接)。
参考文献
[1] Zeiler M D, Krishnan D, Taylor G W, et al. Deconvolutional networks[C]. Computer Vision and Pattern Recognition, 2010.
[2] Zeiler M D, Fergus R. Visualizing and Understanding Convolutional Networks[C]. European Conference on Computer Vision, 2013.
直接理解转置卷积(Transposed convolution)的各种情况的更多相关文章
- 转置卷积Transposed Convolution
转置卷积Transposed Convolution 我们为卷积神经网络引入的层,包括卷积层和池层,通常会减小输入的宽度和高度,或者保持不变.然而,语义分割和生成对抗网络等应用程序需要预测每个像素的值 ...
- CNN:转置卷积输出分辨率计算
上一篇介绍了卷积的输出分辨率计算,现在这一篇就来写下转置卷积的分辨率计算.转置卷积(Transposed convolution),转置卷积也有叫反卷积(deconvolution)或者fractio ...
- 『TensotFlow』转置卷积
网上解释 作者:张萌链接:https://www.zhihu.com/question/43609045/answer/120266511来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- 一文搞懂 deconvolution、transposed convolution、sub-pixel or fractional convolution
目录 写在前面 什么是deconvolution convolution过程 transposed convolution过程 transposed convolution的计算 整除的情况 不整除的 ...
- 由浅入深:CNN中卷积层与转置卷积层的关系
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由forrestlin发表于云+社区专栏 导语:转置卷积层(Transpose Convolution Layer)又称反卷积层或分数卷 ...
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...
- pytorch 不使用转置卷积来实现上采样
上采样(upsampling)一般包括2种方式: Resize,如双线性插值直接缩放,类似于图像缩放,概念可见最邻近插值算法和双线性插值算法——图像缩放 Deconvolution,也叫Transpo ...
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...
- 卷积(convolution)与相关(correlation)(matlab 实现)
1. 卷积(convolution) 输出 y(n) 是作为在 x(k) 和 h(n−k)(反转和移位)重叠之下的样本和求出的. 考虑下面两个序列: x(n)=[3,11,7,0,−1,4,2],−3 ...
随机推荐
- tomcat开机自启
https://blog.csdn.net/qq_31150365/article/details/89330366 参考连接 1,修改tomcat的catalina.sh文件 # vim /usr/ ...
- python下的appium控制andriod按键
今天查看视频的时候,发现不好控制关闭视频,于是就想控制手机的返回按键来达到返回的效果. 找到了一些关于按键的keycode,如下: KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL ...
- python3的基础数据类型
看了很多文档,想自己整理一下关于python的数据类型.说干就干,下面接上. 首先,了解 常量与变量. 常量是什么?常量是指在整个程序操作过程中其值保持不变的数据: 变量是什么?变量即在程序运行过程中 ...
- python3 读取写入excel操作-win32com
前面有写一篇是用xlrd操作excel的,这一篇是使用win32com来进行操作excel,个人推荐使用win32com. 要使用win32com组件,也需要先导入win32com包. # -*- c ...
- 再玩树莓派(二)Jexus&.NetCore
接上一篇,操作系统弄好之后,轮到开发运行环境的搭建. 先说说目标,也就是我到底想搞什么飞机.先说说小目标吧. 现有一个手机App客户端,以答题小游戏作为其内容(例如:口算题,24点,科学百科等) 树莓 ...
- CAS 原子操作
理会CAS和CAS: 有时候面试官面试问你的时候,会问,谈谈你对CAS的理解,这时应该有很多人,就会比较懵,当然,我也会比较懵,当然我和很多人的懵不同,很多人可能,并不知道CAS是一个什么东西,而在我 ...
- Java知识系统回顾整理01基础02面向对象02属性
一.根据实例给出"属性"的定义 一个英雄有姓名,血量,护甲等等状态 这些状态就叫做一个类的属性 二.属性的类型 属性的类型可以是基本类型,比如int整数,float 浮点数 也可以 ...
- P5858 「SWTR-03」Golden Sword
题面: Link 题面有点长,不想粘了,QAQ. 题解: 一句话题意,你有 \(n\) 件物品需要依次放进去,每个物品放进去之后会得到一定的权值,为当前锅炉里面的物品的数量乘以 \(a_i\) 每次在 ...
- Varnish 6.2.2 的介绍与安装
一.简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 Squid 相比,Varnish 具有性能更高.速度更快 ...
- ansible-介绍
常用自动化运维工具 CFengine Chef Puppet 基于Ruby开发,采用C/S架构,扩展性强,基于SSL认证 SaltStack 基于python开发,采用C/S架构,相对于puppet更 ...