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)

摘两个例子:

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

来源:https://www.jianshu.com/p/01577e86e506

标签:PyTorch,反卷积
0
投稿

猜你喜欢

  • JBuilderX+SQL Server开发hibernate

    2023-06-27 00:30:37
  • CSS实现元素透明的那些事

    2009-09-07 12:22:00
  • JavaScript利用时间分片实现高性能渲染数据详解

    2024-04-29 13:24:26
  • 用户体验 保守的使用下拉菜单

    2008-01-15 20:00:00
  • Python实现FLV视频拼接功能

    2021-09-19 02:41:48
  • python中的type,元类,类,对象用法

    2022-08-24 09:54:55
  • Pytorch之view及view_as使用详解

    2023-10-09 23:10:34
  • Python numpy和matlab的几点差异介绍

    2023-12-14 23:26:39
  • 解决项目pycharm能运行,在终端却无法运行的问题

    2021-11-03 21:05:07
  • Python的pycurl包用法简介

    2023-11-27 14:38:21
  • 一些关于python 装饰器的个人理解

    2021-11-27 21:41:33
  • Django框架静态文件使用/中间件/禁用ip功能实例详解

    2023-06-12 02:48:38
  • Python Pygame实战之红心大战游戏的实现

    2023-08-23 02:28:08
  • win2003服务器下配置 MySQL 群集(Cluster)的方法

    2024-01-24 17:46:46
  • 用asp实现的代码批量修改程序

    2007-09-24 13:31:00
  • SQL Server附加数据库报错无法打开物理文件,操作系统错误5的图文解决教程

    2024-01-13 04:20:28
  • python进行图像边缘检测的详细教程

    2023-08-10 04:53:40
  • Python小白学习爬虫常用请求报头

    2024-01-02 06:39:19
  • iframe高度自适应,兼容IE,FF

    2008-06-18 12:15:00
  • Go 多环境下配置管理方案(多种方案)

    2024-05-25 15:15:37
  • asp之家 网络编程 m.aspxhome.com