我知道在卷积层中,核的大小需要是步幅的倍数,否则它会在梯度计算中产生伪影,比如棋盘问题。现在,它在池化层中也是这样工作的吗?我在某处读到,最大池化也会导致类似的问题。以鉴别器中的这一行为例:
self.downsample = nn.AvgPool2d(3, stride=2, padding=1, count_include_pad=False)我有一个模型(MUNIT),这是它生成的图像:

它看起来像棋盘问题,或者至少是梯度问题,但我检查了我的卷积层,没有发现上面描述的错误。它们的大小均为4,步幅为2,或者步幅为1,大小不均匀。
发布于 2021-03-20 19:25:33
老实说,这看起来不像是棋盘文物。我也不认为鉴别器会是问题,它通常是关于图像恢复(生成器或解码器)。
快速查看一下MUNIT,他们在Decoder中使用的是带有最近邻上采样的torch.nn.Upsample (精确的代码行here)。
您可以尝试在torch.nn.PixelShuffle后面使用torch.nn.Conv2d,如下所示:
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 (使用下面的技巧,它也应该没有棋盘伪影)。
此外,Conv2d的ICNR初始化也应该有所帮助(可能实现here或here)。此初始化方案初始化权重,使其在开始时的行为类似于最近邻上采样(研究论文here)。
https://stackoverflow.com/questions/66720639
复制相似问题