具有伪输入的简单模型中具有softmax交叉熵的NaN

时间:2018-06-21 18:30:20

标签: python tensorflow cross-entropy

我正在简化模型以查看发生NaN错误的位置,并将其缩小到我的损失函数:

import tensorflow as tf
from tensorflow.python import debug as tf_debug

def train_input_fn():
  pass


def model_fn(features, labels, mode, params):

  classes = 225
  enc = tf.ones((1,20,1024), dtype=tf.float16)
  labels = tf.ones((1,20), dtype=tf.int32)

  logits = tf.layers.dense(enc, classes)
  loss = tf.reduce_sum(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels)) / 20
  train_op = tf.train.AdamOptimizer(learning_rate=0.00001, beta1=0.9, beta2=0.999).minimize(loss)

  return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)


if __name__ == '__main__':

  model_directory = path/to/logdir
  hooks = [tf_debug.LocalCLIDebugHook(ui_type="readline")]

  classifier = tf.estimator.Estimator(
      model_fn=model_fn,
      model_dir=model_directory,
      params={},
  )

  classifier.train(input_fn=lambda: train_input_fn(), hooks = hooks)

使用tensorflow调试器在新的模型目录上进行第三或第四次“运行”后,我得到“训练期间的NaN损失”。我已经尝试将学习率设置得很低,但是没有任何改变。我正在使用tensorflow-gpu 1.8。

2 个答案:

答案 0 :(得分:1)

我已经尝试了您给定的代码。从第一步开始我就正确了。

我已经检查了official documentation

logits: Unscaled log probabilities of shape [d_0, d_1, ..., d_{r-1}, num_classes] and dtype float32 or float64.

enc = tf.ones((1,20,1024), dtype=tf.float16)更改为enc = tf.ones((1,20,1024), dtype=tf.float32)并成功了!

答案 1 :(得分:0)

使用tf.float16作为Adam优化变量使得必须使用较高的epsilon值以实现数值稳定性。当我添加     epsilon = 1e-04 (标准是1e-08)到Adam优化器,对我有用。