Pytorch中torch.nn.ConvTranspose2d函数详解

2023-10-16 07:08

本文主要是介绍Pytorch中torch.nn.ConvTranspose2d函数详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理

ConvTranspose,即反卷积,通过卷积的形式,利用图像特征“恢复”到原图像。

当然,此处卷积核的权重参数与前面下采样卷积核的参数互相独立,且可更新。

也就是说“反”卷积不是之前的逆过程,无法保证完全恢复。

事实上,反卷积仅仅保留了特征与前级特征,点之间的对应关系

代码详解

简明起见,引入“正卷积”概念,意指从 低级特征 到 高级特征 的过程。

ConvTranspose2d 与 Conv2d 的参数形式、含义基本一致。需要注意的仅两点:

  • out_padding 这个也是补零,但是对反卷积后的特征图补零。
    • 设置该参数是由于不同尺寸的特征经卷积(下采样)后可以产生相同尺寸的特征,那么在反卷积对应回去的时候,通过out_padding解决多尺寸的问题。说白了,根本原因在于之前的卷积(下采样)有时会无法利用所有原始信息,有边角料未利用,如:input=5x5,padding=0,kernel_size=2x2,stride=2这种情况。
  • stride & padding 卷积步长和补零。
    • 反直觉的是:padding为之前“正卷积”补零个数
      • padding=0,“正卷积”为valid模式,那么要恢复原尺寸,反卷积就应为full模式,即为该特征两侧各补kernel_size-1个0;
      • padding=kernel_size-1,那么“正卷积”为full模式,则反卷积不用再补零。
      • padding=p,where 0<p<kernel_size-1,反卷积每侧补零数为kernel_size-1-p,即所谓p'=kernel_size-1-p。
    • stride 不再控制上采样的步长,而是控制输入特征图中,像素点间的间隙。原来的步长概念此时恒为1。stride默认为1,即无间隙。若stride=m,则输入特征图的像素点增添间隙,散开来,尺寸变为(input-1)x stride+1。
      • 事实上,这里的增大间隙正是下采样增大步长的对应过程。原来增大步长后,所卷积得到的特征图的相邻点,映射到原特征的区域之间的间距会变大。那么再通过卷积反求原来的低级特征时,就要将这个间距实实在在体现到对高级特征的处理上,即所谓增大间隙。(反卷积又称分数步长卷积,此即分数步长之体现、由来)

综上,给出ConvTranspose2d输入、输出特征大小计算式:

令输入特征大小为 i,输出为 o,反卷积核为 k x k,则有

o=\frac{\left \{ \left [\left ( i-1 \right )\times stride +1 \right ] +\left [ \left ( k-1-padding \right ) \times 2\right ]-k\right \}}{default\equiv 1}+1+outpadding

o=\left ( i-1 \right )\times stride+k-2padding+outpadding

 

可参考如下链接:Transposed convolution arithmetic

这篇关于Pytorch中torch.nn.ConvTranspose2d函数详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/219863

相关文章

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

java String.join()方法实例详解

《javaString.join()方法实例详解》String.join()是Java提供的一个实用方法,用于将多个字符串按照指定的分隔符连接成一个字符串,这一方法是Java8中引入的,极大地简化了... 目录bVARxMJava String.join() 方法详解1. 方法定义2. 基本用法2.1 拼接

Java中的record使用详解

《Java中的record使用详解》record是Java14引入的一种新语法(在Java16中成为正式功能),用于定义不可变的数据类,这篇文章给大家介绍Java中的record相关知识,感兴趣的朋友... 目录1. 什么是 record?2. 基本语法3. record 的核心特性4. 使用场景5. 自定

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以