我目前正在使用Tensorflow 2和Keras构建一个GAN,并注意到现有的生成器和判别器的神经网络大多使用Keras中的Conv2D和Conv2DTranspose。
我很难找到一些能够解释这两者之间差异功能的东西。 有人能够解释一下在Keras中使用这两种不同选项创建神经网络的含义吗?
我目前正在使用Tensorflow 2和Keras构建一个GAN,并注意到现有的生成器和判别器的神经网络大多使用Keras中的Conv2D和Conv2DTranspose。
我很难找到一些能够解释这两者之间差异功能的东西。 有人能够解释一下在Keras中使用这两种不同选项创建神经网络的含义吗?
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
: