对两个均为实数的张量求和时的 NaN 结果
NaN result when summing two tensors which individually are both real numbers
所以我一直在玩这个有趣的 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 对它们求和...
有没有人有任何见解?
因此,在完成计算损失值之前的所有操作后,我的输入数据中出现了 NaN 值。将它们转换为零解决了在最终损失值计算中得到 NaN 结果的问题。
直到现在我还没有弄清楚为什么我只在对损失值的两个部分求和而不是在单独计算部分时出错。
非常奇怪。
我也遇到了类似的问题。我花了一些时间才弄明白。
一种可能是您的输入之一包含 inf
或 -inf
。在一些其他操作之后, nan
发生。所以如果你只检查输入是否包含 nan
,那是不够的。您应该检查它们是否包含 inf
或 -inf
.
我建议使用 tf.math.is_finite
检查输入是否包含 inf
、-inf
和 nan
。这是例子,
tf.reduce_any(~tf.math.is_finite(x))
其中 x
是您的输入。
所以我一直在玩这个有趣的 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 对它们求和...
有没有人有任何见解?
因此,在完成计算损失值之前的所有操作后,我的输入数据中出现了 NaN 值。将它们转换为零解决了在最终损失值计算中得到 NaN 结果的问题。
直到现在我还没有弄清楚为什么我只在对损失值的两个部分求和而不是在单独计算部分时出错。
非常奇怪。
我也遇到了类似的问题。我花了一些时间才弄明白。
一种可能是您的输入之一包含 inf
或 -inf
。在一些其他操作之后, nan
发生。所以如果你只检查输入是否包含 nan
,那是不够的。您应该检查它们是否包含 inf
或 -inf
.
我建议使用 tf.math.is_finite
检查输入是否包含 inf
、-inf
和 nan
。这是例子,
tf.reduce_any(~tf.math.is_finite(x))
其中 x
是您的输入。