TensorFlow的DCGAN 教程中,关于生成器和判别器模型的代码是针对28×28像素的黑白图像(MNIST数据集)设计的。
我想将该模型代码调整以适应我自己的280×280的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
如你所见,生成器从先验分布(噪声)中取100个样本作为input_shape
。然后,它将数据投影到更大的维度7 * 7 * 256,并重塑为形状为(7, 7, 256)的特征图。现在的想法是,在模型结束时,我们希望将通道数减少到1,并增加宽度和高度以达到原始图像尺寸。通道数由滤波器数量控制,这就是为什么每个连续的Conv2DTranspose
层通道数都在减少,从256到128、64和1。至于宽度和高度,它们由strides
参数控制。因此,第一个Conv2DTranspose
层不改变宽度和高度,因为它的步长为1,而第二个步长为2,使得宽度和高度变成(14, 14),最后一个Conv2DTranspose
层再次将宽度和高度变成(28, 28)。
对于你的情况,你有两个选择:要么增加第一个隐藏层(Dense)将数据投影到(70 * 70 * 256),并在最后一个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)开始,增加一个额外的Conv2DTranspose
层,步长设为(2, 2),滤波器数量将从512、256、128、64、3逐渐减少。
关于判别器,它无需修改即可正常工作。然而,考虑到你的图像尺寸较大,我建议在判别器中添加更多的Conv2D
层,使其更深。