关于转置卷积(反卷积)的理解[通俗易懂]

关于转置卷积(反卷积)的理解[通俗易懂]本文地址:https://blog.csdn.net/isMarvellous/article/details/80087705,转载请注明出处。什么是转置卷积(反卷积)?转置卷积(TransposedConvolution)又称为反卷积(Deconvolution)。在PyTorch中可以使用torch.nn.ConvTranspose2d()来调用,在Caffe中也有对应的层deco…

大家好,又见面了,我是你们的朋友全栈君。

本文地址:https://blog.csdn.net/isMarvellous/article/details/80087705,转载请注明出处。

什么是转置卷积(反卷积)?

转置卷积(Transposed Convolution)又称为反卷积(Deconvolution)。在PyTorch中可以使用torch.nn.ConvTranspose2d()来调用,在Caffe中也有对应的层deconv_layer。

转置卷积常常用于CNN中对特征图进行上采样,比如语义分割和超分辨率任务中。之所以叫转置卷积是因为,它其实是把我们平时所用普通卷积操作中的卷积核做一个转置,然后把普通卷积的输出作为转置卷积的输入,而转置卷积的输出,就是普通卷积的输入。这样说可能有点绕,我们可以参照CNN中的反向传播过程来理解,转置卷积形式上就和一个卷积层的反向梯度计算相同。既然是输入输出对调,那么就有两个很重要的特性:

  1. 转置的卷积核变为了普通卷积核的转置;
  2. 如果把由输入特征图到输出特征图的计算过程画成一个计算图,那么输入输出元素的连接关系是不变的

关于第二点,也就是说,在普通卷积中,若元素a和元素1有连接(元素1由a计算得到),那么在相应的转置卷积中,元素1和元素a依然是有连接的(元素a由元素1计算得到)。

下面就基于此讨论一下我对转置卷积计算过程的一个理解。这并不是一个严格的推导,只是为了形象地帮助理解为什么要这样计算,或者说这个计算过程是怎么来的。然后再总结一下转置卷积输出特征图大小的计算。由于是自己的个人见解,难免有疏漏或理解不准确的地方,这里总结出来,希望大家一起来讨论。

普通卷积的计算过程

如下图:
这里写图片描述
这是一个卷积核大小为3×3,步长为2,padding为1的普通卷积。卷积核在红框位置时输出元素1,在绿色位置时输出元素2。我们可以发现,输入元素a仅和一个输出元素有运算关系,也就是元素1,而输入元素b和输出元素1, 2均有关系。同理c只和一个元素2有关,而d和1,2,3,4四个元素都有关。那么在进行转置卷积时,依然应该保持这个连接关系不变。

转置卷积(反卷积)的计算过程

根据前面的分析,我们需要将上图中绿色的特征图作为输入,蓝色的特征图作为输出,并且保证连接关系不变。也就是说,a只和1有关,b和1,2两个元素有关,其它类推。怎么才能达到这个效果呢?我们可以先用0给绿色特征图做插值,插值的个数就是使相邻两个绿色元素的间隔为卷积的步长,同时边缘也需要进行与插值数量相等的补0。如下图:
这里写图片描述
注意,这时候卷积核的滑动步长就不是2了,而是1,步长体现在了插值补0的过程中。

一般在CNN中,转置卷积用于对特征图进行上采样,比如我们想要将特征图扩大2倍,那么就可以使用步长为2的转置卷积。但是且慢!为什么我们这里2×2的输入,只得到了3×3的输出呢?说好的扩大2倍呢?不应该是4×4么?
别急,我们来算一算为什么是3×3。
我们将2×2的特征图插空并在边缘补0后,边长变成了2×2+1=5,使用3×3的卷积核做滑动步长为1的卷积,得到的特征图边长为(5-3+1)/1=3。所以我们只得到了3×3而非4×4的输出。那么在一般情况下,输出特征图的大小要怎么计算呢?下面我们来总结一下。

输出特征图的尺寸计算

假设我们做转置卷积的输入特征图大小为 n × n n \times n n×n,卷积核大小为 k × k k \times k k×k,后面为了表示方便,我们直接使用边长来表示大小。
步长stride为 s s s,那么转置卷积需要在四周每个边缘补0的数量为 s − 1 s-1 s−1,边缘和内部插空补0后输入特征图大小变为
s × n + s − 1 s \times n + s – 1 s×n+s−1;
使用大小为 k k k的卷积核进行卷积(滑动步长为1),得到的输出特征图大小为:
( s × n + s − 1 − k + 1 ) / 1 = s × n + ( s − k ) (s \times n + s – 1 – k +1) / 1 = s \times n +(s – k) (s×n+s−1−k+1)/1=s×n+(s−k)。
可以看到,转置卷积并不是严格将输入特征图变为了s倍,而是还相差了个 s − k s-k s−k。

当然这个公式只是转置卷积的一种理解方法,在实际的实现中,还有不同的padding, stride和dilation配置,输出图像大小也会随之改变。本文的目的在于给出一个我自己对于转置卷积的理解。实际上转置卷积的转置一词是因为前述的卷积核转置,这里可以视为一种等效的理解。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151937.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • protel99se学习笔记

    protel99se学习笔记第一次画原理图,遇到好多问题,zuoxi

    2022年5月29日
  • 51单片机C语言延时函数怎么定义和使用

    51单片机C语言延时函数怎么定义和使用C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsignedchar类型具有比unsignedint更优化的代码,在使用时应该使用unsignedchar作为延时变量。

    2022年6月15日
  • 0基础激光切割怎么学_吉他入门零基础视频教程

    0基础激光切割怎么学_吉他入门零基础视频教程杂谈最近有几个人加我,都说是刚开始学激光slam,基本都是研一,情况也都差不多,有的是课题组里只有自己做slam,有的是完全没人带,自己也没有基础.仔细想一想,其实入门slam真是个不容易的事.首先,编程语言,大多数使用c++,少数用python,c++你得至少能写个小demo吧.知道了如何写c++,还要准备编译环境吧,由于编译以及依赖等问题,做slam基本都用linux,还得知道如何使用ubuntu的命令行,知道怎么编译代码.关于机器人相关的大部分代码都使用ros做接口,因为接口统一,使用方式统

    2022年8月23日
  • scp和rsync命令[通俗易懂]

    scp和rsync命令[通俗易懂]SCP命令(1)scp定义scp可以实现服务器与服务器之间的数据拷贝。(fromserver1toserver2)(2)基本语法scp-r$pdir/$fname$user@$host:$pdir/$fname命令递归要拷贝的文件路径/名称目的地用户@主机:目的地路径/名称(3)基本示例scp-rjdk1.8.0_291/root@hadoop103:opt/modulescp-rroot@hadoop102:/opt/module/*root@h

    2022年8月30日
  • Sublime text3 Version 3.2.1 3207 和 3.2.2 3211(2019-11-06亲测有效)

    Sublime text3 Version 3.2.1 3207 和 3.2.2 3211(2019-11-06亲测有效)Sublimetext3Version3.2.13207激活码许可证(2019-04-30亲测有效)在hosts中添加: 127.0.0.1license.sublimehq.comhosts地址: C:\Windows\System32\drivers\etc点击下载Sublimetext3打开sublime安装文件地址点击下载激活成功教程工具将激活成功教程工具复制到安装文件…

    2022年7月11日
  • 找回 Ubuntu 11.10 的传统界面 (Gnome Classic)

    找回 Ubuntu 11.10 的传统界面 (Gnome Classic)

    2021年8月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号