求和两个张量时的NaN结果,这两个张量分别是实数

时间:2017-02-20 19:38:02

标签: python tensorflow nan

所以我一直在玩这个有趣的tensorflow应用程序:TensorKart

完整的源代码在这里:https://github.com/kevinhughes27/TensorKart

我在损失计算中得到NaN结果,这让我很难过。问题出在这行代码中:

loss = tf.reduce_mean(tf.square(tf.sub(model.y_, model.y))) + tf.add_n([tf.nn.l2_loss(v) for v in train_vars]) * L2NormConst

当我评估第一部分时:

tf.reduce_mean(tf.square(tf.sub(model.y_, model.y)))

我得到的值约为0.8 当我评估第二部分时:

tf.add_n([tf.nn.l2_loss(v) for v in train_vars]) * L2NormConst

我得到3.1左右的值。

但是,当我将两部分相加时,我得到了NaN?!?!

我检查了形状和类型,它们都回来了:Tensor(" Shape:0",shape =(0,),dtype = int32)

我尝试过的事情:使用tf.reduce_sum而不是tf.add_n,将它们转换为tf.float32,将它们与tf.add相加......

有没有人有任何见解?

2 个答案:

答案 0 :(得分:1)

因此,在经历了导致计算损失值的每个操作之后,我的输入数据中都有NaN值。将它们转换为零解决了在最终损失值计算中获得NaN结果的问题。

到目前为止我还没想到的是为什么我只得到了一个错误,我总结了损失值的两个部分,而不是在单独计算部件时。

非常奇怪。

答案 1 :(得分:0)

我也遇到了类似的问题。我花了一些时间才弄清楚。

您的输入之一可能包含inf-inf。在执行其他一些操作之后,将发生nan。因此,如果仅检查输入是否包含nan,那还不够。您应该检查它们是否包含inf-inf

我建议使用tf.math.is_finite检查输入是否包含inf-infnan。这是示例,

tf.reduce_any(~tf.math.is_finite(x))

其中x是您的输入。