ConvTranspose2d-反卷积

2d转置卷积(2D transposed convolution),一般用于图像,输入是一个二维图像,然后可以有多个通道,输入比如 [1,64,128,128]。

这个模块可以看作是Conv2d(二维卷积)对其输入的梯度。它也被称为 fractionally-strided convolution 或者deconvolution(尽管它并不是一个真正的反卷积操作,因为它没有计算卷积的真正逆运算)。想了解更多信息, see the visualizations here and the Deconvolutional Networks paper.

反卷积示例

简单来说,这个模块就是用来做与常规卷积相反的操作,但并不是严格意义上的逆运算。它在某些场合被用来从低分辨率图像生成高分辨率图像,或者在神经网络中做其他类似的任务。

注意点:

  • stride 控制交叉相关(cross-correlation)的步长。
  • padding 控制在两侧隐式地添加零填充的数量,具体为 dilation * (kernel_size - 1) - padding 数量的点。具体细节请参见下面的注释。
  • output_padding 控制输出形状一侧额外增加的大小。具体细节请参见下面的注释。
  • dilation 控制核(kernel)点之间的间距;也被称为à trous算法。这比较难以描述,但这里的链接有一个很好的可视化解释dilation的作用。
  • groups 控制输入和输出之间的连接。in_channels 和 out_channels 必须都能被 groups 整除。
    例如,
    • 在 groups=1 的情况下,所有输入都会与所有输出进行卷积。
    • 在 groups=2 的情况下,该操作等同于拥有两个并排的卷积层,每个都处理一半的输入通道并生成一半的输出通道,然后两者随后进行连接。
    • 在 groups= in_channels 的情况下,每个输入通道都与其自己的一组滤波器(大小为 out_channels/in_channels)进行卷积。

参数 kernel_size、stride、padding、output_padding 可以是:

  • 一个单独的int —— 在这种情况下,该值将用于高度和宽度维度。
  • 两个整数的tuple —— 在这种情况下,第一个整数用于高度维度,第二个整数用于宽度维度。

padding 参数实际上在输入的两侧各添加了 dilation * (kernel_size - 1) - padding 量的零填充。这样设置是为了当一个Conv2d(二维卷积)和一个ConvTranspose2d(二维转置卷积)用相同的参数初始化时,它们在输入和输出形状方面是彼此的逆运算。然而,当 stride(步长)> 1 时,Conv2d 会将多个输入形状映射到同一个输出形状。output_padding 是为了通过有效地增加一个侧面的计算输出形状来解决这种模糊性。需要注意的是,output_padding 只用于确定输出形状,但实际上并不会给输出添加零填充。

In some circumstances when given tensors on a CUDA device and using CuDNN, this operator may select a nondeterministic algorithm to increase performance. If this is undesirable, you can try to make the operation deterministic (potentially at a performance cost) by setting torch.backends.cudnn.deterministic = True . See Reproducibility for more information.

使用示例

# With square kernels and equal stride
m = nn.ConvTranspose2d(16, 33, 3, stride=2)
# non-square kernels and unequal stride and with padding
m = nn.ConvTranspose2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
input = torch.randn(20, 16, 50, 100)
output = m(input)
# exact output size can be also specified as an argument
input = torch.randn(1, 16, 12, 12)
downsample = nn.Conv2d(16, 16, 3, stride=2, padding=1)
upsample = nn.ConvTranspose2d(16, 16, 3, stride=2, padding=1)
h = downsample(input)
h.size()
output = upsample(h, output_size=input.size())
output.size()
...
layers.append(
    nn.ConvTranspose2d(
        in_channels=self.inplanes,
        out_channels=planes,
        kernel_size=kernel,
        stride=2,
        padding=padding,
        output_padding=output_padding,
        bias=self.deconv_with_bias))
...

参数细节:

  • in_channels(整数)– 输入图像的通道数
  • out_channels(整数)– 输出图像的通道数
  • kernel_size(整数或元组)– 卷积核的大小
  • stride(整数或元组,可选)– 卷积的步长。默认值:1
  • padding(整数或元组,可选)– 在输入的每个维度的两侧将添加 dilation * (kernel_size - 1) - padding 的零填充。默认值:0
  • output_padding(整数或元组,可选)– 在输出形状的每个维度的一侧额外增加的大小。默认值:0
  • groups(整数,可选)– 输入通道到输出通道的阻塞连接数。默认值:1
  • bias(布尔值,可选)– 如果为True,则向输出添加一个可学习的偏置。默认值:True
  • dilation(整数或元组,可选)– 核元素之间的间距。默认值:1

参考: