详解卷积反卷积操作
来源:互联网 发布:java 模拟get请求 编辑:程序博客网 时间:2024/05/29 18:01
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. 弄清楚反卷积层输入特征大小和输出特征大小之间的关系。
## 卷积层
卷积层大家应该都很熟悉了,为了方便说明,定义如下:
- 二维的离散卷积(
- 方形的特征输入(
- 方形的卷积核尺寸(
- 每个维度相同的步长(
- 每个维度相同的padding (
下图表示参数为
下图表示参数为
从上述两个例子我们可以总结出卷积层输入特征与输出特征尺寸和卷积核参数的关系为:
其中
反卷积层
在介绍反卷积之前,我们先来看看卷积运算和矩阵运算之间的关系。
卷积和矩阵相乘
考虑如下一个简单的卷积层运算,其参数为
对于上述卷积运算,我们把上图所示的3×3卷积核展成一个如下所示的[4,16]的稀疏矩阵
我们再把4×4的输入特征展成[16,1]的矩阵
通过上述的分析,我们已经知道卷积层的前向操作可以表示为和矩阵
【深入理解反卷积的来历
链接:https://www.zhihu.com/question/43609045/answer/130868981
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
卷积核为 3x3;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.
卷积核为:3x3; 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,我们可以看出其实卷积层的前向传播过程就是反卷积层的反向传播过程,卷积层的反向传播过程就是反卷积层的前向传播过程。因为卷积层的前向反向计算分别为乘
下图表示一个和上图卷积计算对应的反卷积操作,其中他们的输入输出关系正好相反。如果不考虑通道以卷积运算的反向运算来计算反卷积运算的话,我们还可以通过离散卷积的方法来求反卷积(这里只是为了说明,实际工作中不会这么做)。
同样为了说明,定义反卷积操作参数如下:
- 二维的离散卷积(
N=2 ) - 方形的特征输入(
i′1=i′2=i′ ) - 方形的卷积核尺寸(
k′1=k′2=k′ ) - 每个维度相同的步长(
s′1=s′2=s′ ) - 每个维度相同的padding (
p′1=p′2=p′ )
下图表示的是参数为(
Fractionally Strided Convolution
上面也提到过反卷积有时候也被叫做Fractionally Strided Convolution,翻译过来大概意思就是小数步长的卷积。对于步长
参考
conv_arithmetic
Is the deconvolution layer the same as a convolutional layer?
其他参考:
https://github.com/vdumoulin/conv_arithmetic
- 详解卷积反卷积操作
- CNN-卷积反卷积
- CNN-卷积反卷积
- 卷积与反卷积
- 卷积与反卷积
- 卷积与反卷积
- 卷积与反卷积
- 反卷积
- 反卷积
- 反卷积,转置卷积
- 卷积、反卷积、转置卷积和微步幅卷积
- 卷积详解
- 反卷积程序
- 反卷积算法
- 反卷积效果1
- 反卷积效果2
- 反卷积概念
- 剑桥反卷积项目
- opencv中BackgroundSubtractorMOG2源码分析与原理讲解
- Jquery prop()与change()冲突解决办法
- Android 计步功能-简单实现
- 数据结构 数组排序
- maven构建CDH开发环境
- 详解卷积反卷积操作
- layui 三级联动下拉框更新时回显问题
- 使用addHeaderView给PullToRefreshListView添加Banner
- python下安装eemd
- angular 学习资源
- Git常用命令总结
- wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)
- C语言-模拟实现strcat
- 集群和负载均衡