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

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层,使其更深。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注