我在许多地方注意到人们通常在完全卷积的网络,自动编码器等中使用类似的东西:
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和here可以很好地说明转置卷积的工作原理。总结这两种方法:
[[1, 2], [3, 4]] -> [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]
然后应用经典卷积(因为带有
Conv2DTranspose
和stride=1
的padding='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'等应用经典卷积。有趣的事实是-尽管这些方法不同,但是它们有一些共同点。转置卷积是卷积梯度的近似值,因此第一种方法是近似
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/