1

我知道在卷积层中,内核大小需要是步幅的乘积,否则它将在梯度计算中产生伪影,例如棋盘问题。现在它在 Pooling 层中也可以这样工作吗?我在某处读到最大池也可能导致类似的问题。以鉴别器中的这一行为例:

  self.downsample = nn.AvgPool2d(3, stride=2, padding=1, count_include_pad=False)

我有一个模型(MUNIT),这是它产生的图像:

在此处输入图像描述

它看起来像棋盘问题,或者至少是梯度问题,但我检查了我的卷积层并没有发现上述错误。它们都是尺寸为 4 且步幅为 2 的尺寸,或者是尺寸不均匀且步幅为 1 的尺寸。

4

1 回答 1

2

老实说,这看起来不像棋盘神器。另外我认为鉴别器不是问题,它通常与图像恢复(生成器或解码器)有关。

快速浏览了 MUNIT,他们使用的Decoder是最近邻上采样(此处torch.nn.Upsample的确切代码行)。

您可以尝试使用torch.nn.Conv2d后跟torch.nn.PixelShuffle,如下所示:

import torch

in_channels = 32
upscale_factor = 2
out_channels = 16

upsampling = torch.nn.Sequential(
    torch.nn.Conv2d(
        in_channels,
        out_channels * upscale_factor * upscale_factor,
        kernel_size=3,
        padding=1,
    ),
    torch.nn.PixelShuffle(upscale_factor),
)

image = torch.randn(1, 32, 16, 16)

upsampling(image).shape  # [1, 16, 32, 32]

这允许神经网络学习如何对图像进行上采样,而不仅仅是使用torch.nn.Upsample网络无法控制的图像(并且使用下面的技巧,它也应该没有棋盘伪影)。

此外,ICNR 初始化Conv2d也应该有所帮助(可能在此处此处实现)。此初始化方案初始化权重以在开始时类似于最近邻上采样(此处为研究论文)。

于 2021-03-20T11:25:33.293 回答