我一直在尝试实施Facebook 的论文DCGan,并被以下两个问题阻止了将近 2 周。任何建议,将不胜感激。谢谢。
问题一:
DCGAN 论文建议在生成器和判别器中都使用 BN(Batch Normalization)。但是,使用 BN 而不是没有 BN,我无法获得更好的结果。
我复制了我使用的 DCGAN 模型,它与 DCGAN 论文完全相同。我不认为这是由于过度拟合。因为(1)它一直显示与初始噪声图片相同的噪声,并且似乎从未接受过训练。(2) Loss 值非常稳定,gan 和 discriminator 都没有真正改变。(它保持在 0.6 ~ 0.7 左右,并且从来没有像两个模型都崩溃时那样感到沮丧或颠簸。)如果我只检查损失函数,似乎它得到了很好的训练。
问题 2:
当我使用 float16 时,它总是给我 Nan 和下面的模型。我已将 epsilon 更改为 1e-4 1e-3 ,但都失败了。还有一个问题。如果我不使用 BatchNormalization,它可以是 Nan。足够有道理,我能明白。但是,如果我使用 BatchNormalization,它会在每一层中标准化。即使结果变成非常大的数字或非常小的数字,它也会在每一层中进行批量标准化,结果将几乎居中并且不应该发生淡出。不是吗?这实际上是我的想法,但我不知道我在想什么。请有人帮助我。
===== 生成器 =====
输入#(无,128)<=潜在
Dense # (None, 16384)
BatchNormalization
LeakyReLU
重塑 #(无、4、4、1024)
Conv2DTranspose # (无, 4, 4, 512)
BatchNormalization
LeakyReLU
Conv2DTranspose # (无, 8, 8, 256)
BatchNormalization
LeakyReLU
Conv2DTranspose # (无, 16, 16, 128)
BatchNormalization
LeakyReLU
Conv2DTranspose #(无、32、32、64)
BatchNormalization
LeakyReLU
Conv2DTranspose # (无, 64, 64, 32)
BatchNormalization
LeakyReLU
Conv2DTranspose # (无, 128, 128, 16)
BatchNormalization
LeakyReLU
Conv2D #(无、128、128、3)
===== 鉴别器 =====
Conv2D # (None, 128, 128, 3) LeakyReLU
Conv2D # (None, 64, 64, 16) BatchNormalization
Dropout
LeakyReLU
Conv2D # (None, 32, 32, 32)
BatchNormalization
Dropout
LeakyReLU
Conv2D # (None, 16, 16, 64)
BatchNormalization
Dropout
LeakyReLU
Conv2D # (None, 8, 8, 128)
BatchNormalization
Dropout
LeakyReLU
Conv2D # (None, 4, 4, 256)
BatchNormalization
Dropout
LeakyReLU
Conv2D # (None, 2, 2, 512)
BatchNormalization
Dropout
LeakyReLU
压平
Dropout
Dense
我尝试过的最后一个超参数如下,我没有忘记将高斯噪声添加到训练图片中。
image_shape => (128, 128, 3)
latent_dim => 128
channels => 3
iterations => 10000
batch_size => 128
epsilon => 0.005
weight_init_stddev => 0.02
beta_1 => 0.5
discriminator_lr => 0.0002
gan_lr => 0.0002