转置卷积
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







3. 计算说明
4. API
• tf.keras.layers.Conv2DTranspose
• torch.nn.ConvTranspose2d
5. 转置卷积原理


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

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

卷积操作可以转化为矩阵操作
此处为权重矩阵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的这样的操作来加速卷积计算

im2col:将每次计算的输入按照列重新排列
channel为1时,每次参与计算的input按照列重新进行排列
im2col:将每次计算的输入按照列重新排列
channel为3时,每个channel按照行进行排列
im2col:kernel拉成一行
channel为3时,每个channel按照列排列

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

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的理解:
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的理解:
正常卷积 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
网友评论