GAN 仅仅因为种子分布而在一批中生成完全相同的图像,为什么?

Jas*_*son 5 python neural-network conv-neural-network generative-adversarial-network

我训练了一个 GAN 来重现类似 CIFAR10 的图像。最初,我注意到生成器生成的跨一批图像看起来总是相同的,如下图所示:\n在此输入图像描述

\n

经过几个小时的调试和与教程的比较,这对于初学者来说是一个很好的学习资源(https://machinelearningmastery.com/how-to-develop-a-generative-adversarial-network-for-a-cifar-10-small- object-photographs-from-scratch/),我只需在原始代码上添加一个字母,生成的图像就开始看起来正常(每个批次中的每个人都开始看起来彼此不同),如下图所示:\n在此输入图像描述

\n

代码上神奇的一个字符更改是进行以下更改:

\n

更改自:

\n
def generate_latent_points(self, n_samples):\n        return np.random.rand(n_samples, self.latent_dim)\n
Run Code Online (Sandbox Code Playgroud)\n

到:

\n
def generate_latent_points(self, n_samples):\n        return np.random.randn(n_samples, self.latent_dim)\n
Run Code Online (Sandbox Code Playgroud)\n

希望这个非常微妙的细节可以帮助那些花费数小时绞尽脑汁进行 GAN 训练过程的人。

\n

np.random.rand给出均匀分布[0, 1)

\n

np.random.randn给出均值 0 和方差 1 的单变量 \xe2\x80\x9cnormal\xe2\x80\x9d (高斯)分布

\n

那么,为什么生成器的潜在种子分布差异会表现得如此不同呢?

\n

Jas*_*son 1

我能想到的可能原因有以下几个:

  1. 这两者的分布差异有两个方面: 1.rand仅给出正值,而randn周围同时给出负值和正值0;2.由于显而易见的原因rand,给出的数值更大randn。较大的幅度可能会导致学习不稳定,因为 dL/dw (与 x 成正比)将大于 的情况randn

  2. 生成器的不成功学习对判别器区分真假图像没有任何挑战,因此判别器没有学习任何新的东西。(这是我在训练过程中对判别器的loss和acc的观察)