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网络编程学习笔记(三):socket网络服务器
Jun 09 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
Python中按值来获取指定的键
Mar 04 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
Feb 24 Python
python 多线程共享全局变量的优劣
Sep 24 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 Python
python通过cython加密代码
Dec 11 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 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
Smarty+QUICKFORM小小演示
2007/02/25 PHP
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
PHP编程风格规范分享
2014/01/15 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
vue实现多级菜单效果
2019/10/19 Javascript
js实现div色块碰撞
2020/01/16 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
python爬虫实现获取下一页代码
2020/03/13 Python
Python count函数使用方法实例解析
2020/03/23 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
python线程里哪种模块比较适合
2020/08/02 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
社区端午节活动方案
2014/01/28 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
学习焦裕禄先进事迹心得体会
2016/01/23 职场文书