我使用tf.nn.sigmoid_cross_entropy_with_logits函数进行损失,然后进入NaN。
我已经使用了渐变剪辑,一个执行张量除法的地方,我添加了一个epsilon来防止除零,并且所有softmax函数的参数都添加了一个epsilon
然而,我通过培训获得了NaN的中途。
是否有任何已知的问题,其中tensorflow会这样做,我错过了? 这很令人沮丧,因为在训练期间损失是随机进入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一段时间了,到目前为止,损失并没有发生。将测试更多并报告回来。
答案 0 :(得分:1)
我知道自从被问到已经有一段时间了,但是除了剪辑之外,我想添加另一个对我有帮助的解决方案。我发现,如果增加批量大小,则损失趋向于不接近0,并且最终还没有达到NaN。希望这对找到这个的人有所帮助!
答案 1 :(得分:0)
使用1e-4学习率。对于我来说,这个似乎总是适用于Adam优化器。即使你是渐变剪辑,它仍然可以发散。另一个偷偷摸摸的是采用平方根,因为虽然它对于所有正输入都是稳定的,但随着该值接近零,其梯度会发散。最后,我会检查并确保模型的所有输入都是合理的。
答案 2 :(得分:0)
在我的情况下,NaN值是训练数据集中NaN的结果,而当我在使用多类分类器时,问题是[one hot encoding]标签上的数据帧位置过滤器。
解决目标数据集可以解决我的问题-希望这对其他人有所帮助。 祝你好运。