25

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

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

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

4

2 回答 2

27

在这里这里,您可以找到关于转置卷积如何工作的非常好的解释。总结一下这两种方法:

  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. 在您的第二种方法中,您首先取消(最大)池化您的特征图:

    [[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 在他的一个教程中使用了这种方法,
  • keras在过去的转置等价物中,由于一些API不一致,卷积似乎工作得很糟糕。
于 2018-01-12T14:34:35.567 回答
0

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

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

于 2021-06-07T01:31:59.990 回答