来详解一下计算机视觉中的语义分割任务 (6)—转置卷积

191 阅读2分钟

这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

有了对卷积操作整个过程了解,我们回头还是看一看转置卷积,这是我们想要聊的。大家可能会对如何通过卷积来对图像进行上采样,实现对图像空间上提升。

转置卷积并不是卷积的逆运算,这一点大家一定要清楚。我们现在是一个 4 维空间,如何将 4 维空间映射到一个 16 维空间,或者说是还原。这个操作也就是之前提到转置卷积

那么现在输入是一个 4 维向量输出是一个 16 维向量,也就是 1×41 \times 4 需要一个 4×164 \times 16 矩阵将其变换维 1×161 \times 16 向量

transpose_convolution_012.PNG

首先这一次输入是一个 2x2 的矩阵,展开后得到 1x4 向量,这个向量想要得到一个 1x16 向量的话,就需要和 4x16 的矩阵相乘才能够得到 1x16。

接下里还是通过一些图把问题说清楚

transpose_convolution_015.PNG

这张图我们简单,将上面矩阵每一列为 4 x 1 列向量 reshape 为 2x2 后用这个 2x2 矩阵和输入矩阵进行逐点相乘后求和得到就是我们计算。

transpose_convolution_016.PNG

在上图中,我们将上面进行卷积的矩阵进行转置为 4×16 4 \times 16 的形状,后将每一列进行提取,后 reshape 为 2 x 2 后和输入 2 x 2 进行对应位置元素相乘后求和得到一个值,然后将这些值进行先列再行进行排列的想要形状。

transpose_convolution_008.PNG

其实这张图进一步将问题进行分解帮助大家理解,如果上面图理解上不太直观,可以看一看这张图,让我们更直观观察这张图。

transpose_convolution_009.PNG

代码实现

接下来是 pytorch 代码实现

import torch
import torch.nn as nn

X = torch.tensor([[11.0,14.0],[13.0,16.0]])

K = torch.tensor([[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,1.0]])
X, K = X.reshape(1, 1, 2, 2), K.reshape(1, 1, 3, 3)
# print(K.shape)

transpose_conv = nn.ConvTranspose2d(1,1,kernel_size=3,bias=False)
transpose_conv.weight.data = K
transpose_conv(X)
tensor([[[[11., 14.,  0.,  0.],
          [13., 27., 14.,  0.],
          [ 0., 13., 27., 14.],
          [ 0.,  0., 13., 16.]]]], grad_fn=<SlowConvTranspose2DBackward>)