博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[PyTorch]PyTorch中反卷积的用法
阅读量:5273 次
发布时间:2019-06-14

本文共 1733 字,大约阅读时间需要 5 分钟。

文章来源:

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)

摘两个例子:

1450389-20181213000110152-558555683.png

(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 - 2po'(1) = o'(1) + 1o'(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)。

摘一个简单的例子:

1450389-20181213000244182-1569330603.png

(3) 实验验证

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

from torch import nnfrom torch.nn import initfrom torch.autograd import Variabledconv = 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.cnblogs.com/kk17/p/10111768.html

你可能感兴趣的文章
Linux文件类型与扩展名
查看>>
mybatis Mapper XML 文件
查看>>
Gerrit代码Review入门实战
查看>>
【转】5个常用Java 代码混淆器 助你保护你的代码
查看>>
二、DBMS_JOB(用于安排和管理作业队列)
查看>>
Unity3d Hololens MR开发入门
查看>>
vue-分页搜索功能
查看>>
Redis源码剖析之主从复制
查看>>
Kafka实战系列--Kafka API使用体验
查看>>
【bzoj2770】YY的Treap 权值线段树
查看>>
[development][dpdk][hugepage] 大页内存的挂载
查看>>
【二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
查看>>
PHP学习笔记二十三【This】
查看>>
STM32学习之大纲
查看>>
P2010回文日期
查看>>
Python开发的10个小贴士
查看>>
bzoj:3616: War
查看>>
qrcode length overflow (1632>1056)--qrcode.js使用过程中二维码长度溢出解决办法
查看>>
我踩过的听过的那些坑
查看>>
CSS 制作3D旋转视频
查看>>