我在许多地方注意到人们通常在完全卷积的网络,自动编码器等中使用类似的东西:

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

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

最佳答案

Herehere可以很好地说明转置卷积的工作原理。总结这两种方法:

  • 在您的第一种方法中,您首先要对特征图进行上采样:
    [[1, 2], [3, 4]] -> [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]
    

    然后应用经典卷积(因为带有Conv2DTransposestride=1padding='same'Conv2D等效)。
  • 在第二种方法中,您首先要取消(最大)共享要素图:
    [[1, 2], [3, 4]] -> [[1, 0, 2, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]]
    

    然后使用filter_size,filter'等应用经典卷积。

    deep-learning - 与跨步转置卷积一起执行升采样与仅跨步1进行转置卷积有什么区别?-LMLPHP

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

    您可能会看到第一种方法的其他原因是:
  • Conv2DTranspose(及其等效项)在keras中相对较新,因此执行可学习的上采样的唯一方法是使用Upsample2D
  • keras的作者-Francois Chollet在他的教程one的ojit_a中使用了这种方法
  • 在过去等同于转置的情况下,由于keras的某些不一致,卷积在API中似乎很糟糕。
  • 关于deep-learning - 与跨步转置卷积一起执行升采样与仅跨步1进行转置卷积有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48226783/

    10-13 00:06