2016-11-25 228 views
4

我正在使用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有一段时间了,到目前为止的损失并没有分歧。将测试更多并报告回来。

+2

作为第一个想法,请尝试降低学习率。 – sygi

+0

我使用Adam优化器进行渐变裁剪,因此不确定改变学习速度有多大帮助。我确实尝试降低了学习速度,但仍然使用了NaN。事实上,在降低比率之前,它完成了没有任何问题的训练,我认为我已经以某种方式解决了这个问题 - 但不是。 – SilverSlash

+0

您是否曾尝试在每层之前添加非常小的高斯噪声? – broncoAbierto

回答

0

使用1e-4作为学习率。 Adam似乎总是用Adam优化器为我工作。即使你渐变剪辑,它仍然可以发散。另一个偷偷摸摸的方法是取平方根,因为虽然它对于所有正输入都是稳定的,但它的梯度随着值接近零而发散。最后,我会检查并确保模型的所有输入都是合理的。

+0

图中确实存在平方根计算,但平方根计算为张量的l2范数的一部分。因此,我在使用tf.square()之前先考虑它们的平方根,甚至在平方之后我已经添加了一个epsilon以避免被零除。 – SilverSlash

+0

尝试使用tf.nn.l2_loss函数。无关紧要的是你在sqrt之前放了一些东西。它仍然会分歧。训练一段时间后,你只会发散,因为那时误差很小,sqrt的差异就会发散。 – chasep255

+0

不能使用tf.nn.l2_loss,因为它不会使用暗淡的参数。它总结张量的每个元素,我需要做一个特定的维度。 – SilverSlash