在tf.metrics.mean_absolute_error中除以0时,tensorflow的奇怪行为

时间:2018-01-26 09:18:37

标签: python tensorflow neural-network

所以我不知道我的代码中是否存在错误或问题,但我正在尝试了解发生了什么。 当我运行模型并使用平均相对误差估计精度时。我知道在我的验证数据中我有0,所以我期待得到一些错误或一些inf。然而,这种情况并非如此。 这是我的代码:

X_test_norm = preprocessing.scale(X_test)
predictions = sess.run(pred, feed_dict={x: X_test_norm})
prediction = tf.convert_to_tensor(predictions)
expectation = tf.cast(Y_test, tf.float32)

MANUAL_MRE = tf.reduce_mean(tf.abs((Y_test - tf.transpose(predictions)) / Y_test))
MAE_op, MAE = tf.metrics.mean_absolute_error(expectation, prediction)
MRE_op, MRE = tf.metrics.mean_relative_error(expectation, prediction, expectation)
tf.local_variables_initializer().run()

print("MANUAL_MRE: %4f" % sess.run(MANUAL_MRE))
print("MRE: %4f" % sess.run(MRE))
print("MAE: %4f" % sess.run(MAE))

这是输出:

MANUAL_MRE:  inf

MRE: 1.603528

MAE: 76.489990

当我在值大于0的数据上运行时,我的MANUAL_MRE和MRE值应该是相同的。我检查了TF的文档,第一个案例没有意义。

有人可以告诉我哪里错了,或者我发现了一个错误/新功能。

1 个答案:

答案 0 :(得分:0)

我想我知道发生了什么,因为MRE是每个平均相对误差的平均值,因此我认为tf.metrics.mean_relative_error只是添加了类似于完全与预测不匹配的值。我相信这就是为什么当我用数据集计算MRE时我知道它具有负值,因为标签给了我如此高的MRE值。

你可以从下面的代码中了解更好的原因:

MANUAL_MRE = tf.reduce_mean(tf.abs((Y_test + 100) - (tf.transpose(predictions) + 100)) / (Y_test + 100))
MANUAL_TF_MRE = tf.reduce_mean(tf.divide(tf.abs(Y_test - tf.transpose(predictions)), Y_test))
MRE_op, MRE = tf.metrics.mean_relative_error(exp, predTF, exp)
tf.initialize_local_variables().run()

print("MANUAL_TF_MRE: %4f" % sess.run(MANUAL_TF_MRE))
print("MANUAL_MRE: %4f" % sess.run(MANUAL_MRE))
print("MRE: %4f" % sess.run(MRE))

MANUAL_TF_MRE:  inf
MANUAL_MRE: 0.084013
MRE: 4.255613