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中反卷积的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: PyTorch中反卷积的用法详解

本文地址: http://www.cppcns.com/jiaoben/python/296287.html

python中如何反解函数_PyTorch中反卷积的用法详解相关推荐

  1. python中values是什么意思_Python values()与itervalues()的用法详解

    dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value: d = { 'Adam': 95, 'Li ...

  2. linux中grep命令 菜鸟教程,linux grep正则表达式与grep用法详解

    需要大家牢记:正则表达式与通配符不一样,它们表示的含义并不相同 正则表达式只是字符串的一种描述,只有和支持正则表达式的工具相结合才能进行字符串处理.本文以grep为例来讲解正则表达式. grep命令 ...

  3. linux中id命令的功能,Linux id命令参数及用法详解

    Linux id命令参数及用法详解--Linux查看当前登陆用户uid,gid. 命          令:id 功能说明:查看显示目前登陆账户的uid和gid及所属分组及用户名 语 法:id [-g ...

  4. python 内存分析工具_python内存监控工具memory_profiler和guppy的用法详解

    python2.7在内存管理上相比python3还是有些坑的,其释放后的内存仍然保留在python的内存池中,不被系统所用.python循环引用的变量不会被回收,这会导致程序越运行,占用的内存越大.我 ...

  5. python dataframe index loc_基于DataFrame筛选数据与loc的用法详解

    DataFrame筛选数据与loc用法 python中pandas下的DataFrame是一个很不错的数据结构,附带了许多操作.运算.统计等功能. 如何从一个DataFrame中筛选中出一个元素呢. ...

  6. python for i in range(len())_Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  7. linux 中的who的参数,linux who命令参数及用法详解

    执行这项指令可得知目前有那些用户登入系统,单独执行who指令会列出登入帐号,使用的终端机,登入时间以及从何处登入或正在使用哪个X显示器 linux who 命令 详解 Linux最常用命令之一 功能说 ...

  8. python代码覆盖率怎么统计的_Python代码覆盖率统计工具coverage.py用法详解

    1.安装coverage pip install coverage 安装完成后,会在Python环境下的\Scripts下看到coverage.exe: 2.Coverage 命令行 coverage ...

  9. Python多线程编程(一):threading 模块 Thread 类的用法详解

    我们进行程序开发的时候,肯定避免不了要处理并发的情况. 一般并发的手段有采用多进程和多线程. 但线程比进程更轻量化,系统开销一般也更低,所以大家更倾向于用多线程的方式处理并发的情况. Python 提 ...

最新文章

  1. 【Luogu P2764】最小路径覆盖问题
  2. HDLBits 系列(32)Sequence recognition(序列检测)
  3. colease函数 mysql_SqlConnection 概述
  4. rancher k8s docker 关系_【环境搭建】Ubuntu20.04通过rke部署K8S
  5. 5.Vue 计算属性和侦听器
  6. windows下RocketMQ下载、安装、部署、控制台
  7. 这些年无处安放的博客
  8. GitHub 60000+ Star 登顶,命令行的艺术!
  9. 老程序员也搞不定的 4 个巨坑!
  10. DBA_实践指南系列7_Oracle Erp R12监控OAM(案例)
  11. 【编辑器】VSCode配置C++编译
  12. 一个树杈y图片_鬼脸纹:黄花梨树上一个树杈,反映到主干上时,会形成一个疖痕...
  13. win10 修改hosts文件
  14. 安装西门子博图一直重启_博途V15.1安装及无限重启和.net3.5SP1错误处理解决方法...
  15. 设计性思考维模型及步骤(上)
  16. HTML/CSS中的空格如何处理
  17. 2022AcWing寒假算法每日一题之2058. 笨拙的手指
  18. 【冰爪游戏】MC教程 —— PCL启动器
  19. 我不想关注你了,饭否
  20. 鼎捷软件贡献数字化智慧 赋能装备制造行业转型发展

热门文章

  1. HDU1850 Being a Good Boy in Spring Festival【Nim博弈】
  2. HDU2025 查找最大元素【入门】
  3. HDU1106 排序(解法二)(废除!!!)
  4. 理解 RESTful
  5. Python 基础 —— re:正则表达
  6. [面试] C++ 语法(一) —— 初始化列表的初始化顺序
  7. 为 Notepad++ 安装 NppFTP 插件,查看修改虚拟机上的文本文件
  8. 强悍的 Linux —— 强悍的 ls
  9. java数据库技术_JAVA数据库技术
  10. python基础-菜鸟世界 -python基础---set