Machine learning GAN培训和意外的NaN结果

Machine learning GAN培训和意外的NaN结果,machine-learning,keras,deep-learning,generative-adversarial-network,Machine Learning,Keras,Deep Learning,Generative Adversarial Network,大家好,2021年快乐 我试图将一个GAN网络训练成一个NumPy数组形状(20000,3),它是一个包含3列(每个列的值介于-1和1之间)的数据集的输入数据,如下3个示例所示: [0.7758508 0.99201597 0.90802954] [0.99263527 0.99600798 0.90231117]] 然而,在训练的早期,所有的损失都开始流向南,如下所示。发电机输出也将变为NaN GEN Loss: 0.019527255 DISC Loss: [-0.0551396

大家好,2021年快乐

我试图将一个GAN网络训练成一个NumPy数组形状(20000,3),它是一个包含3列(每个列的值介于-1和1之间)的数据集的输入数据,如下3个示例所示:

 [0.7758508  0.99201597 0.90802954]
 [0.99263527 0.99600798 0.90231117]]
然而,在训练的早期,所有的损失都开始流向南,如下所示。发电机输出也将变为NaN

GEN Loss:  0.019527255
DISC Loss:  [-0.055139657, -0.07087045, -0.017024973, 0.032755766]
GEN Loss:  0.017767208
DISC Loss:  [-0.060895607, -0.070055336, -0.01139014, 0.02054987]
GEN Loss:  0.015142502
DISC Loss:  [-0.019746825, -0.06709217, -0.017383143, 0.06472849]
GEN Loss:  0.016435547
DISC Loss:  [-0.037867796, -0.07073814, -0.018058099, 0.05092844]
GEN Loss:  0.019013882
DISC Loss:  [nan, nan, -0.013940675, 0.05671501]
GEN Loss:  nan
DISC Loss:  [nan, nan, nan, nan]

我决定在尝试WGAN Keras实现,但仍然有相同的行为

根本原因可能是什么

见以下模型和损失函数定义(损失函数如上文WGAN链接所示):


非常感谢所有线索。

根据NaN发生的顺序,我的直接猜测是,
wasserstein_损失
导致非常大的梯度,我以前遇到过这个问题,我通过使用
hing_损失=-1.*tf.reduce_mean(tf.minimum(0.,-1.+target*output))
,同时检查有关训练和稳定Gan的更多信息。为什么打印4个损失,而您只定义了3个鉴别器损失?从NaN发生的顺序来看,我的直接猜测是,
wasserstein_损失
导致非常大的梯度,我以前遇到过这个问题,我使用
hing_loss=-1.*传递它tf.减少平均值(tf.最小值(0.,-1.+目标*输出))
,同时检查培训和稳定GAN的更多信息。为什么打印4个损耗,而只定义3个鉴别器损耗?
def make_discriminator():
    
    model = Sequential()
    model.add(Dense(25, input_dim=3))
    model.add(LeakyReLU())
    model.add(Dense(40))
    model.add(LeakyReLU())
    model.add(Dense(24, kernel_initializer='he_normal'))
    model.add(LeakyReLU())
    model.add(Dense(1, kernel_initializer='he_normal'))
    return model


def make_generator():
    """Creates a generator model that takes a 20-dimensional noise vector as a "seed",
    and outputs images of size 28x28x1."""
    model = Sequential()
    model.add(Dense(50, input_dim=20))
    model.add(BatchNormalization())
    model.add(LeakyReLU())
    model.add(Dense(3,  activation='tanh'))
   return model
discriminator_model = Model(inputs=[real_samples, generator_input_for_discriminator],
                            outputs=[discriminator_output_from_real_samples,discriminator_output_from_generator, averaged_samples_out])

discriminator_model.compile(optimizer=Adam(0.0001, beta_1=0.5, beta_2=0.9),
                            loss=[wasserstein_loss, wasserstein_loss,partial_gp_loss])