这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战
有了对卷积操作整个过程了解,我们回头还是看一看转置卷积,这是我们想要聊的。大家可能会对如何通过卷积来对图像进行上采样,实现对图像空间上提升。
转置卷积并不是卷积的逆运算,这一点大家一定要清楚。我们现在是一个 4 维空间,如何将 4 维空间映射到一个 16 维空间,或者说是还原。这个操作也就是之前提到转置卷积。
那么现在输入是一个 4 维向量输出是一个 16 维向量,也就是 需要一个 矩阵将其变换维 向量
首先这一次输入是一个 2x2 的矩阵,展开后得到 1x4 向量,这个向量想要得到一个 1x16 向量的话,就需要和 4x16 的矩阵相乘才能够得到 1x16。
接下里还是通过一些图把问题说清楚
这张图我们简单,将上面矩阵每一列为 4 x 1 列向量 reshape 为 2x2 后用这个 2x2 矩阵和输入矩阵进行逐点相乘后求和得到就是我们计算。
在上图中,我们将上面进行卷积的矩阵进行转置为 的形状,后将每一列进行提取,后 reshape 为 2 x 2 后和输入 2 x 2 进行对应位置元素相乘后求和得到一个值,然后将这些值进行先列再行进行排列的想要形状。
其实这张图进一步将问题进行分解帮助大家理解,如果上面图理解上不太直观,可以看一看这张图,让我们更直观观察这张图。
代码实现
接下来是 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>)