Python 深度学习和梯度伪影中的平均池层

Python 深度学习和梯度伪影中的平均池层,python,deep-learning,pytorch,generative-adversarial-network,medical-imaging,Python,Deep Learning,Pytorch,Generative Adversarial Network,Medical Imaging,我知道在卷积层中,内核大小需要是步长的乘积,否则它将在梯度计算中产生伪影,如棋盘问题。 现在,它在池层中也像这样工作吗?我在某个地方读到,最大池也会导致类似的问题。以鉴别器中的这一行为例: self.downsample = nn.AvgPool2d(3, stride=2, padding=1, count_include_pad=False) 我有一个模型(MUNIT),这是它制作的图像: 看起来像是棋盘问题,或者至少是梯度问题,但我检查了卷积层,没有发现上面描述的错误。它们的步幅都

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

  self.downsample = nn.AvgPool2d(3, stride=2, padding=1, count_include_pad=False)
我有一个模型(MUNIT),这是它制作的图像:


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

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

快速查看了MUNIT,他们在
解码器中使用的是
torch.nn.Upsample
和最近邻上采样(精确的代码行)

您可以尝试使用
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初始化也应该有帮助(可能的实现或更改)。该初始方案初始化权重,使其作用类似于开始时的最近邻上采样(研究论文)