PyTorch中反卷积的用法详解


Posted in Python onDecember 30, 2019

pytorch中的 2D 卷积层 和 2D 反卷积层 函数分别如下:

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, groups=1, bias=True)
class torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, bias=True)

我不禁有疑问:

问题1: 两个函数的参数为什么几乎一致呢?

问题2: 反卷积层中的 output_padding是什么意思呢?

问题3: 反卷积层如何计算input和output的形状关系呢?

看了中文文档后,我得不出答案,看了英文文档,才弄明白了。花费了一个下午的时间去研究这个问题,值得用此文纪录一下。

我们知道,在卷积层中,输入输出的形状关系为:

o = [ (i + 2p - k)/s ] +1 (1)

其中:

O : 为 output size

i: 为 input size

p: 为 padding size

k: 为kernel size

s: 为 stride size

[] 为下取整运算

(1) 当 S=1 时

若 s等于1,则公式(1)中的取整符号消失,o 与 i 为 一一对应 的关系。 我们有结论:

如果卷积层函数和反卷积层函数的 kernel_size, padding size参数相同(且 stride= 1),设反卷基层的输入输出形状为 i' 和 o', 卷积层的输入输出形状i和o, 则它们为 交叉对应 的关系,即:

i = o'
o = i'

为回答问题3, 我们将上述关系代入公式中,即:

i' = o' + 2p - k +1

已知 i', 即可推出 o':

o' = i' - 2p + k - 1 (2)

摘两个例子:

PyTorch中反卷积的用法详解

PyTorch中反卷积的用法详解

(2) 当 S>1 时

若 S>1 , 则公式(1)中的取整符号不能消去,o 与 i 为 多对1 的关系。 效仿 S=1时的情形, 我们有结论:

如果卷积层函数和反卷积层函数的 kernel_size, padding size参数相同(且 stride>1),设反卷基层的输入输出形状为 i' 和 o', 卷积层的输入输出形状i和o,

i' = [ (o' + 2p - k)/s ] +1

已知 i', 我们可以得出 s 个 o' 解:

o'(0) = ( i' - 1) x s + k - 2p
o'(1) = o'(1) + 1
o'(2) = o'(1) + 2
...
o'(s-1) = o'(1) + s-1

即:

o'(n) =o'(1) + n = ( i' - 1) x s + k - 2p + n,
n = {0, 1, 2...s-1}

为了确定唯一的 o' 解, 我们用反卷积层函数中的ouput padding参数指定公式中的 n 值。这样,我们就回答了问题(2)。

摘一个简单的例子:

PyTorch中反卷积的用法详解

(3) 实验验证

给出一小段测试代码,改变各个参数值,运行比较来验证上面得出的结论,have fun~.

from torch import nn
from torch.nn import init
from torch.autograd import Variable

dconv = nn.ConvTranspose2d(in_channels=1, out_channels= 1, kernel_size=2, stride=2, padding=1,output_padding=0, bias= False)
init.constant(dconv.weight, 1)
print(dconv.weight)

input = Variable(torch.ones(1, 1, 2, 2))
print(input)
print(dconv(input))

以上这篇PyTorch中反卷积的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用append合并两个数组的方法
Apr 28 Python
在Python中操作字典之update()方法的使用
May 22 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
python gdal安装与简单使用
Aug 01 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
如何通过python实现人脸识别验证
Jan 17 Python
详解Python中的分支和循环结构
Feb 11 Python
Python类及获取对象属性方法解析
Jun 15 Python
python 解决微分方程的操作(数值解法)
May 26 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 #Python
Pytorch实现各种2d卷积示例
Dec 30 #Python
Python面向对象之多态原理与用法案例分析
Dec 30 #Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 #Python
python面向对象之类属性和类方法案例分析
Dec 30 #Python
基于Python执行dos命令并获取输出的结果
Dec 30 #Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 #Python
You might like
十天学会php之第十天
2006/10/09 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
PHP编程风格规范分享
2014/01/15 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
Vue中CSS动画原理的实现
2019/02/13 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
微信小程序实现蓝牙打印
2019/09/23 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
Python实现端口复用实例代码
2014/07/03 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
Python多线程正确用法实例解析
2020/05/30 Python
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
任命书怎么写
2014/06/04 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
运动员入场前导词
2015/07/20 职场文书
PHP实现两种排课方式
2021/06/26 PHP
POST提交数据常见的四种方式
2022/01/18 HTML / CSS
python 远程执行命令的详细代码
2022/02/15 Python
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android
Go语言编译原理之变量捕获
2022/08/05 Golang