TensorFlow DCGAN教程中的生成器和鉴别器模型代码是针对28x28像素的黑白图像(MNIST数据集)设计的。我想将该模型代码适应于自己的280x280 RGB图像数据集(280,280,3),但不清楚如何实现。
您可以使用教程中的代码,只需要稍微调整一下生成器即可。让我为您解释一下。以下是教程中的生成器代码:
def make_generator_model():
model = tf.keras.Sequential()
model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,)))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Reshape((7, 7, 256)))
assert model.output_shape == (None, 7, 7, 256) # Note: None is the batch size
model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
assert model.output_shape == (None, 7, 7, 128)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
assert model.output_shape == (None, 14, 14, 64)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
assert model.output_shape == (None, 28, 28, 1)
return model
input_shape
所示。然后,它将数据投影到更大的7 * 7 * 256维空间,并重塑为形状为(7,7,256)的特征图。现在的想法是在模型的末尾,我们希望将通道数减少到1,并增加宽度和高度以达到原始图像大小。通道由过滤器数量控制,这就是为什么每个连续的Conv2DTranspose
层都会减少。它从256降至128、64和1。对于宽度和高度,它们由strides
参数控制。因此,第一个Conv2DTranspose
不改变宽度和高度,因为它具有步幅1,但第二个会乘以2,这导致大小为(14,14),最后一个Conv2DTranspose
再次乘以2,大小为(28,28)。Conv2DTranspose
中将过滤器更改为3,保持所有内容不变,最终输出将为(280,280,3)。这将如下所示:def make_generator_model():
model = tf.keras.Sequential()
model.add(layers.Dense(70*70*256, use_bias=False, input_shape=(100,)))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Reshape((70, 70, 256)))
assert model.output_shape == (None, 70, 70, 256) # Note: None is the batch size
model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))
assert model.output_shape == (None, 70, 70, 128)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
assert model.output_shape == (None, 140, 140, 64)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(3, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
assert model.output_shape == (None, 280, 280, 3)
return model
Conv2DTranspose
层数,直到达到正确的尺寸。例如,从(35 * 35 * 512)开始,再添加一个额外的步幅为(2, 2)的Conv2DTranspose
,过滤器将变成512、256、128、64、3。Conv2D
并使其更深。