卷积是一种下采样操作,可以减少输入图像的空间维度(高和宽)。
转置卷积(transposed convolution),可以看作是卷积的逆,是一种上采样操作,增大特征图的空间维度(高和宽)。注意这里卷积的逆只针对图像大小,图像中的值发生改变。
卷积
一个最简单例子演示转置卷积如何工作:设步幅为 1 且没有填充。 假设我们有一个 的输入张量和一个 的卷积核。 以步幅为 1 滑动卷积核窗口,每行 次,每列 次,共产生 个中间结果。 每个中间结果都是一个 的张量,初始化为 0 。 为了计算每个中间张量,输入张量中的每个元素都要乘以卷积核,从而使所得的 张量替换中间张量的一部分。最后,所有中间结果相加以获得最终结果。
逐步实现:
def trans_conv(X, K):
h, w = K.shape
Y = torch.zeros((X.shape[0] + h - 1, X.shape[1] + w - 1))
for i in range(X.shape[0]):
for j in range(X.shape[1]):
Y[i: i + h, j: j + w] += X[i, j] * K
return Y
简单实现:
nn.ConvTranspose2d(1, 1, kernel_size=2, bias=False)
填充
在转置卷积中也可以添加padding操作,但是这里的padding不是向以前的卷积中的可以放大输入。可以理解缩小输入。
举例:转置卷积的 padding 设置为 1 时,转置卷积的输出中将删除第一和最后的行与列。
正常的是 input -> padding -> conv -> output 。
转置卷积就是 input -> deconv -> depadding -> output 。过程完全逆运行。
步幅
看懂前面简单的转置卷积,那步长也没什么难点。
nn.ConvTranspose2d(1, 1, kernel_size=2, stride=2, bias=False)
通道
通道更简单,使用方法完完全一致
conv = nn.Conv2d(10, 20, kernel_size=5, padding=2, stride=3)
tconv = nn.ConvTranspose2d(20, 10, kernel_size=5, padding=2, stride=3)
总结:
卷积的变换:
转置卷积:
当 k = 2p + s 时,卷积是成倍减小,转置卷积是成倍增加(高和宽)