使用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)的各种情况的更多相关文章

  1. 转置卷积Transposed Convolution

    转置卷积Transposed Convolution 我们为卷积神经网络引入的层,包括卷积层和池层,通常会减小输入的宽度和高度,或者保持不变.然而,语义分割和生成对抗网络等应用程序需要预测每个像素的值 ...

  2. CNN:转置卷积输出分辨率计算

    上一篇介绍了卷积的输出分辨率计算,现在这一篇就来写下转置卷积的分辨率计算.转置卷积(Transposed convolution),转置卷积也有叫反卷积(deconvolution)或者fractio ...

  3. 『TensotFlow』转置卷积

    网上解释 作者:张萌链接:https://www.zhihu.com/question/43609045/answer/120266511来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  4. 一文搞懂 deconvolution、transposed convolution、sub-­pixel or fractional convolution

    目录 写在前面 什么是deconvolution convolution过程 transposed convolution过程 transposed convolution的计算 整除的情况 不整除的 ...

  5. 由浅入深:CNN中卷积层与转置卷积层的关系

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由forrestlin发表于云+社区专栏 导语:转置卷积层(Transpose Convolution Layer)又称反卷积层或分数卷 ...

  6. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)

    本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...

  7. pytorch 不使用转置卷积来实现上采样

    上采样(upsampling)一般包括2种方式: Resize,如双线性插值直接缩放,类似于图像缩放,概念可见最邻近插值算法和双线性插值算法——图像缩放 Deconvolution,也叫Transpo ...

  8. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一)

    本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...

  9. 卷积(convolution)与相关(correlation)(matlab 实现)

    1. 卷积(convolution) 输出 y(n) 是作为在 x(k) 和 h(n−k)(反转和移位)重叠之下的样本和求出的. 考虑下面两个序列: x(n)=[3,11,7,0,−1,4,2],−3 ...

随机推荐

  1. 花时三月 终于Spring Boot 微信点餐开源系统! 附源码

    架构 前后端分离:             Nginx与Tomcat的关系在这篇文章,几分钟可以快速了解: https://www.jianshu.com/p/22dcb7ef9172 补充: set ...

  2. 优雅的在React组件中注册事件

    前言 在React的开发中,我们经常需要在 window 上注册一些事件, 比如按下 Esc 关闭弹窗, 按上下键选中列表内容等等.比较常见的操作是在组件 mount 的时候去 window 上监听一 ...

  3. Spring Cloud系列(二):Eureka应用详解

    一.注册中心 1.注册中心演变过程 2.注册中心必备功能 ① 服务的上线 ② 服务的下线 ③ 服务的剔除 ④ 服务的查询 ⑤ 注册中心HA ⑥ 注册中心节点数据同步 ⑦ 服务信息的存储,比如mysql ...

  4. Win10系统下的MySQL5.7.24版本(解压版)详细安装教程

    进入MySQL官网下载压缩包 MySQL官网:https://www.mysql.com/ 将页面拉到最底,点击MySQL Community Server 跳转到下载页面,默认选择是最新版MySQL ...

  5. 【题解】CF1290B Irreducible Anagrams

    Link 题目大意:对于一个字符串,每次询问一个区间,看看这个区间是不是可以划分为若干区间,这些区间内数字经过排列后可以还原原来区间. \(\text{Solution:}\) 菜鸡笔者字符串构造该好 ...

  6. vscode编写python,引用本地py文件出现红色波浪线

    前言 引用本地py文件出现红色波浪线,如下图: 原因 经过查询得知,vscode中的python插件默认使用的是pylint来做代码检查,因此需要对pylint做一些配置 解决方案 在setting. ...

  7. kubernetes-介绍与特性

    1. kubernetes概述 1) kubernetes是什么 2) kubernetes能做什么 3) kubernetes特性 4) kubernetes集群架构与组件 5) kubernete ...

  8. 多测师讲解jmeter _安装和配置环境(00)_高级讲师肖sir

    1.下载jmeter包,我们已经下载了有现成的: 2.安装jjdk默认安装或自定义安装 默认安装的路径: 如下图 3.第三步:安装完成后配置JDK的环境变量  位置:计算机→属性→高级系统设置→高级→ ...

  9. MeteoInfoLab脚本示例:中尺度气旋散点图

    全球长时间序列中尺度气旋数据(http://cioss.coas.oregonstate.edu/eddies/)有netCDF格式,散点数据类型,只有一个很大的维Nobs = 2590938.尝试读 ...

  10. day53 Pyhton 前端04

    内容回顾: 盒子: 内边距:padding,解决内部矛盾,内边距的增加整个盒子也会增加 外边距:margin,解决外部矛盾,当来盒子都有外边距的时候,取两者最大值 边框:border border-c ...