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

问题描述 投票:0回答:1

所以我不知道我的代码中是否存在错误或问题,但我正在努力了解正在发生的事情。当我运行模型并使用平均相对误差估计精度时。我知道在我的验证数据中我有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的文档,第一个案例没有意义。

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

python tensorflow neural-network
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.