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



生成器和鉴别器模型的TensorFlow DCGAN教程代码适用于28x28像素的黑白图像(MNIST数据集(。

我想调整模型代码以使用我自己的280x280 RGB图像数据集(280280,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,7256(的特征图。现在的想法是,在模型结束时,我们希望将通道减少到1,并增加宽度和高度以达到原始图像大小。信道由滤波器的数量控制,这就是为什么它减少每个连续的Conv2DTranspose层。它从256变为128、64和1。对于宽度和高度,它们由strides参数控制。这样,第一个Conv2DTranspose不会改变宽度和高度,因为它的步幅为1,但第二个将乘以2,得出(14,14(,最后一个Conv2DTranspose再次得出(28,28(。

对于您的情况,您有两个选项:增加第一个隐藏层(Dense(以将数据投影到(70*70*256(,在最终的Conv2DTranspose中,将过滤器更改为3并保持所有内容不变,最终输出将为(280280,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,并使其更深,因为您的图像相当大。

最新更新