PyTorch中反卷积的用法详解
作者:月牙眼的楼下小黑 发布时间:2022-09-21 18:12:34
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)
摘两个例子:
(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)。
摘一个简单的例子:
(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))
来源:https://www.jianshu.com/p/01577e86e506
猜你喜欢
- ndarray.ndim:维度ndarray.shape:形状ndarray.size:元素个数ndarray.dtype:元素数据类型nd
- 概 述 ---- 现在有不少介绍利用ASP实现动态分页的文章,方法大同小异,就是每次利用ADO返回原始
- 1、目的:在Python中实现只读取扩展名为xlsx的文件解决方法:使用os模块。解决思路:1、确定目录2、循环遍历每一个文件3、筛选符合条
- 一、读者指引 读者指引帮助你掌握本文的梗概。以免你看了大半才明白这编文章不适合你,给你造成视觉污染。如果你正在用ASP+XML写一些程序,或
- 对于python2.7字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,
- 下面是调用方式:Example script - pymssql module (DB API 2.0) Example script -
- 查找二分查找二分搜索是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结
- 前言虚拟环境是程序执行时的独立执行环境,在同一台服务器中可以创建不同的虚拟环境供不同的系统使用,项目之间的运行环境保持独立性而相互不受影响。
- json和dictpython中的dict类型要转换为json格式的数据需要用到json库:import json <json>
- JavaScript 有三种弹窗 Alert (只有确定按钮), Confirmation (确定,取消等按钮), Prompt (有输入对
- 遇到个小白常见的问题,发现度娘里面没有记录,翻墙谷歌了下,解决问题,在此写个说明。事情起因:在jupyter notebook中导入文件时发
- 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。而使用@staticmethod或@classmethod,就可以不需要实例化
- 1. JSON简介JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它是JavaScript的子
- <% SoFia_DbName="jiaoyou&qu
- 代码如下:'************************************ '截取文字长度函数,支持UT
- 很棒的新闻发布系统分享给大家,希望大家喜欢。下面就让我们来说一说基于jsp的新闻发布系统,其中使用的技术有JavaBean、fillter、
- 本文实例为大家分享了Python实现用户名和密码登录的具体代码,供大家参考,具体内容如下功能登录及注册,密码错误多次后验证码确认说明初次运行
- cookie并不陌生,与session一样,能够让http请求前后保持状态。与session不同之处,在于cookie数据仅保存于客户端。r
- 我们选择一种问题的解决办法,通常需要考虑到想要达到的效果,还有最重要的是这个办法本身的优缺点有哪些,与其他的方法对比哪一个更好。之前小编之前
- 代码如下:<%@ Language=VBScript %> <% Dim