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 urlopen()函数 示例分享
Jun 12 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
Python输出汉字字库及将文字转换为图片的方法
Jun 04 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
Python实现的选择排序算法示例
Nov 29 Python
Python+tkinter使用40行代码实现计算器功能
Jan 30 Python
TensorFlow实现Batch Normalization
Mar 08 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
Python列表list常用内建函数实例小结
Oct 22 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 团购折扣计算公式
2011/11/24 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
js 操作select相关方法函数
2009/12/06 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
javaScript动态添加Li元素的实例
2018/02/24 Javascript
小程序实现多列选择器
2019/02/15 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python使用functools模块中的partial函数生成偏函数
2016/07/02 Python
Python三级菜单的实例
2017/09/13 Python
Python字符串和字典相关操作的实例详解
2017/09/23 Python
python绘制条形图方法代码详解
2017/12/19 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
python实现excel读写数据
2021/03/02 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
聚网科技C++面试笔试题
2015/09/01 面试题
工程部经理岗位职责
2013/12/08 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
明星邀请函
2015/02/02 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
廉政承诺书2015
2015/04/28 职场文书
毕业证明书
2015/06/19 职场文书
python异常中else的实例用法
2021/06/15 Python
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android