反卷积(Transposed Convolution, Fractionally Strided Convolution or Deconvolution)

article/2025/9/19 23:11:46





反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文 Deconvolutional networks 中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中( Adaptive deconvolutional networks for mid and high level feature learning )。随着反卷积在神经网络可视化上的成功应用,其被越来越多的工作所采纳比如:场景分割、生成模型等。其中反卷积(Deconvolution)也有很多其他的叫法,比如:Transposed Convolution,Fractional Strided Convolution等等。

这篇文章的目的主要有两方面:
1. 解释卷积层和反卷积层之间的关系;
2. 弄清楚反卷积层输入特征大小和输出特征大小之间的关系。

## 卷积层

卷积层大家应该都很熟悉了,为了方便说明,定义如下:
- 二维的离散卷积( N=2N=2
- 方形的特征输入( i1=i2=ii1=i2=i
- 方形的卷积核尺寸( k1=k2=kk1=k2=k
- 每个维度相同的步长( s1=s2=ss1=s2=s
- 每个维度相同的padding ( p1=p2=pp1=p2=p )

下图表示参数为  (i=5,k=3,s=2,p=1)(i=5,k=3,s=2,p=1)  的卷积计算过程,从计算结果可以看出输出特征的尺寸为  (o1=o2=o=3)(o1=o2=o=3)


下图表示参数为 (i=6,k=3,s=2,p=1)(i=6,k=3,s=2,p=1) 的卷积计算过程,从计算结果可以看出输出特征的尺寸为 (o1=o2=o=3)(o1=o2=o=3)



从上述两个例子我们可以总结出卷积层输入特征与输出特征尺寸和卷积核参数的关系为:
o=i+2pks+1.o=⌊i+2p−ks⌋+1.
其中 x⌊x⌋ 表示对 xx 向下取整。

反卷积层

在介绍反卷积之前,我们先来看看卷积运算和矩阵运算之间的关系。

卷积和矩阵相乘

考虑如下一个简单的卷积层运算,其参数为 (i=4,k=3,s=1,p=0)(i=4,k=3,s=1,p=0),输出 o=2o=2



对于上述卷积运算,我们把上图所示的3×3卷积核展成一个如下所示的[4,16]的稀疏矩阵 CC, 其中非0元素 wi,jwi,j 表示卷积核的第 ii 行和第 jj 列。




w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,200000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2


(w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,200000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2)

我们再把4×4的输入特征展成[16,1]的矩阵 XX,那么 Y=CXY=CX 则是一个[4,1]的输出特征矩阵,把它重新排列2×2的输出特征就得到最终的结果,从上述分析可以看出卷积层的计算其实是可以转化成矩阵相乘的。值得注意的是,在一些深度学习网络的开源框架中并不是通过这种这个转换方法来计算卷积的,因为这个转换会存在很多无用的0乘操作,Caffe中具体实现卷积计算的方法可参考Implementing convolution as a matrix multiplication。

通过上述的分析,我们已经知道卷积层的前向操作可以表示为和矩阵CC相乘,那么 我们很容易得到卷积层的反向传播就是和CC的转置相乘

反卷积和卷积的关系

全面我们已经说过反卷积又被称为Transposed(转置) Convolution,我们可以看出其实卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。因为卷积层的前向反向计算分别为乘 CC 和 CTCT,而反卷积层的前向反向计算分别为乘 CTCT 和 (CT)T(CT)T ,所以它们的前向传播和反向传播刚好交换过来。

下图表示一个和上图卷积计算对应的反卷积操作,其中他们的输入输出关系正好相反。如果不考虑通道以卷积运算的反向运算来计算反卷积运算的话,我们还可以通过离散卷积的方法来求反卷积(这里只是为了说明,实际工作中不会这么做)。

同样为了说明,定义反卷积操作参数如下:

  • 二维的离散卷积(N=2N=2
  • 方形的特征输入(i1=i2=ii1′=i2′=i′
  • 方形的卷积核尺寸(k1=k2=kk1′=k2′=k′
  • 每个维度相同的步长(s1=s2=ss1′=s2′=s′
  • 每个维度相同的padding (p1=p2=pp1′=p2′=p′)

下图表示的是参数为( i=2,k=3,s=1,p=2i′=2,k′=3,s′=1,p′=2)的反卷积操作,其对应的卷积操作参数为 (i=4,k=3,s=1,p=0)(i=4,k=3,s=1,p=0)。我们可以发现对应的卷积和非卷积操作其 (k=k,s=s)(k=k′,s=s′),但是反卷积却多了p=2p′=2。通过对比我们可以发现卷积层中左上角的输入只对左上角的输出有贡献,所以反卷积层会出现 p=kp1=2p′=k−p−1=2。通过示意图,我们可以发现,反卷积层的输入输出在 s=s=1s=s′=1 的情况下关系为:

o=ik+2p+1=i+(k1)2p
o′=i′−k′+2p′+1=i′+(k−1)−2p



Fractionally Strided Convolution

上面也提到过反卷积有时候也被叫做Fractionally Strided Convolution,翻译过来大概意思就是小数步长的卷积。对于步长 s>1s>1的卷积,我们可能会想到其对应的反卷积步长 s<1s′<1。 如下图所示为一个参数为 i=5,k=3,s=2,p=1i=5,k=3,s=2,p=1的卷积操作(就是第一张图所演示的)所对应的反卷积操作。对于反卷积操作的小数步长我们可以理解为:在其输入特征单元之间插入 s1s−1 个0,插入0后把其看出是新的特征输入,然后此时步长 ss′ 不再是小数而是为1。因此,结合上面所得到的结论,我们可以得出Fractionally Strided Convolution的输入输出关系为:

o=s(i1)+k2po′=s(i′−1)+k−2p



上面格式可能有点乱,可以参考下面原作。

转载至:http://buptldy.github.io/2016/10/29/2016-10-29-deconv/

更多关于卷积和反卷积的可视化理解:https://github.com/vdumoulin/conv_arithmetic


http://chatgpt.dhexx.cn/article/vSmyX0Aq.shtml

相关文章

反卷积详解

一.概述 反卷积又称转秩卷积(Transposed Convolution)&#xff0c;上采样(Upsampled )。 其作用举例如下&#xff1a; 1.当我们用神经网络生成图片的时候&#xff0c;经常需要将一些低分辨率的图片转换为高分辨率的图片。 2.在语义分割中&#xff0c;会使用卷积层在编码器中…

反卷积通俗详细解析与nn.ConvTranspose2d重要参数解释

文章目录 反卷积的作用卷积中padding的几个概念No PaddingHalf(Same) PaddingFull Padding 反卷积反卷积中的Padding参数反卷积的stride参数反卷积的output_padding参数 反卷积总结参考资料 反卷积的作用 传统的卷积通常是将大图片卷积成一张小图片&#xff0c;而反卷积就是反…

反卷积(Transposed conv deconv)实现原理(通俗易懂)

什么是卷积 卷积就是把卷积核放在输入上进行滑窗&#xff0c;将当前卷积核覆盖范围内的输入与卷积核相乘&#xff0c;值进行累加&#xff0c;得到当前位置的输出&#xff0c;其本质在于融合多个像素值的信息输出一个像素值&#xff0c;本质上是下采样的&#xff0c;所以输出的…

Mysql的基本使用——Mysql教案(一)

文章目录 Mysql的基本使用1. Mysql的安装2. Mysql基本操作数据库操作表操作SQL操作练习资源课堂练习 查询(SELECT)去重(distinct)别名(AS)限制查询数(limit)排序(ORDER BY)条件查询(WHERE)普通查询多条件的查询语句模糊查询BETWEEN AND 内连接查询(inner join)外连接查询(outer…

链表-双链表

双向链表应用实例 双向链表的操作分析和实现 使用带 head 头的双向链表实现 管理单向链表的缺点分析: 单向链表&#xff0c;查找的方向只能是一个方向&#xff0c;而双向链表可以向前或者向后查找。单向链表不能自我删除&#xff0c;需要靠辅助节点 &#xff0c;而双向链表&…

八股文之mysql

1、MySQL性能优化解决思路 SQL优化 表结构优化 程序配置优化 架构设计优化 硬件和操作系统优化 SQL语句优化 索引失效情况 最左前缀匹配原则 索引下推 表结构优化 将字段很多的表分解成多个表 对于字段较多的表&#xff0c;如果有些字段的使用频率很低&#xff0c;可以将…

数据库-MySQL

1.数据库基础概念 1.查看数据库-SQLsever学习基础概念 2.MySQL数据类型 1.MySQL支持多种数据类型&#xff0c;大致可分为四类 1.数值类型2.日期和时间类型3.字符串&#xff08;字符&#xff09;类型4.二进制类型 1.数值类型 1.整数类型 1.TINYINT&#xff08;小整型数&#xff…

【爆肝题解】❤️24❤️新手也能理解并学会的剑指offer题目❤️❤️剑指 Offer 24. 反转链表

本文章是❤️剑指 offer&#xff08;第2版&#xff09;❤️的内容&#xff0c;该专栏还有多篇优质内容在等待你观看&#xff0c;现在点击右上角点击这个————&#x1f680;订阅专栏&#x1f680; &#x1f506;坚持刷算法 &#x1f48e;每天进步一点点 &#x1f680;冲冲冲冲…

mysql 表结构反转,【数据结构】单向链表的反转/倒置的一种实现方法

【背景】 单向链表由于其存储灵活&#xff0c;所有的元素位置是通过额外开辟的指针作为指向的&#xff0c;于是在复习过程中&#xff0c;不由得想象一下如何将链表进行反转。 参考网上的教程&#xff0c;大多是用改变指针的指向进行实现&#xff0c;当然也有利用递归栈的特殊性…

Mysql数据库面经

目录 1、SQL1.1 介绍一下数据库分页1.2 介绍一下SQL中的聚合函数1.3 表跟表是怎么关联的&#xff1f;1.4 说一说你对外连接的了解1.5 说一说数据库的左连接和右连接1.6 SQL中怎么将行转成列&#xff1f;1.7 谈谈你对SQL注入的理解如何解决SQL注入1.8 将一张表的部分数据更新到另…

MySQL进阶

一、索引 1.1 索引概述 MySQL官方对索引的定义为&#xff1a;索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向)数据&#xff0c;这样就可以在这些数据…

MySQL经典100问

目录 常规篇 1、说一下数据库的三大范式&#xff1f; 2、只查询一条数据&#xff0c;但是也执行非常慢&#xff0c;原因一般有哪些&#xff1f; 3、count(*)、count(0)、count(id)实现方式的区别&#xff1f; 4、误删数据怎么办&#xff1f; 5、drop、truncate 和 delet…

Mysql常见面试题

文章目录 1. SQL1.1 介绍一下数据库分页1.2 SQL中怎么将行转成列&#xff1f;1.3 谈谈你对SQL注入的理解1.4 WHERE和HAVING有什么区别&#xff1f; 2. 索引2.1 说一说你对MySQL索引的理解2.2 如何创建及保存MySQL的索引&#xff1f;2.3 如何判断数据库的索引有没有生效&#xf…

mysql 表结构反转_数据结构-单链表反转的三种方式

单链表是一种线性数据结构&#xff0c;由当前节点数据和指向下个节点的指针组成&#xff0c;因为是单向的&#xff0c;所以称为单链表 单链表的反转&#xff1a; 例如&#xff1a;1—>2—>3—>4 反转成&#xff1a;4—>3—>2—>1 首先定义一个链表的节点&…

mysql 双向链表_23张图!万字详解「链表」,从小白到大佬!

链表和数组是数据类型中两个重要又常用的基础数据类型。 数组是连续存储在内存中的数据结构&#xff0c;因此它的优势是可以通过下标迅速的找到元素的位置&#xff0c;而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动&#xff0c;为了解决和平衡此问题于是就有了链表…

面试必备 | 不可不会的反转链表

反转链表这题真的是面试非常喜欢考的了&#xff0c;这题看起来简单&#xff0c;但是能用两种方法一遍 bug free 也是不容易的&#xff0c;面试的时候可以筛下来一大批人&#xff0c;无论是对 junior 还是 senior 面试都很爱考。 今天齐姐就带你梳理清楚思路&#xff0c;思路清楚…

C/C++基础题124.反转链表

Hello: Person person = new Person(); person.Name = “xueyubin”; person.WeChat = “18309212110”; person.HeaderPhoto=“戴眼镜、黑眼圈、格子衫、牛仔裤、双肩包”; person.Sex = “男”; String major[] = { ‘C’,“C++”, “Linux”,“MySQL” }; person.IWantSay(“…

MySQL跨库链表_MySQL InnoDB 中通用双向链表的实现

源码在Ut0lst.h中 注意&#xff1a;这里我将链表中的实际的串联的数据叫做数据类比如&#xff1a;lock_t、mem_block_t 链表作为一种的非常重要的数据结构&#xff0c;在任何地方都会用到&#xff0c;这里简单解释一下innodb双向链表的实现&#xff0c;让我们来看看innodb链表设…

链表常见面试题:反转链表

问题描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1: 输入: head [1,2,3,4,5] 输出: [5,4,3,2,1] 示例2: 输入: head [1,2] 输出: [2,1] 一、问题分析 这道题常见的解法有两种&#xff1a;双指针迭代 和 递归。 方法一…

【链表】反转链表

反转链表 要求我们不分配额外的空间&#xff0c;使链表进行反转。 题目分析 链表的节点结构如下&#xff1a; class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val val; }ListNode(int val, ListNode next) { this.val val; this.next ne…