1. 卷积与反卷积(转置卷积)的关系推导:

2. Transposed Convolution, Fractionally Strided Convolution or Deconvolution

https://buptldy.github.io/2016/10/29/2016-10-29-deconv/

Posted on 2016-10-29

反卷积(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+2p−ks⌋+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 列。

我们再把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 ,所以它们的前向传播和反向传播刚好交换过来。

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

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

下图表示的是参数为( 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′=k−p−1=2p′=k−p−1=2。通过示意图,我们可以发现,反卷积层的输入输出在 s=s′=1s=s′=1 的情况下关系为:

o′=i′−k′+2p′+1=i′+(k−1)−2po′=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的卷积操作(就是第一张图所演示的)所对应的反卷积操作。对于反卷积操作的小数步长我们可以理解为:在其输入特征单元之间插入 s−1s−1 个0,插入0后把其看出是新的特征输入,然后此时步长 s′s′不再是小数而是为1。因此,结合上面所得到的结论,我们可以得出Fractionally Strided Convolution的输入输出关系为:

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

参考

conv_arithmetic

Is the deconvolution layer the same as a convolutional layer?

卷积与反卷积(转置卷积)关系的公式推导 及其各自的形式相关推荐

  1. [十三]深度学习Pytorch-卷积层(1D/2D/3D卷积、卷积nn.Conv2d、转置卷积nn.ConvTranspose)

    0. 往期内容 [一]深度学习Pytorch-张量定义与张量创建 [二]深度学习Pytorch-张量的操作:拼接.切分.索引和变换 [三]深度学习Pytorch-张量数学运算 [四]深度学习Pytor ...

  2. FCN全卷积网络和Deconv转置卷积原理描述

    直到RPN生成Roi的时候,MaskRcnn和FasterRcnn的结构都是一样的. 然后RPN会过滤掉一部分,剩下的Roi分成前景和背景(2分类),同时RPN会对Roi做一个初步的box回归. 接下 ...

  3. 反卷积(Deconvolution)/ 转置卷积(Transpose Convolution)

    提出于FCN. 反卷积和卷积类似,都是相乘相加的运算.只不过后者是多对一,前者是一对多.而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可.所以无论优化还是后向传播算法都是没有问题.图解如下:

  4. PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)

    PyTorch框架学习十--基础网络层(卷积.转置卷积.池化.反池化.线性.激活函数) 一.卷积层 二.转置卷积层 三.池化层 1.最大池化nn.MaxPool2d 2.平均池化nn.AvgPool2 ...

  5. 对深度可分离卷积、分组卷积、扩张卷积、转置卷积(反卷积)的理解

    参考: https://zhuanlan.zhihu.com/p/28749411 https://zhuanlan.zhihu.com/p/28186857 https://blog.yani.io ...

  6. PyTorch 入坑八:卷积与转置卷积

    卷积 操作 略 输入输出尺寸变化 略 PyTorch实现 nn.Conv2d(in_channels,out_channels,kernel_size,stride=1.padding=0,dilat ...

  7. 【机器学习】详解 转置卷积 (Transpose Convolution)

    目录 一.转置卷积的背景 二.转置卷积的应用 三.转置卷积的区别 四.转置卷积的推导 五.转置卷积的输出 5.1 stride = 1 5.2 stride > 1 ☆ 六.小结 一.转置卷积的 ...

  8. cnn stride and padding_彻底搞懂CNN中的卷积和反卷积

    前言 卷积和反卷积在CNN中经常被用到,想要彻底搞懂并不是那么容易.本文主要分三个部分来讲解卷积和反卷积,分别包括概念.工作过程.代码示例,其中代码实践部分主结合TensorFlow框架来进行实践.给 ...

  9. 转置卷积和膨胀卷积详细讲解

    目录 转置卷积(Transposed Convolution) 作用 转置卷积的输出 转置卷积过程 转置卷积运算过程 pytorch中转置卷积对应参数 膨胀卷积(空洞卷积,Atrous convolu ...

最新文章

  1. Zotero科研文献管理 - 将PDF文件同步到Google Driver中,不同电脑无缝使用
  2. javascript 编码规范 用更合理的方式写 javascript
  3. cb-A10系统优化之(一):去除自启动软件
  4. 怪不得超市不让带宠物...
  5. 支付价格计算中精度问题之double,float
  6. 浅谈事理图谱认知:系统体系+领域收敛+人机协同+辅助范式
  7. StringUtils 的使用
  8. oracle存储sql片段引入_强大的跨数据库访问组件 UniDAC使用教程:注释和SQL函数...
  9. Java基础——Oracle(二)
  10. Linux 查看分区大小
  11. opengl 光线追踪_Vulkan的视频编解码支持将于2020年上半年加入,光线追踪也在路上...
  12. 如何注册、发布 CSDN博客
  13. Ubuntu常用命令及git常用命令
  14. 小白零基础搞unity手机跑酷游戏-01-GettingStarted
  15. 如何在Fedora 上dnf安装Node.js
  16. 三本 计算机专业,四川哪些三本大学的计算机专业最好?
  17. Qt编写安防视频监控系统13-视频存储
  18. .a文件和.lib文件的区别
  19. 进击的 Vulkan 移动开发(一)之今生前世
  20. 为什么程序员话少钱多死得早?-一位人生悲惨的程序员与你讲述其中原因

热门文章

  1. python 人像素描_谁说程序员不懂浪漫的,直接用 Python 给女朋友画张素描
  2. 洛谷 P2708 硬币翻转
  3. ajaxSubmit来上传文件
  4. 打开Flutter动画的另一种姿势——Flare
  5. 使用pydot 画CNN网络结构图
  6. MATLAB线形规划函数linprog、intlinprog与二次规划函数quadprog
  7. 算法导论------递归算法的时间复杂度求解
  8. PCL函数库摘要——3D点云特征描述与提取
  9. D2大会资源分享(解决了GitHub下载限速)
  10. go(gin框架)session底层使用redis实现(gorilla/sessions和gin-contrib/sessions)