【问题标题】:What is the difference between performing upsampling together with strided transpose convolution and transpose convolution with stride 1 only?与跨步转置卷积一起执行上采样和仅使用跨步 1 的转置卷积有什么区别?
【发布时间】:2018-01-12 12:58:39
【问题描述】:

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

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))

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

【问题讨论】:

标签: deep-learning keras conv-neural-network convolution deconvolution


【解决方案1】:

Herehere 你可以找到关于转置卷积如何工作的非常好的解释。总结这两种方法:

  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、filters`等应用经典卷积。

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-08-02
      • 2019-02-21
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多