与跨步转置卷积一起执行上采样和仅使用跨步 1 的转置卷积之间有什么区别?

What is the difference between performing upsampling together with strided transpose convolution and transpose convolution with stride 1 only?

我在很多地方注意到人们使用这样的东西,通常是在全卷积网络、自动编码器和类似的地方:

model.add(UpSampling2D(size=(2,2)))
model.add(Conv2DTranspose(kernel_size=k, padding='same', strides=(1,1))

我想知道这和简单的有什么区别:

model.add(Conv2DTranspose(kernel_size=k, padding='same', strides=(2,2))

欢迎链接到解释这种差异的任何论文。

Here and here 您可以找到关于 转置卷积 工作原理的非常好的解释。总结这两种方法:

  1. 在您的第一种方法中,您首先对特征图进行上采样:

    [[1, 2], [3, 4]] -> [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]
    

    然后应用经典卷积(因为 Conv2DTransposestride=1padding='same' 等同于 Conv2D)。

  2. 在你的第二种方法中,你首先 un(max)pooling 你的特征图:

    [[1, 2], [3, 4]] -> [[1, 0, 2, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]]
    

    然后应用带有 filter_size、过滤器等的经典卷积

有趣的是 - 尽管这些方法不同,但它们有一些共同点。转置卷积意味着对卷积梯度的近似,所以第一种方法是近似 sum pooling 而第二种方法是 max pooling 梯度。这使得第一个结果产生稍微平滑的结果。

您可能会看到第一种方法的其他原因是:

  • Conv2DTranspose(及其等效项)在 keras 中相对较新,因此执行可学习上采样的唯一方法是使用 Upsample2D
  • keras 的作者 - Francois Chollet 在他的 one 教程中使用了这种方法,
  • 在过去的转置等价物中,由于某些 API 不一致,卷积在 keras 中的效果似乎很糟糕。

我只想指出您提到的几件事。 Upsample2D 不是可学习层,因为实际上有 0 个参数。

此外,我们无法证明我们可能想要使用第一种方法的原因 因为 Francoise Chollet 在他的示例中介绍了用法。