美文网首页
转置卷积

转置卷积

作者: 简Lynn | 来源:发表于2019-12-21 23:01 被阅读0次

    转置卷积


    Transposed Convolution、Fractional Strided Convolution、Deconvolution

    上采样


    1. 转置卷积与反卷积的区别

    那什么是反卷积?从字面上理解就是卷积的逆过程。值得注意的反卷积虽然存在,但是在深度学习中并不常用。而转置卷积虽然又名反卷积,却不是真正意义上的反卷积。因为根据反卷积的数学含义,通过反卷积可以将通过卷积的输出信号,完全还原输入信号。而事实是,转置卷积只能还原shape大小,而不能还原value。你可以理解成,至少在数值方面上,转置卷积不能实现卷积操作的逆过程。所以说转置卷积与真正的反卷积有点相似,因为两者产生了相同的空间分辨率。但是又名反卷积(deconvolutions)的这种叫法是不合适的,因为它不符合反卷积的概念。

    https://www.cnblogs.com/marsggbo/p/9737991.html

    2. Transposed convolution animations

    https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md#transposed-convolution-animations

    No padding, no strides, transposed Arbitrary padding, no strides, transposed Half padding, no strides, transposed Full padding, no strides, transposed No padding, strides, transposed Padding, strides, transposed Padding, strides, transposed (odd)

    3. 计算说明



    转置卷积计算示意图

    4. API

    • tf.keras.layers.Conv2DTranspose

    • torch.nn.ConvTranspose2d

    5. 转置卷积原理

    卷积计算 第1步 卷积计算 第2步 ( stride=1 )

    channel为3时:input:5x5x3    kernel:3x3x3

    每个channel分别计算,然后求和:

    kernel_channel1与input_channel1计算+ kernel_channel2与input_channel2计算+ kernel_channel3与input_channel3计算+bias

    kernel_channel = input_channel

    # bias = # kernel = output_channel 

    input:4x4 kernel:2x2 卷积计算4步

    i = 4, k = 3, s = 1, p = 0

    o = 2

    卷积操作转化为矩阵操作-》权重矩阵C

    卷积操作可以转化为矩阵操作

    此处为权重矩阵C

    转置卷积-》矩阵操作

    1.首先将图像拉成1列: M:4x4    -》    16x1

    2.卷积操作转化为矩阵操作:C * M = O    4x16 * 16x1 -》 4x1

    3.转置卷积转化为矩阵操作:C' * C * M = C' * O = X    16x4 * 4x1 -》16x1

    4.将输出结果X resize成原本的图像大小:16x1    -》    4x4

    6. Caffe中卷积计算

    在caffe中使用了im2col的这样的操作来加速卷积计算

    channel = 1时

    im2col:将每次计算的输入按照列重新排列

    channel为1时,每次参与计算的input按照列重新进行排列

    channel = 3时

    im2col:将每次计算的输入按照列重新排列

    channel为3时,每个channel按照行进行排列

    kernel 重排

    im2col:kernel拉成一行

    channel为3时,每个channel按照列排列


    C * M = O output_channel = 1

    inputimage M:4x4x3-》27x4

    kernel C:3x3x3-》1x27 

    output channel=1    =     #kernel=1

    C * M = O

    1x27  *  27x4 = 1x4

    output image O:1x4 resize 2x2x1

    C * M = O output_channel = 3

    inputimage M:4x4x3-》27x4

    kernel C:3x3x3-》1x27    -》    3x27    ( output channel=3    =    #kernel=3 )

    C * M = O

    3x27  *  27x4 = 3x4

    output image O:3x4 resize 2x2x3

    7. 转置卷积的参数

    卷积核:大小Size,步长Stride,padding

    step1:得到新的特征图x':大小 H' = H + (Stride -1)*(H -1) W' = W + (Stride -1)*(W -1)。实质上是在原特征图中插0,在原先H方向上每两个相邻的特征值中间插上 (Stride -1)个0,因为有(H-1)个空档,所以在原先的特征图上加上(Stride -1)*(H -1)个0。W方向同理。padding’变为Size-padding -1。

    step2:新的卷积核:新的卷积核的stride'变为1,大小size'不变还是Size

    step3:用新的卷积核在新的特征图上做常规的卷积:

    转置卷积与转置矩阵操作等效

    通过与权重矩阵的转置C'的第一列进行操作,input中的x1对应到output中的红色方框

    x1与第一列相乘的结果均匀分布到红框中的每个位置

    红框与蓝框重叠的部分,相加即可

    因此,左侧的转置矩阵操作 与 右侧的转置卷积操作等效

    转置卷积操作

    input image中的粉色位置x1,与kernel中的权重分别相乘后,均匀分布到output image的红框中

    input image中的蓝色位置x2,与kernel中的权重分别相乘后,均匀分布到output image的蓝框中

    重叠部分相加即可

    output image的红框中对应x1*w的数值分别为:

    x1*w1    x1*w2    x1*w3

    x1*w4    x1*w5    x1*w6

    x1*w7    x1*w8    x1*w9

    output image的蓝框中对应x2*w的数值分别为:

    x2*w1    x2*w2    x2*w3

    x2*w4    x2*w5    x2*w6

    x2*w7    x2*w8    x2*w9 

    output image的红框与蓝框重叠部分相加,最后数值分别为:

    x1*w1    x1*w2    x1*w3+ x2*w1    x2*w2    x2*w3

    x1*w4    x1*w5    x1*w6 x2*w4    x2*w5    x2*w6

    x1*w7    x1*w8    x1*w9 x2*w7    x2*w8    x2*w9

    转置卷积与转置矩阵操作等效

    可以看到通过内积操作,x1会作用到对应的9个点上,x2一样。

    转置卷积 padding

    转置卷积中padding的理解:

    No padding   ==     k-1(正常卷积No padding,转置卷积的input的padding = k-1 ,即 full padding)

    padding 1     ==     k-1-1 padding(正常卷积 padding=1,转置卷积的padding = k-1-1 padding,k=3时,即half padding,same padding)

    从原图的有效区域去理解:

    转置卷积的参数padding指的是正常卷积的padding,与转置卷积input image的padding'正好相反   

    因此:padding' = k-1-padding


    stride = 2

    转置卷积stride的理解:

    正常卷积 stride=2,转置卷积通过在input image中插0,使得对应原图的真实步长变为1/2,达到/stride的效果

    torch.nn.ConvTranspose2d(in_channels,

    out_channels, kernel_size,

    stride=1, padding=0, output_padding=0,

    groups=1, bias=True, dilation=1,

    padding_mode='zeros')

    8. 转置卷积output size计算

    正常卷积 转置卷积

    正常卷积:o = ( i + 2p - k  )/ s + 1

    转置卷积:i' = o    o' = i    因此:o' = ( i' - 1) * s - 2p + k

    相关文章

      网友评论

          本文标题:转置卷积

          本文链接:https://www.haomeiwen.com/subject/wsvgnctx.html