逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)
1.首先先定义进行卷积的参数:
- 输入特征图为高宽一样的Hin*Hin大小的x
- 卷积核大小kernel_size
- 步长stride
- padding填充数(填充0)
- 输出特征图为Hout*Hout大小的y
计算式子为:
Hout = floor( Hin + 2*padding - kernel_size / stride) + 1
2.然后实现上面的卷积的转置卷积
定义其参数为:
- 输入特征图为高宽一样的Hout*Hout大小的y
- 卷积核大小kernel_size
- 步长stride
- paddingnew 填充数(填充0)
- 输出特征图为Hin*Hin大小的x
逆卷积的过程主要分两步:
- 对输入的特征图y进行变换,得到新的特征图ynew
- 内部变换,与卷积时设置的stride相关
- 外部变换,与卷积时设置的padding相关
- 根据得到的特征图进行卷积即可
1)对输入的特征图y进行变换,得到新的特征图ynew
1》内部变换
当卷积时设置的stride>1时,将对输入的特征图y进行插值操作(interpolation)。
即需要在输入的特征图y的每个相邻值之间插入(stride-1)行和列0,因为特征图中能够插入的相邻位置有(height-1)个位置,所以此时得到的特征图的大小由Hout*Hout(Hout即height) 变为新的 Hout_new*Hout_new,即[Hout + (stride-1) * (Hout-1)] * [Hout + (stride-1) * (Hout-1)]
2》外部变换
为了实现由Hout*Hout大小的y逆卷积得到Hin*Hin大小的x,还需要设置paddingnew的值为(kernel_size - padding - 1),这里的padding是卷积操作时设置的padding值
所以计算式子变为:
Hin = floor( [Hout_new + 2*paddingnew - kernel_size] / stride') + 1
⚠️该式子变换后,定义向下取整的分母stride'值为定值1
Hout_new和paddingnew的值代入上面的式子,即变为:
Hin = floor( Hout + (stride-1) * (Hout-1) + 2*(kernel_size - padding - 1) - kernel_size) + 1
化简为:
Hin = floor( (Hout - 1) * stride - 2*padding + kernel_size - 1) + 1
= (Hout - 1) * stride - 2*padding + kernel_size
这样式子使的卷积Conv2d和逆卷积ConvTranspose2d在初始化时具有相同的参数,而在输入和输出形状方面互为倒数。
所以这个式子其实就是官网给出的式子:

可见这里没考虑output_padding
output_padding的作用:可见nn.ConvTranspose2d的参数output_padding的作用
3.下面举例说明
https://github.com/vdumoulin/conv_arithmetic#convolution-arithmetic
1)当stride=1时,就不会进行插值操作,只会进行padding,举例说明:
卷积操作为:
蓝色为输入特征图Hin*Hin=4*4,绿色为输出特征图Hout*Hout=2*2,卷积核kernel_size=3, stride=1
根据式子Hout = floor( Hin + 2*padding - kernel_size / stride) + 1
可得padding=0

其对应的逆卷积操作为:
蓝色为输入特征图Hout*Hout=2*2,绿色为输出特征图Hin*Hin=4*4,卷积核kernel_size=3, stride=1
卷积时的padding=0
将这些值代入上面的式子Hin = (Hout - 1) * stride - 2*padding + kernel_size
果然输入Hout*Hout=2*2能得到输出Hin*Hin=4*4
变形过程为:
paddingnew = kernel_size - padding -1 = 3 -0 -1 = 2
所以可见下方的蓝色最后的大小为7*7 = Hout + 2*paddingnew = 2 + 2*2 = 6

⚠️这里可见是有padding的,为什么定义是为no padding呢?
这是因为它对应的卷积操作的padding=0
1)当stride=2时,进行插值和padding操作,举例说明:
卷积操作为:
蓝色为输入特征图Hin*Hin=5*5,绿色为输出特征图Hout*Hout=3*3,卷积核kernel_size=3, stride=2
根据式子Hout = floor( Hin + 2*padding - kernel_size / stride) + 1
可得padding=1

其对应的逆卷积操作为:
蓝色为输入特征图Hout*Hout=3*3,绿色为输出特征图Hin*Hin=5*5,卷积核kernel_size=3,stride=2
卷积时的padding=1
将这些值代入上面的式子Hin = (Hout - 1) * stride - 2*padding + kernel_size
果然输入Hout*Hout=3*3能得到输出Hin*Hin=5*5
变形操作为:
Hout_new = Hout + (stride-1) * (Hout-1) = 3 + (2-1)*(3-1) = 5
paddingnew = kernel_size - padding -1 = 3 -1 -1 = 1
所以可见下方的蓝色最后的大小为7*7 = Hout_new + 2*paddingnew = 5 + 2*1 = 7

⚠️因为这里的逆卷积对应的卷积操作的padding= 1,所以这里不是no padding,而是padding
逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)的更多相关文章
- Elasticsearch BM25相关度算法超详细解释
Photo by Pixabay from Pexels 前言:日常在使用Elasticsearch的搜索业务中多少会出现几次 "为什么这个Doc分数要比那个要稍微低一点?".&q ...
- .htaccess语法之RewriteCond与RewriteRule指令格式详细解释
htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签: htaccess it 分类: 网络 上文htacc ...
- cookie的详细解释
突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...
- tar命令的详细解释
tar命令的详细解释 标签: linuxfileoutputbashinputshell 2010-05-04 12:11 235881人阅读 评论(12) 收藏 举报 分类: linux/unix ...
- Linux学习笔记15——GDB 命令详细解释【转】
GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...
- C语言 - 结构体(struct)比特字段(:) 详细解释
结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...
- 姿势体系结构的详细解释 -- C
我基本上总结出以下4部分: 1.问题的足迹大小. 2.字节对齐问题. 3.特别保留位0. 4.这种结构被存储在存储器中的位置. #include <stdio.h> #include &l ...
- Java - 面向对象(object oriented)计划 详细解释
面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
随机推荐
- 微信小程序页面跳转方法和携带参数详解
1.页面跳转方式 (1)标签跳转 open-type的属性值对应api里的用法即wx.的用法 1 <navigator url="/page/navigate/navi ...
- vue.js window.removeEventListener 移除
vue项目中的小坑记录下,想要移除window的addEventListener,需要把后面的function挂在到this上,removeEventListener 和 addEventListen ...
- 当List<String> list =new ArrayList<String>(20); 他会扩容多少次
当List<String> list =new ArrayList<String>(20); 他会扩容多少次?A 0 B 1 C 2 D 3答案是A: 因为这个集合 ...
- JavaSSM框架报HTTP Status 500 - Servlet.init() for servlet springMvc threw exception错误
如下,刚搭建的项目报这样的错,刚学框架的我一脸懵逼...网上很多说是jdk或者springmvc的的jar的版本问题,但是我其他项目都可以啊,所以排除了这个问题. 经过几个小时的排查,发现了我的问题所 ...
- 配置Java文件
下载jdk https://www.oracle.com ----------------------------------------------------------------------- ...
- 『练手』004 Laura.SqlForever如何扩展 导航栏 工具栏 右键菜单 插件
004 Laura.SqlForever如何扩展 导航栏 工具栏 右键菜单 插件 导航栏 插件扩展 比如下图的 窗口 > 关闭所有文档 这个导航栏: 在 任何程序集,任何命名空间,任 ...
- springboot~application.properties和application.yml的使用
在springboot框架里进行项目开始时,我们在resource文件夹里可以存放配置文件,而格式可以有两种,properties和yml,前者是扁平的k/v格式,而后者是yml的树型结构,我们建议使 ...
- SmartCode 正式开源,不只是代码生成器!
SmartCode(https://github.com/Ahoo-Wang/SmartCode) SmartCode = IDataSource -> IBuildTask -> IOu ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- spring cloud feign 文件上传和文件下载
文件上传参考文档:http://blog.didispace.com/spring-cloud-starter-dalston-2-4/ 文件下载参考文档:https://blog.csdn.net/ ...