PyTorch中反卷积的用法详解

yipeiwu_com6年前Python基础

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))

以上这篇PyTorch中反卷积的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

详解Python如何生成词云的方法

详解Python如何生成词云的方法

前言 今天教大家用wrodcloud模块来生成词云,我读取了一篇小说并生成了词云,先看一下效果图: 效果图一: 效果图二: 根据效果图分析的还是比较准确的,小说中的主人公就是“程...

详解一种用django_cache实现分布式锁的方式

问题背景 在项目开发过程中,我遇到一个需求:对于某条记录,一个用户对它进行操作时会持续比较久,希望在一个用户的操作期间,不允许有另一个用户操作它,否容易会出现混乱。 在与同事们讨论后,想...

用python解压分析jar包实例

写这个玩意的背景:在u8多渠道打包里,需要分析jar包,并把里面的文件按目录和类型分别放在root和assets文件夹里,之前师兄都是手动解压,一个一个文件夹找文件,效率比较低,刚好最近...

Python使用Django实现博客系统完整版

Python使用Django实现博客系统完整版

今天花了一些时间搭了一个博客系统,虽然并没有相关于界面的美化,但是发布是没问题的。 开发环境 操作系统:windows 7 64位 Django: 1.96 Python:2.7.1...

修复 Django migration 时遇到的问题解决

今天想给自己的 Blog 加点功能,顺便补上测试,然而第一步在创建测试数据库就过不了,我就尝试解决这个问题。 在跑 ./manage.py test 时,先会创建一个测试用的数据库,这时...