1

我一直在尝试实施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
4

3 回答 3

1

我不知道DCGAN 论文的细节,但如果我研究一下,我可以找到以下指南来制作稳定的 DCGAN。为什么你LeakyReLU在 Generator 中使用而不是ReLU

稳定的深度卷积 GAN 的架构指南

  • 用跨步卷积(鉴别器)和分数跨步卷积(生成器)替换任何池化层。
  • 在生成器和判别器中都使用 batchnorm。
  • 移除完全连接的隐藏层以获得更深的架构。
  • 在生成器中对所有层使用 ReLU 激活,除了使用 Tanh 的输出。
  • 在所有层的判别器中使用 LeakyReLU 激活
于 2019-10-14T13:05:28.317 回答
0

SpectralNorm在鉴别器和生成器中使用SelfModulationBatchNorm。或者ConditionalBatchNorm,如果您有标签,请使用。

代码、其他方法的帮助和 GAN 训练可以在这里找到

于 2020-12-07T10:56:41.820 回答
0

我们知道批量标准化的学习伪代码是

moving_mean = None;
moving_variance = None;

if not moving_mean:
  moving_mean = current_batch_mean
else:
  moving_mean = moving_mean * momentum + current_batch_mean * (1-momentum)

if not moving_variance:
  moving_variance = current_batch_variance
else:
  moving_variance = moving_variance * momentum + current_batch_variance * (1-momentum)

这就是重点。

tensorflow 和 keras 默认的动量是 0.99,如果你不修改就使用它,下面的更新值不会影响新的更新值。在 pytorch 的情况下,默认动量是 0.1,这与 tensorflow 或 keras 中的 0.9 相同。

使用修改后的动量值,我得到了改进的结果。

如果有人像我一样遭受 simptom,请尝试降低动量值。

谢谢。

于 2019-10-17T08:19:57.343 回答