在Keras中Conv2DTranspose和Conv2D有什么区别

问题描述 投票:0回答:1

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

我正在努力寻找从功能上解释两者之间差异的东西。谁能解释一下在 Keras 中制作神经网络的这两个不同选项意味着什么?

tensorflow keras conv-neural-network convolution deconvolution
1个回答
22
投票

Conv2D
对输入应用卷积 操作。相反,
Conv2DTranspose
对输入应用反卷积操作。

  • 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
    • 扩大您的输入
    • 用于构造特征

如果你想知道

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]]
'''
© www.soinside.com 2019 - 2024. All rights reserved.