Keras Sequential 模型返回损失“nan”

数据挖掘 Python 神经网络 喀拉斯 损失函数
2021-09-15 10:16:36

我正在使用 Keras 实现神经网络,但Sequential模型返回nan损失值。我在输出层有 sigmoid 激活函数,可以将输出压缩在 0 和 1 之间,但可能无法正常工作。

这是代码:

def data_generator(batch_count, training_dataset, training_dataset_labels):
  while True:
    start_range = 0
    for batch in batch_count:
      end_range = (start_range + batch[1])
      batch_dataset = training_dataset[start_range:end_range]
      batch_labels = training_dataset_labels[start_range:end_range]
      start_range = end_range
      yield batch_dataset, batch_dataset

mlp = keras.models.Sequential()

# add input layer
mlp.add(
    keras.layers.Input(
        shape = (training_dataset.shape[1], )
    )
)
# add hidden layer
mlp.add(
    keras.layers.Dense(
        units=training_dataset.shape[1] + 10,
        input_shape = (training_dataset.shape[1] + 10,),
        kernel_initializer='random_uniform',
        bias_initializer='zeros',
        activation='relu')
    )
# add output layer
mlp.add(
    keras.layers.Dense(
        units=1,
        input_shape = (1, ),
        kernel_initializer='glorot_uniform',
        bias_initializer='zeros',
        activation='sigmoid')
    )

print('Compiling model...\n')

mlp.compile(
    optimizer='adam',
    loss=listnet_loss
)

mlp.summary() # print model settings


# Training
with tf.device('/GPU:0'):
  print('Start training')
  #mlp.fit(training_dataset, training_dataset_labels, epochs=50, verbose=2, batch_size=3, workers=10)
  mlp.fit_generator(data_generator(groups_id_count, training_dataset, training_dataset_labels),
                    steps_per_epoch=len(training_dataset), epochs=50, verbose=2, workers=10, use_multiprocessing=True)

我能怎么做?

3个回答

总结stackOverflowgithub的不同解决方案,这当然取决于您的特定情况:

  • 添加正则化以向权重添加 l1 或 l2 惩罚。否则,请尝试使用较小的 l2 reg。即 l2(0.001),或者如果已经存在则删除它。
  • 尝试较小的辍学率。
  • 剪裁渐变以防止它们爆炸。例如,在 Keras 中,您可以使用 clipnorm=1。或剪辑值 = 1。作为优化器的参数。
  • 检查输入的有效性(无 NaN 或有时为 0)。即 df.isnull().any()
  • 用更易于处理的 Adam 替换优化器。有时也用 rmsprop 替换 sgd 会有所帮助。
  • 使用带有大量正则化的 RMSProp 来防止梯度爆炸。
  • 尝试规范化您的数据,或检查规范化过程中是否引入了任何错误值。
  • 验证您是否使用了正确的激活函数(例如,使用 softmax 而不是 sigmoid 进行多类分类)。
  • 尝试增加批量大小(例如,从 32 增加到 64 或 128)以增加优化的稳定性。
  • 检查最后一批的大小,这可能与批次大小不同。

这里报告了一个类似的问题:Loss being output as nan in keras RNN在那种情况下,由于值的不正确归一化,会出现梯度爆炸。

如果您通过 Google 找到此内容并使用 keras.preprocessing.sequence.pad_sequences 填充序列以训练 RNN

确保keras.preprocessing.sequence.pad_sequences()没有参数,value=Nonevalue=0.0没有在您的正常数据中出现的任何一个或其他一些数字。