【问题标题】:Average Pooling layer in Deep Learning and gradient artifacts深度学习中的平均池化层和梯度伪影
【发布时间】:2021-06-17 14:21:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python deep-learning pytorch generative-adversarial-network medical-imaging


    【解决方案1】:

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

    快速浏览一下 MUNIT,他们在 Decoder 中使用的是 torch.nn.Upsample,并进行了最近邻上采样(确切的代码行 here)。

    您可以尝试使用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(并且使用下面的技巧,它也应该没有棋盘伪影)。

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

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2021-01-18
      • 2017-03-15
      • 1970-01-01
      • 2020-06-30
      • 2023-03-06
      相关资源
      最近更新 更多