在 Keras 中,Conv2DTranspose 和 Conv2D 有什么区别?

6

我目前正在使用Tensorflow 2和Keras构建一个GAN,并注意到现有的生成器和判别器的神经网络大多使用Keras中的Conv2D和Conv2DTranspose。

我很难找到一些能够解释这两者之间差异功能的东西。 有人能够解释一下在Keras中使用这两种不同选项创建神经网络的含义吗?

1个回答

22
< p > Conv2D 对输入进行卷积操作。相反地,Conv2DTranspose 对输入进行反卷积操作。

例如:

x = tf.random.uniform((1,3,3,1))
conv2d = tf.keras.layers.Conv2D(1,2)(x)
print(conv2d.shape)
# (1, 2, 2, 1)
conv2dTranspose = tf.keras.layers.Conv2DTranspose(1,2)(x)
print(conv2dTranspose.shape)
# (1, 4, 4, 1)

Conv2D主要用于特征检测,例如在自编码模型的编码器部分中使用,并且它可能会缩小输入形状。
相反地,Conv2DTranspose用于创建特征,例如在自编码模型的解码器部分中用于构建图像。如上所示,它可以使输入形状变大。

例如:

kernel = tf.constant_initializer(1.)
x = tf.ones((1,3,3,1))
conv = tf.keras.layers.Conv2D(1,2, kernel_initializer=kernel)
y = tf.ones((1,2,2,1))
de_conv = tf.keras.layers.Conv2DTranspose(1,2, kernel_initializer=kernel)

conv_output = conv(x)
print("Convolution\n---------")
print("input  shape:",x.shape)
print("output shape:",conv_output.shape)
print("input  tensor:",np.squeeze(x.numpy()).tolist())
print("output tensor:",np.around(np.squeeze(conv_output.numpy())).tolist())
'''
Convolution
---------
input  shape: (1, 3, 3, 1)
output shape: (1, 2, 2, 1)
input  tensor: [[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]
output tensor: [[4.0, 4.0], [4.0, 4.0]]
'''
de_conv_output = de_conv(y)
print("De-Convolution\n------------")
print("input  shape:",y.shape)
print("output shape:",de_conv_output.shape)
print("input  tensor:",np.squeeze(y.numpy()).tolist())
print("output tensor:",np.around(np.squeeze(de_conv_output.numpy())).tolist())
'''
De-Convolution
------------
input  shape: (1, 2, 2, 1)
output shape: (1, 3, 3, 1)
input  tensor: [[1.0, 1.0], [1.0, 1.0]]
output tensor: [[1.0, 2.0, 1.0], [2.0, 4.0, 2.0], [1.0, 2.0, 1.0]]
'''

总而言之:

  • Conv2D
    • 可能会缩小您的输入
    • 用于检测特征
  • Conv2DTranspose
    • 放大您的输入
    • 用于构建特征

enter image description here

如果您想知道如何使用Conv2DTranspose放大输入,请看这里:enter image description here


常见的情况是看到代码中有几个conv2D层,然后跟着几个conv2DTranspose层。后者应该是为了撤销前者的效果。那么,如果我们只是得到原始输入,为什么还要使用它们呢? - skan
@skan 你好。感谢你的问题。这种架构有许多应用,例如在类似U-Net的架构中使用编码器-解码器或分割。 - Kaveh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接