精华内容
下载资源
问答
  • 反卷积原理

    千次阅读 2018-05-13 15:17:20
    一 介绍反卷积,可以理解为卷积操作的逆运算。这里千万不要当成反卷积操作可以复原卷积操作的输入值,反卷积并没有那个功能,它仅仅是将卷积变换过程中的步骤反向变换一次而已,通过将卷积核转置,与卷积后的结果再...
    一 介绍
    反卷积,可以理解为卷积操作的逆运算。这里千万不要当成反卷积操作可以复原卷积操作的输入值,反卷积并没有那个功能,它仅仅是将卷积变换过程中的步骤反向变换一次而已,通过将卷积核转置,与卷积后的结果再做一遍卷积,所以它还有个名字叫转置卷积。
    虽然它不能还原出原来卷积的样子,但是在作用上具有类似的效果,可以将带有小部分缺失的信息最大化恢复,也可以用来恢复被卷积生成后的原始输入。
    反卷积具体步骤如下:
    1 首先是将卷积核反转(并不是转置,而是上下左右方向进行递序操作)。
    2 再将卷积结果作为输入,做补0扩充操作,即往每一个元素后面补0.这一步是根据步长来的,对于每个元素沿着步长方向补(步长-1)个0。例如,步长为1就不用补0了。
    3 在扩充后的输入基础上再对整体补0。以原始输入的shape作为输出,按照前面介绍的卷积padding规则,计算pading的补0的位置及个数,得到补0的位置及个数,得到补0的位置要上下和左右各自颠倒一下。
    4 将补0后的卷积结果作为真正的输入,反转后的卷积核为filter,进行步长为1的卷积操作。
    注意:计算padding按规则补0时,统一按照padding='SAME'、步长为1*1的方式来计算。
    二 举例
    上图上面部分展示:以一个[1,4,4,1]的矩阵为例,进行filter为2*2,步长为2*2的卷积操作。
    其反卷积操作步骤如上图下半部分。
    在反卷积过程中,首先将2*2矩阵通过步长补0的方式变成4*4,再通过padding反方向补0,然后与反转后的filter使用步长为1*1的卷积操作,最终得出结果。但是这个结果已经与原来的全1矩阵不等了,说明转置卷积只能恢复部分特征,无法百分百的恢复原始数据。
    展开全文
  • 反卷积原理和实际代码详细讲解!

    千次阅读 2019-04-26 22:57:59
    文章目录反卷积原理首先来看卷积操作然后来看反卷积操作代码中的实现首先来看卷积的代码然后再来看反卷积结合代码看反卷积过程 反卷积原理 转载自该博文 反卷积(转置卷积、空洞卷积(微步卷积))近几年用得较多,...

    做的项目里涉及到了反卷积,上网查了很多资料发现有的只讲了原理,没有直观的代码实践,有些讲了代码却又完全忽视原理,所以想要以这篇博文做一个小小的整合,方便以后查阅。

    反卷积原理

    转载自该博文
    反卷积(转置卷积、空洞卷积(微步卷积))近几年用得较多,本篇博客主要是介绍一下反卷积,尤其是怎么计算反卷积(选择反卷积的相关参数)
    图1 空洞卷积(微步卷积)的例子,其中下面的图是输入,上面的图是输出,显然这是一个upsampling的过程,我们也称为反卷积。
    图1 空洞卷积(微步卷积)的例子,其中下面的图是输入,上面的图是输出,显然这是一个upsampling的过程,我们也称为反卷积。

    首先,既然本文题名为反卷积(Deconvolution),当然就是要介绍各种反卷积,不得不说的是随着近几年人工智能如火如荼,大牛纷纷在各个角度开始深入研究这个深度学习,这当然就是更广了同时也更深了,但是只要抓住深度学习的命门,其实很多工作都是顺理成章的,没有想象中的那么复杂,也许这也是我对深度学习的一点小小的感悟。反卷积,它有这几个比较熟悉的名字,例如转置卷积、上采样、空洞卷积、微步卷积,但我们认为,最直接的就是反卷积=上采样=(转置卷积+微步卷积)⊆ 空洞卷积=一般意义上的广义卷积(包含上采样和下采样)。

    另外,在概念上,我们只是将其称为反卷积,这不是通过数学意义上的严格证明,其实只是说恢复了特征图的尺寸大小,数值上存在差异。

    首先来看卷积操作

    为了方便说明,对二维的离散卷积,定义如下:
    方形的特征输入(i1=i2=i)
    方形的卷积核尺寸(k1=k2=k)
    每个维度相同的步长(s1=s2=s)
    每个维度相同的padding (p1=p2=p)
    下图表示参数为 (i=5,k=3,s=2,p=1) 的卷积计算过程,从计算结果可以看出输出特征的尺寸为 (o1=o2=o=3)。

    图2  卷积图示例1
    图2 卷积图示例1
    下图表示参数为 (i=6,k=3,s=2,p=1)的卷积计算过程,从计算结果可以看出输出特征的尺寸为 (o1=o2=o=3)。

    图3  卷积图示例2
    图3 卷积图示例2
    从上述两个例子我们可以总结出卷积层输入特征与输出特征尺寸和卷积核相关参数的关系为:

    然后来看反卷积操作

    同理,定义反卷积的参数为上述卷积参数后加 ′ 表示。

    图4 转置卷积

    图5 微步卷积

    可推得计算公式为:o′=s(i−1)+k−2p。比如10×1010\times 10变成19×1919\times19,可知k=3,p=1,s=2。

    另外,微步卷积新的卷积核K=dilation*(k-1)+1,显然dilation=1就相当于一般意义上的卷积,所以说空洞卷积更具一般性,事实也证明如此,Caffe中就是实现了空洞卷积和转置卷积。

    进一步阅读请参考:

    1. 如何理解空洞卷积

    2.如何理解反卷积

    3.反卷积
    (文章3中后面部分有更直观一点的数学证明)

    代码中的实现

    首先来看卷积的代码

    转载自该博文
    在用tensorflow写CNN的时候,调用卷积核api的时候,会有填padding方式的参数,找到源码中的函数定义如下(max pooling也是一样):

    def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,
               data_format=None, name=None)
    

    源码中对于padding参数的说明如下:

    padding: A `string` from: `"SAME", "VALID"`.
          The type of padding algorithm to use.
    

    源码中说明padding可以用SAME和VALID两种方式,但是对于这两种方式具体是什么并没有多加说明。
    这里用Stack Overflow中的一份代码来简单说明一下,代码如下:

    import tensorflow as tf
    
    x = tf.constant([[1., 2., 3.],
                     [4., 5., 6.]])
    x = tf.reshape(x, [1, 2, 3, 1])  # give a shape accepted by tf.nn.max_pool
    
    valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
    same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
    
    print(valid_pad.get_shape())
    print(same_pad.get_shape())
    

    最后输出的结果为:

    (1, 1, 1, 1)
    (1, 1, 2, 1)
    

    可以看出SAME的填充方式是比VALID的填充方式多了一列。
    让我们来看看变量xx是一个2×32×3的矩阵,max pooling窗口为2×22×2,两个维度的步长strides=2strides=2
    第一次由于窗口可以覆盖,橙色区域做max pooling,没什么问题,如下:

    接下来就是SAMEVALID的区别所在:由于步长为2,当向右滑动两步之后,VALID方式发现余下的窗口不到2×22×2所以直接将第三列舍弃,而SAME方式并不会把多出的一列丢弃,但是只有一列了不够2×22×2怎么办?填充!

    如上图所示,SAME会增加第四列以保证可以达到2×22×2,但为了不影响原始信息,一般以0来填充。这就不难理解不同的padding方式输出的形状会有所不同了。

    当CNN用于文本中时,一般卷积层设置卷积核的大小为n×k,其中k为输入向量的维度(即[n,k,input_channel_num,output_channel_num]),这时候我们就需要选择“VALID”填充方式,这时候窗口仅仅是沿着一个维度扫描而不是两个维度。可以理解为统计语言模型当中的N-gram。
    我们设计网络结构时需要设置输入输出的shape,源码nn_ops.py中的convolution函数和pool函数给出的计算公式如下:

    If padding == "SAME":
          output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])
    
        If padding == "VALID":
          output_spatial_shape[i] =
            ceil((input_spatial_shape[i] -
                  (spatial_filter_shape[i]-1) * dilation_rate[i])
                  / strides[i]).
    

    dilation_ratedilation\_rate为一个可选的参数,默认为1,这里我们先不管。
    整理一下,对于VALID,输出的形状计算如下:
    new_height=new_width=(WF+1)Snew\_height = new\_width =\lceil \frac{ (W – F + 1)} { S} \rceil

    对于SAME,输出的形状计算如下:
    new_height=new_width=⌈WS⌉
    new_height=new_width=WSnew\_height = new\_width =\lceil \frac{ W } { S}\rceil

    其中,WW为输入的size,FF为filter的size,SS为步长,\lceil \rceil为向上取整符号。

    然后再来看反卷积

    可把卷积操作conv2d视为一个正操作和conv2d_transpose视为一个反操作。求conv2d_transpose操作得到的特征图维度,我们可以通过卷积正操作来反推。
    若卷积和反卷积的参数相同(主要是kernel_size,strides,padding),反卷积得到的输出维度等于正卷积的输入维度。
    这是我搭建的一个反卷积的网络(在生成器中),每一步输入的shape变化我都有写明,输入为随机噪音x(batch_size,100),输出为MNIST图像(batch_size,28,28,1)

    def generator(x,isTrain=True, reuse=False):
        with tf.variable_scope('Generator', reuse=reuse):
            #input:x=(batch,100)
            x = tf.layers.dense(x, units=2 * 2 * 1024)
            # New shape(batch,4096)
            x = tf.nn.tanh(x)
            
            x = tf.reshape(x, shape=[-1, 2, 2, 1024])
            # Reshape to a 4-D array of images: (batch, height, width, channels)
            # New shape: (batch, 2, 2,1024)
            
            conv1 = tf.layers.conv2d_transpose(x, 256, 4, strides=2, padding='same')
            # Deconvolution, image shape: (batch, 4, 4, 256)
            #在‘same’的时候,4\2=2,所以4*4的图像在步长为2的情况下做卷积后是2*2,反之亦然
            relu1=tf.nn.relu(tf.layers.batch_normalization(conv1, training=isTrain))
    
            conv2 = tf.layers.conv2d_transpose(relu1, 128, 4, strides=1, padding='valid')
            # Deconvolution, image shape: (batch, 7, 7, 128)
            #在‘valid’的时候,(7-4+1)\1=4\1=4,所以7*7的图像在步长为2的情况下做卷积后是4*4,反之亦然;这里若是用`same`,kernel=4,stride=2,虽然7/2向上取整为4,但是由于8/2也等于4,所以反卷积过来会为8*8,暂时还不知道在`same`情况下怎么解决这个问题,有大神知道请留言告知,非常感谢!
            relu2 = tf.nn.relu(tf.layers.batch_normalization(conv2, training=isTrain))
    
            conv3 = tf.layers.conv2d_transpose(relu2, 64, 4, strides=2, padding='same')
            # Deconvolution, image shape: (batch, 14, 14, 64)
            #在‘same’的时候,14\2=7,所以14*14的图像在步长为2的情况下做卷积后是7*7,反之亦然
            relu3 = tf.nn.relu(tf.layers.batch_normalization(conv3, training=isTrain))
    
            conv4 = tf.layers.conv2d_transpose(relu3, 1, 3, strides=2, padding='same')
            # Deconvolution, image shape: (batch, 28, 28, 1)
            o = tf.nn.tanh(conv4)
            return o
    

    通过倒推的方式构建反卷积还是容易很多的

    结合代码看反卷积过程

    转自https://blog.csdn.net/Murdock_C/article/details/87943386
    首先上一篇博文,里面的图写的非常清楚,当然精华的那幅图已经附在下面了:

    上图中same的模式给四周都加上了一圈0,valid模式还有待研究完善(网太卡了…)
    (padding:valid 或者 same(不区分大小写)。valid 表示不够卷积核大小的块就丢弃,same表示不够卷积核大小的块就补0。)

    tensorflow的反卷积也被成为转置卷积, 在执行反卷积的时候, tensorflow通常会做以下几个操作:

    1. 根据设置的stride对featuremap填充0, 具体来说, 就是将featuremap填充至(hstride+1,wstride+1)(h*stride+1, w*stride+1)大小. 填充方式为在原来的featuremap元素之间填充stride1stride-1个零,然后四周再补一圈0.
    2. 然后再根据填充0之后的featuremap进行普通的卷积,此时的stride变成1, padding方式为传入反卷积的padding方式
    3. 最后再对卷积的结果进行crop,裁去右边最后一列和下边最后一行

    一般在神经网络中,反卷积的作用都是用作上采样来的,所以反卷积的结果一般都是原来的featuremap size两倍大小. 更普通的反卷积(指定输出大小但不是原图的2倍)没有尝试过.

    大概就是这些,有需要再补充~

    展开全文
  • CNN 反卷积原理解析

    2018-11-27 12:15:02
    反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks ...


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

    这篇文章的目的主要有两方面:
    1. 解释卷积层和反卷积层之间的关系;
    2. 弄清楚反卷积层输入特征大小和输出特征大小之间的关系。

    ## 卷积层

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






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

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

    反卷积和卷积的关系


     
    Fractionally Strided Convolution



    参考

    conv_arithmetic

    Is the deconvolution layer the same as a convolutional layer?

    转载过程中有些元素可能有缺失
    展开全文
  • 反卷积原理不可多得的好文

    万次阅读 2018-05-16 14:45:19
    反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks ...


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

    这篇文章的目的主要有两方面:
    1. 解释卷积层和反卷积层之间的关系;
    2. 弄清楚反卷积层输入特征大小和输出特征大小之间的关系。

    ## 卷积层

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






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

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

    反卷积和卷积的关系


     
    Fractionally Strided Convolution



    参考

    conv_arithmetic

    Is the deconvolution layer the same as a convolutional layer?

    转载过程中有些元素可能有缺失
    展开全文
  • 在深度学习的过程中,很多神经网络都会用到各种卷积核来进行操作,那么我们就简单讲一下卷积原理和实现过程。 那么卷积在神经网络中的作用是什么呢?一开始的传统神经网络是没有卷积层的,都是隐藏层加生全连接层...
  • 反卷积原理与参数设置 ConvTranspose2d

    千次阅读 2019-11-19 09:14:35
    反卷积的具体过程和原理在引文《》中说的很清楚了。 这里着重说一下反卷积参数output_padding:输出边补充0的个数,高宽都增加output_padding。 即如果没有使用output_padding,则输出特征图的边长为: (He...
  • 反卷积原理 + pytorch反卷积层参数output_padding

    万次阅读 多人点赞 2019-01-24 14:35:22
    一般我们会认为2维卷积的计算分为了以下3类: 1.full 2.same 3. valid 参考:https://cn.mathworks.com/help/matlab/ref/conv2.html? same和valid相信各位同学都不陌生。Valid指不进行padding操作,而same则是...
  •  在深度学习的过程中,很多神经网络都会用到各种卷积核来进行操作,那么我们就简单讲一下卷积原理和实现过程。 那么卷积在神经网络中的作用是什么呢?一开始的传统神经网络是没有卷积层的,都是隐藏层加生全连接...
  • 上一篇文章已经介绍过卷积的实现,这篇文章我们学习反卷积原理,同样,在了解反卷积原理后,在后面手写python代码实现反卷积。 1 反卷积原理 反卷积原理不太好用文字描述,这里直接以一个简单例子描述反卷积过程...
  • 1 反卷积原理 反卷积原理不太好用文字描述,这里直接以一个简单例子描述反卷积过程。 假设输入如下: [[1,0,1], [0,2,1], [1,1,0]] 反卷积卷积核如下: [[ 1, 0, 1], [-1, 1, 0], [ 0,-1, 0]] 现在通过stride...
  • 1、反卷积原理 反卷积原理不太好用文字描述,这里直接以一个简单例子描述反卷积。 假设输入如下: [[1,0,1], [0,2,1], [1,1,0]]  反卷积卷积核如下: [[ 1, 0, 1], [-1, 1, 0], [ 0,-1, 0]]  现在通过...
  • Tensorflow反卷积(DeConv)实现原理+手写python代码实现反卷积(DeConv) 理解:https://www.zhihu.com/question/43609045/answer/130868981 上...同样,在了解反卷积原理后,在后面手写python代码...
  • 1 反卷积原理 反卷积原理不太好用文字描述,这里直接以一个简单例子描述反卷积过程。 假设输入如下: [[1,0,1], [0,2,1], [1,1,0]] 反卷积卷积核如下: [[ 1, 0, 1], [-1, 1, 0], [ 0,-1, 0]] 现在...
  • 转载自: &...0、标准卷积 ...那么一般的操作就是用32个3×3的卷积核来分别同输入数据卷积,这样每个卷积核需要3×3×16个参数,得到的输出是只有一个通道的数据。之所以会得...
  • 反卷积结构及原理

    万次阅读 2017-08-16 10:47:05
    反卷积(Deconvolution)的概念第一次出现是Zeiler在2010年发表的论文Deconvolutional networks中,但是并没有指定反卷积这个名字,反卷积这个术语正式的使用是在其之后的工作中(Adaptive deconvolutional networks ...
  • 0、标准卷积 默认你已经对卷积有一定的了解,此处不对标准卷积细讲。 举个例子,假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32。 那么一般的操作就是用32个3×3的卷积核来分别同输入数据卷积,这样每...
  • 转置卷积(Transposed Convolution)常常在一些文献中也称之为反卷积(Deconvolution)和部分跨越卷积(Fractionally-strided Convolution),因为称之为反卷积容易让人以为和数字信号处理中反卷积混起来,造成不必要的...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 204
精华内容 81
关键字:

反卷积原理