不同尺寸图像的 TensorFlow 教程 DCGAN 模型

TensorFlow tutorial DCGAN models for different size images

TensorFlow DCGAN tutorial code for the generator and discriminator 模型适用于 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 中看到的那样,生成器从先验分布(噪声)中获取 100 个样本。然后,它将数据投影到更大的 7 * 7 * 256 维度,并将其整形为具有形状 (7, 7, 256) 的特征图。现在的想法是在模型结束时,我们希望将通道减少到 1 并增加宽度和高度以达到原始图像大小。通道由过滤器的数量控制,这就是为什么它在每个连续的 Conv2DTranspose 层中减少。它从 256 到 128、64 和 1。对于宽度和高度,它们由 strides 参数控制。这样,第一个 Conv2DTranspose 不会改变宽度和高度,因为它的步幅为 1,但是第二个将乘以 2,这会产生 (14, 14) 并且最后一个 Conv2DTranspose, 产生 (28, 28).

对于您的情况,您有两个选择:增加第一个隐藏层(密集)以将数据投影到 (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 并使其更深,因为您的图像非常大。