TensorFlow教程:DCGAN模型适用于不同尺寸的图像

3
TensorFlow DCGAN教程中的生成器和鉴别器模型代码是针对28x28像素的黑白图像(MNIST数据集)设计的。我想将该模型代码适应于自己的280x280 RGB图像数据集(280,280,3),但不清楚如何实现。
1个回答

2

您可以使用教程中的代码,只需要稍微调整一下生成器即可。让我为您解释一下。以下是教程中的生成器代码:

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再次乘以2,大小为(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)开始,再添加一个额外的步幅为(2, 2)的Conv2DTranspose,过滤器将变成512、256、128、64、3。
关于判别器,它在不修改的情况下可以正常工作。然而,由于您的图像相当大,我建议向判别器添加更多的Conv2D并使其更深。

对于彩色图像,我们是否仍然希望将通道减少到1个,还是3个? - Jose Fernandez
不,应该是3个通道,就像我在代码中所述。我在描述中提到了它,但忘记在代码中更改它。 - Coderji

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