将上采样与跨步转置卷积和转置卷积仅与步幅1进行上行有什么区别?

Ale*_*vic 21 convolution deep-learning conv-neural-network keras deconvolution

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

model.add(UpSampling2D(size=(2,2)))
model.add(Conv2DTranspose(kernel_size=k, padding='same', strides=(1,1))
Run Code Online (Sandbox Code Playgroud)

我想知道它之间的区别是什么?

model.add(Conv2DTranspose(kernel_size=k, padding='same', strides=(2,2))
Run Code Online (Sandbox Code Playgroud)

我们欢迎任何解释这种差异的论文链接.

Mar*_*jko 24

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

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

    [[1, 2], [3, 4]] -> [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]
    
    Run Code Online (Sandbox Code Playgroud)

    然后你申请一个经典的卷积(如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]]
    
    Run Code Online (Sandbox Code Playgroud)

    然后应用经典卷积filter_size,过滤器等.

    在此输入图像描述

有趣的事实是 - 尽管这些方法不同,但它们有一些共同之处.转置卷积意味着卷积梯度的近似,因此第一种方法是逼近sum pooling而第二种max pooling渐变.这使得第一个结果产生稍微平滑的结果.

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

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