反卷积详解

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

一.概述

反卷积又称转秩卷积(Transposed Convolution),上采样(Upsampled )。

其作用举例如下:

1.当我们用神经网络生成图片的时候,经常需要将一些低分辨率的图片转换为高分辨率的图片。

                          lowtohigh

 2.在语义分割中,会使用卷积层在编码器中进行特征提取,然后在解码层中进行恢复为原先的尺寸,这样才可以对原来图像的每个像素都进行分类。这个过程同样需要用到转置卷积。

 二.卷积操作

让我们回顾下卷积操作是怎么工作的,并且我们将会从一个小例子中直观的感受卷积操作。假设我们有一个4×4的矩阵,我们将在这个矩阵上应用3×3的卷积核,并且不添加任何填充(padding),步进参数(stride)设置为1,就像下图所示,输出为一个2×2的矩阵。

                           è¿éåå¾çæè¿°

 这个卷积操作在输入矩阵和卷积核中,对每个元素的乘积进行相加。因为我们没有任何填充和使用1为步进,因此我们只能对这个操作进行4次,因此我们的输出矩阵尺寸为2×2。

                                 è¿éåå¾çæè¿°

这种卷积操作使得输入值和输出值之间存在有位置上的连接关系,举例来说,输入矩阵左上方的值将会影响到输出矩阵的左上方的值。更具体而言,3×3的卷积核是用来连接输入矩阵中的9个值,并且将其转变为输出矩阵的一个值的。一个卷积操作是一个多对一(many-to-one)的映射关系。让我们记住这个,我们接下来将会用得着。

三.反卷积

现在,假设我们想要反过来操作。我们想要将输入矩阵中的一个值映射到输出矩阵的9个值,这将是一个一对多(one-to-many)的映射关系。这个就像是卷积操作的反操作,其核心观点就是用转置卷积。举个例子,我们对一个2×2的矩阵进行上采样为4×4的矩阵。这个操作将会维护一个1对应9的映射关系。

                                 è¿éåå¾çæè¿°

 但是我们将如何具体操作呢?为了接下来的讨论,我们需要定义一个卷积矩阵(convolution matrix)和相应的转置卷积矩阵(transposed convolution matrix)。

四.卷积矩阵

我们可以将一个卷积操作用一个矩阵表示。这个表示很简单,无非就是将卷积核重新排列到我们可以用普通的矩阵乘法进行矩阵卷积操作。如下图就是原始的卷积核:

                                                                    è¿éåå¾çæè¿°

我们对这个3×3的卷积核进行重新排列,得到了下面这个4×16的卷积矩阵: 

                           è¿éåå¾çæè¿°

这个便是卷积矩阵了,这个矩阵的每一行都定义了一个卷积操作。下图将会更加直观地告诉你这个重排列是怎么进行的。每一个卷积矩阵的行都是通过重新排列卷积核的元素,并且添加0补充(zero padding)进行的。

                          è¿éåå¾çæè¿°

 为了将卷积操作表示为卷积矩阵和输入矩阵的向量乘法,我们将输入矩阵4×4摊平(flatten)为一个列向量,形状为16×1,如下图所示。

                                          è¿éåå¾çæè¿°

我们可以将这个4×16的卷积矩阵和1×16的输入列向量进行矩阵乘法,这样我们就得到了输出列向量。 

                                      è¿éåå¾çæè¿°

这个输出的4×1的矩阵可以重新塑性为一个2×2的矩阵,而这个矩阵正是和我们一开始通过传统的卷积操作得到的一模一样。

                                                                                   è¿éåå¾çæè¿°

 

简单来说,这个卷积矩阵除了重新排列卷积核的权重之外就没有啥了,然后卷积操作可以通过表示为卷积矩阵和输入矩阵的列向量形式的矩阵乘积形式进行表达。

所以各位发现了吗,关键点就在于这个卷积矩阵,你可以从16(4×4)到4(2×2)因为这个卷积矩阵尺寸正是4×16的,然后呢,如果你有一个16×4的矩阵,你就可以从4(2×2)到16(4×4)了,这不就是一个上采样的操作吗?啊哈!让我们继续吧!

五.转置卷积矩阵

我们想要从4(2×2)到16(4×4),因此我们使用了一个16×4的矩阵,但是还有一件事情需要注意,我们是想要维护一个1到9的映射关系。

假设我们转置这个卷积矩阵C  (4×16)变为CT  (16×4)。我们可以对CT和列向量(4×1)进行矩阵乘法,从而生成一个16×1的输出矩阵。这个转置矩阵正是将一个元素映射到了9个元素。

                        è¿éåå¾çæè¿°

这个输出可以塑形为(4×4)的矩阵:

                                                        è¿éåå¾çæè¿°

我们只是对小矩阵(2×2)进行上采样为一个更大尺寸的矩阵(4×4)。这个转置卷积矩阵维护了一个1个元素到9个元素的映射关系,因为这个关系正表现在了其转置卷积元素上。

需要注意的是:这里的转置卷积矩阵的参数,不一定从原始的卷积矩阵中简单转置得到的,转置这个操作只是提供了转置卷积矩阵的形状而已。

六.总结

转置卷积操作构建了和普通的卷积操作一样的连接关系,只不过这个是从反向方向开始连接的。我们可以用它进行上采样。另外,这个转置卷积矩阵的参数是可以学习的,因此我们不需要一些人为预先定义的方法。即使它被称为转置卷积,它并不是意味着我们将一些现存的卷积矩阵简单转置并且使用其转置后的值。

从本质来说,转置卷积不是一个卷积,但是我们可以将其看成卷积,并且当成卷积这样去用。我们通过在输入矩阵中的元素之间插入0进行补充,从而实现尺寸上采样,然后通过普通的卷积操作就可以产生和转置卷积相同的效果了。你在一些文章中将会发现他们都是这样解释转置卷积的,但是这个因为在卷积操作之前需要通过添加0进行上采样,因此是比较低效率的。

注意:转置卷积会导致生成图像中出现棋盘效应(checkerboard artifacts),这篇文章《Deconvolution and Checkerboard Artifacts》推荐了一种上采样的操作(也就是插值操作),这个操作接在一个卷积操作后面以减少这种现象。如果你的主要目的是生成尽可能少棋盘效应的图像,那么这篇文章就值得你去阅读。


http://chatgpt.dhexx.cn/article/45Btriqp.shtml

相关文章

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

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

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

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

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

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

链表-双链表

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

八股文之mysql

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

数据库-MySQL

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

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

本文章是❤️剑指 offer(第2版)❤️的内容,该专栏还有多篇优质内容在等待你观看,现在点击右上角点击这个————🚀订阅专栏🚀 🔆坚持刷算法 💎每天进步一点点 🚀冲冲冲冲…

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

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

Mysql数据库面经

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

MySQL进阶

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

MySQL经典100问

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

Mysql常见面试题

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

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

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

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

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

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

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

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中 注意:这里我将链表中的实际的串联的数据叫做数据类比如:lock_t、mem_block_t 链表作为一种的非常重要的数据结构,在任何地方都会用到,这里简单解释一下innodb双向链表的实现,让我们来看看innodb链表设…

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

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

【链表】反转链表

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

IntelliJ IDEA 2019.1破解

此破解针对只针对IntelliJ IDEA 2019.1,高于此版本本人测试无法破解。 进入官网 http://www.jetbrains.com/idea/ 选择download——Ultimate版本 上图2019.1.1版本无法适用本破解方案。选择 Previous versions(历史版本) 选择此版本下载 或直接点击此链接下载&…