反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算

正常卷积运算:

反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第1张图片
如上图:4x4的输入,卷积Kernel为3x3, ,输出为2x2。其计算可以理解为:
输入矩阵展开为4*4=16维向量,记作x
输出矩阵展开为2*2=4维向量,记作y
卷积核C为如下矩阵:
这里写图片描述
卷积运算可表示为y = Cx(可以对照动图理解),而卷积的反向传播可以如下,相当于乘以C^T
这里写图片描述

反卷积运算:

反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第2张图片
如上图:2x2的输入,卷积Kernel为3x3, ,输出为4x4。如果按照正常卷积,生成的feature map尺寸应该减小,但是我们现在想要生成尺寸变大,就可以对输入进行padding。但与正常卷积padding不同的是:反卷积卷积运算的起点不一定在原feature map上,而是从padding区域开始。仔细看上面动图,可以看到第一个运算卷积核的中点在padding区域上。
反卷积相对于卷积在神经网络结构的正向和反向传播中做相反的运算。

conv_arithmetic理解:

github链接
上链接中的动图很好解释了卷积和反卷积的。但由于它把二者分开比较,导致在没有参数情况下很难理解具体参数意思。首先我们明白在反卷积过程中一定会padding 0的,不然没办法扩大输出map维度。但是这个padding 0却不叫padding。以下图为例:
反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第3张图片反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第4张图片
左图为No padding, no strides;右图为No padding, no strides, transposed。
明明右图的反卷积白色区块填充了0,为啥说是No Padding?这时我们需要看反卷积对应的卷积形式,发现这是因为对应的卷积是No padding的,因此她的反卷积也叫No Padding。同理strides。这时候我们再理解带strdes的就好理解了:
反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第5张图片反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第6张图片
左图为No padding, strides;右图为No padding, strides, transposed。可以看到在反卷积中处理strides=2的情况时,是把输入的蓝色区块按间隔s=2分布,但卷积形式的strides为1。如果采用正向卷积只会进一步减小输出map大小。

计算输出维度:

在理解上面如何计算输出map的大小呢?此处引用pytorch里的一个公式和conv_arithmetic中一个动图为例:
这里写图片描述
反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第7张图片反卷积 逆卷积 转置卷积(Transposed Convolution;Fractionally Strided Convolution;Deconvolution) 输出维度shape计算_第8张图片
左图为padding=1, strides=2;右图为padding=1, strides=2, transposed。
根据上面公式Hin = 3;stride=2;padding=1;kernel_size=3;output_padding=0;
则Hout = (3-1)*2-2*1+3+0=5
总体来说首先根据你要上采样的大小判断stride大小,然后根据stride导致的像素分布情况确定你的kernel size的视野大小,最后保证-stride+2padding+kernel size=0即可。

你可能感兴趣的:(computer,vision)