图示反卷积
- 这里以尺寸为2x2的图像和3x3的单位卷积核为输入
其他参数设置步长stride=2,膨胀Dilation=2, padding=0
- 1. 先对输入进行膨胀,输入膨胀等于步长stride, 我们的stride=2, 所以每个输入图像的像素要间隔2个像素
- 如下图所示
- 2. 对膨胀过的输入进行Padding, Input Padding = Dilation * (kernel_size - 1) - padding = 3
- 如下图所示
- 9x9- 3. 对卷积进行膨胀,Dilation = 2,每个像素间隔2
-
- 如下图所示
-
- 5x5
- 4. 用第3步膨胀过的卷积, 膨胀Padding好的输入图像第4步,stride = 1, 输出为下图所示
- 输出尺寸: N=(W−F+2P)/S+1 = (9 - 5 + 2 * 0)/ 1 + 1 = 5
-
- 如下图所示
-
- 5x5
下面用代码验证
import torch
import torch.nn as nn
up = nn.ConvTranspose2d(1, 1, kernel_size=3, bias=False, stride=2, padding=1, dilation=2)
# 把卷积核初始化为特定值, 单位矩阵
up.weight.data = torch.eye(3, 3).view(1, 1, 3, 3)
x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32).view(1, 1, 2, 2)
x, up(x)
output:
(tensor([[[[1., 2.],
[3., 4.]]]]),
tensor([[[[0., 0., 0., 0., 0.],
[0., 5., 0., 2., 0.],
[0., 0., 0., 0., 0.],
[0., 3., 0., 5., 0.],
[0., 0., 0., 0., 0.]]]], grad_fn=<ConvolutionBackward0>))
对上了