我正在使用tf.nn.sigmoid_cross_entropy_with_logits函数来计算损失,它将返回到NaN。Tensorflow损失去NaN
我已经在使用渐变剪裁,张量分割被执行的一个地方,我已经添加了一个epsilon以防止被零除,并且所有softmax函数的参数也有一个添加到它们的epsilon。
但是,我通过培训获得了NaN的中途。
是否有任何已知的问题,张量流这样做,我错过了? 这很令人沮丧,因为在训练过程中损失会随机进入NaN并毁掉一切。
另外,我怎么可能去检测火车的步骤是否会导致NaN,并可能完全跳过这个例子?有什么建议么?
编辑:网络是一个神经图灵机。
编辑2:我已经上传了一些代码here。 它没有评论,并且对那些已经阅读Graves等人的NTM论文的人来说是最有意义的。可在这里:https://arxiv.org/abs/1410.5401
我不确定我的所有代码是否完全遵循本文作者的意图。我只是这样做的做法,我没有导师来纠正我。
编辑3:下面是梯度裁剪代码:
optimizer = tf.train.AdamOptimizer(self.lr)
gvs = optimizer.compute_gradients(loss)
capped_gvs =\
[(tf.clip_by_value(grad, -1.0, 1.0), var) if grad != None else (grad, var) for grad, var in gvs]
train_step = optimizer.apply_gradients(capped_gvs)
我不得不添加if grad != None
条件,因为我得到了一个错误,没有它。问题能在这里吗?
潜在的解决方案:我使用tf.contrib.losses.sigmoid_cross_entropy有一段时间了,到目前为止的损失并没有分歧。将测试更多并报告回来。
作为第一个想法,请尝试降低学习率。 – sygi
我使用Adam优化器进行渐变裁剪,因此不确定改变学习速度有多大帮助。我确实尝试降低了学习速度,但仍然使用了NaN。事实上,在降低比率之前,它完成了没有任何问题的训练,我认为我已经以某种方式解决了这个问题 - 但不是。 – SilverSlash
您是否曾尝试在每层之前添加非常小的高斯噪声? – broncoAbierto