转置卷积
转置卷积
Transposed Convolution、Fractional Strided Convolution、Deconvolution
上采样
1. 转置卷积与反卷积的区别
那什么是反卷积?从字面上理解就是卷积的逆过程。值得注意的反卷积虽然存在,但是在深度学习中并不常用。而转置卷积虽然又名反卷积,却不是真正意义上的反卷积。因为根据反卷积的数学含义,通过反卷积可以将通过卷积的输出信号,完全还原输入信号。而事实是,转置卷积只能还原shape大小,而不能还原value。你可以理解成,至少在数值方面上,转置卷积不能实现卷积操作的逆过程。所以说转置卷积与真正的反卷积有点相似,因为两者产生了相同的空间分辨率。但是又名反卷积(deconvolutions)的这种叫法是不合适的,因为它不符合反卷积的概念。
https://www.cnblogs.com/marsggbo/p/9737991.html
2. 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)https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md#transposed-convolution-animations
3. 计算说明
4. API
• tf.keras.layers.Conv2DTranspose
• torch.nn.ConvTranspose2d
5. 转置卷积原理
卷积计算 第1步 卷积计算 第2步 ( stride=1 )input:4x4 kernel:2x2 卷积计算4步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
卷积操作转化为矩阵操作-》权重矩阵Ci = 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的这样的操作来加速卷积计算
channel = 1时channel = 3时im2col:将每次计算的输入按照列重新排列
channel为1时,每次参与计算的input按照列重新进行排列
kernel 重排im2col:将每次计算的输入按照列重新排列
channel为3时,每个channel按照行进行排列
im2col:kernel拉成一行
channel为3时,每个channel按照列排列
C * M = O output_channel = 3inputimage 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
转置卷积 padding可以看到通过内积操作,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