详解卷积反卷积操作

详解卷积反卷积操作TransposedConvolution,FractionallyStridedConvolutionorDeconvolution Postedon 2016-10-29反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutionalnetworks中,但是并没有指定反卷积这个名字

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

Transposed Convolution, Fractionally Strided Convolution or Deconvolution




详解卷积反卷积操作





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

这篇文章的目的主要有两方面:

1. 解释卷积层和反卷积层之间的关系;

2. 弄清楚反卷积层输入特征大小和输出特征大小之间的关系。

## 卷积层

卷积层大家应该都很熟悉了,为了方便说明,定义如下:

– 二维的离散卷积(
N=2 N=2

– 方形的特征输入(
i1=i2=i i1=i2=i

– 方形的卷积核尺寸(
k1=k2=k k1=k2=k

– 每个维度相同的步长(
s1=s2=s s1=s2=s

– 每个维度相同的padding (
p1=p2=p p1=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⌋ 表示对 
x x 向下取整。

反卷积层

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

卷积和矩阵相乘

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




详解卷积反卷积操作


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

w0,0000w0,1w0,000w0,2w0,1000w0,200w1,00w0,00w1,1w1,0w0,1w0,0w1,2w1,1w0,2w0,10w1,20w0,2w2,00w1,00w2,1w2,0w1,1w1,0w2,2w2,1w1,2w1,10w2,20w1,200w2,0000w2,1w2,000w2,2w2,1000w2,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]的矩阵  X X,那么  Y=CX Y=CX 则是一个[4,1]的输出特征矩阵,把它重新排列2×2的输出特征就得到最终的结果,从上述分析可以看出卷积层的计算其实是可以转化成矩阵相乘的。值得注意的是,在一些深度学习网络的开源框架中并不是通过这种这个转换方法来计算卷积的,因为这个转换会存在很多无用的0乘操作,Caffe中具体实现卷积计算的方法可参考Implementing convolution as a matrix multiplication

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

【深入理解反卷积的来历

作者:张骞晖

链接:https://www.zhihu.com/question/43609045/answer/130868981

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

卷积(convolution):

卷积核为 3×3;no padding , strides=1

<img src="https://pic2.zhimg.com/50/v2-7f36c655f202202843095377471387b9_hd.png" data-rawwidth="220" data-rawheight="197" class="content_image" width="220">"反卷积"(the transpose of conv) 可以理解为upsample conv.
详解卷积反卷积操作“反卷积”(the transpose of conv) 可以理解为upsample conv.

卷积核为:3×3; no padding , strides=1

<img src="https://pic3.zhimg.com/50/v2-cfa18dbc6e6dc30b246738e819468ae6_hd.png" data-rawwidth="230" data-rawheight="268" class="content_image" width="230">
详解卷积反卷积操作

那看下strides=2的时候。

卷积:

<img src="https://pic3.zhimg.com/50/v2-5dd3a09e8368884b629e9cb7279f311e_hd.png" data-rawwidth="237" data-rawheight="228" class="content_image" width="237">
详解卷积反卷积操作

反卷积:

<img src="https://pic1.zhimg.com/50/v2-bf9fdb42390762b2f7c49d0024dcbc90_hd.png" data-rawwidth="253" data-rawheight="267" class="content_image" width="253">
详解卷积反卷积操作

在实际计算过程中,我们要转化为矩阵的乘积的形式,一个转化为

Toeplitz matrix一个reshape为列矩阵。

举个简单的例子

比如 input= [3,3],Reshape之后,为A=[1,9]

B(可以理解为滤波器)=[9,4](Toeplitz matrix)

那么

A*B=C=[1,4]。Reshape C=[2,2]

所以,通过B
卷积,我们从shape=[3,3]变成了shape=[2,2]

反过来。

输入A=[2,2],reshape之后为[1,4]

B的转置为,[4,9]

那么

A*B=C=[1,9],reshape为[3,3]

所以,通过B的转置 – “反卷积”,我们从shape=[2,2]得到了shape=[3,3]

也就是

输入feature map A=[3,3]经过了卷积滤波B=[2,2] 输出为 [2,2] ,所以padding=0,stride=1

反卷积则是

输入feature map A=[2,2],经过了反卷积滤波B=[2,2].输出为[3,3].padding=0,stride=1

那么[2,2]的卷积核(滤波器)是怎么转化为[4,9]或者[9,4]的呢

通过

Toeplitz matrix

不懂的,自己查吧。

所以所谓的卷积其实是转置卷积。

那为什么不能叫反卷积?

反卷积的数学含义,通过反卷积可以将通过卷积的输出信号,完全还原输入信号。

而事实是,转置卷积只能还原shape大小,不能还原value.

你可以自己通过代码验证下。

反卷积和卷积的关系

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

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

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

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

下图表示的是参数为(  i=2,k=3,s=1,p=2 i′=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=2 p′=2。通过对比我们可以发现卷积层中左上角的输入只对左上角的输出有贡献,所以反卷积层会出现  p=kp1=2 p′=k−p−1=2。通过示意图,我们可以发现,反卷积层的输入输出在  s=s=1 s=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>1 s>1的卷积,我们可能会想到其对应的反卷积步长  s<1 s′<1。 如下图所示为一个参数为  i=5,k=3,s=2,p=1 i=5,k=3,s=2,p=1的卷积操作(就是第一张图所演示的)所对应的反卷积操作。对于反卷积操作的小数步长我们可以理解为:在其输入特征单元之间插入  s1 s−1 个0,插入0后把其看出是新的特征输入,然后此时步长  s s′ 不再是小数而是为1。因此,结合上面所得到的结论,我们可以得出Fractionally Strided Convolution的输入输出关系为:

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




详解卷积反卷积操作


参考

conv_arithmetic

Is the deconvolution layer the same as a convolutional layer?

其他参考:

https://github.com/vdumoulin/conv_arithmetic

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145168.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 室内定位指纹算法_指纹识别算法

    室内定位指纹算法_指纹识别算法一、概述最近在做一个基于蓝牙的室内定位的项目,做了一个三角定位算法,由于室内的环境比较复杂,信号反射折射比较多,很多时候信号的大小(RSSI)跟距离并不是完全一一对应的,可能远的地方信号反而更强,三角质心定位算法就有点不合适了,因此想试用指纹定位算法,看一下指纹定位算法的效果。在此总结一下指纹定位算法。 二、指纹定位算法介绍指纹定位算法是基于室内环境复杂,信号反射折射所形成的在不同

    2022年10月21日
  • vc 获取月份的天数_根据距离1900年1月1日的天数(0起始),计算这一天的日期(年,月,日)…

    vc 获取月份的天数_根据距离1900年1月1日的天数(0起始),计算这一天的日期(年,月,日)…我的代码,算法不优美,但结果正确^_^#include#include#includevoidfoo(int&year,int&month,int&day){year=1900;month=1;day+=0;for(intn;n=(((year%4==0&&year%100!=0)||(year%400==0))…

  • oracle11g创建数据库实例_oracle手工建库

    oracle11g创建数据库实例_oracle手工建库在经过前面八篇文章(abp(netcore)+easyui+efcore实现仓储管理系统——入库管理之一(三十七)至abp(netcore)+easyui+efcore实现仓储管理系统——入库管理之八(四十四))的学习之后,我们知道了已经基本完成了入库管理功能。在这篇文章中我们来增加更新与删除功能的脚本。十三、修改更新与删除脚本1.在VisualStudio2017的“解决方案资源管理器”中,找到领域层“ABP.TPLMS.Web.Mvc”项目中的wwwroot目录下的vi…

  • linux系统休眠唤醒_centos休眠后怎么唤醒

    linux系统休眠唤醒_centos休眠后怎么唤醒背景介绍:睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以是嵌入式设备尽可能的进入休眠状态,来延长电池的续航时间(这在移动终端消费类电子设备中是非常重要和有意义的!!)。但标准的Linux睡眠唤醒机制有其自身的一些缺陷(所有模块必须同时睡下或者唤醒),在某些情况下,这会导致能耗的白白浪费。因此Android在标准Linux睡眠唤醒的机制上作了新的改动(wake_lock唤…

  • plc梯形图编程入门基础知识_plc简单循环程序梯形图

    plc梯形图编程入门基础知识_plc简单循环程序梯形图OFweek工控网讯:初学PLC梯形图编程,应要遵循一定的规则,并养成良好的习惯。下面以三菱FX系列PLC为例,简单介绍一下PLC梯形图编程时需要遵循的规则,希望对大家有所帮助。有一点需要说明的是,本文虽以三菱PLC为例,但这些规则在其它PLC编程时也可同样遵守。  一,梯形阶梯都是始于左母线,终于右母线(通常可以省掉不画,仅画左母线)。每行的左边是接点组合,表示驱动逻辑线圈的条件,而表示结果

  • stata 导出 相关系数表_STATA数据处理技巧与计量分析二|基本语句介绍

    stata 导出 相关系数表_STATA数据处理技巧与计量分析二|基本语句介绍更多精彩内容请关注211统计课堂上期小统和大家一起了解了STATA数据处理技巧与计量分析的背景介绍,这期小统和大家一起学习一下基本语句介绍。Stata操作界面核心功能(dofile)Stata中的命令集合文件,在编程语言中成为脚本(scripts),是指为达到某一分析目的进行的数据读取、数据处理、分析等的命令集合。Stata的基础语法基本语法结构:funNamevariable/(v…

发表回复

您的电子邮箱地址不会被公开。

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