Слегка разница в результате между tf.losses.mean_squared_error() и tf.reduce_mean(tf.square())
Чтобы рассчитать среднеквадратичную ошибку, я использовал tf.reduce_mean(tf.square())
, Недавно со страницы API Tensorflow я обнаружил, что есть API для него, который tf.losses.mean_squared_error()
,
Я сравнил эти два подхода и заметил, что они дают немного разные результаты. Более конкретно, tf.reduce_mean(tf.square())
дает тот же результат, что и результат NumPy, но tf.losses.mean_squared_error()
дает немного другой результат. Ниже приведен простой код для проверки.
#!/usr/bin/python
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
def GenerateData(num_size):
x = np.linspace(0, 10, num_size)
y = 0.7 * x + 0.4
y_hat = y + np.random.normal(0.0, 2.0, num_size)
return (y, y_hat)
def main():
(y, y_hat) = GenerateData(100)
a = tf.Variable(y)
b = tf.Variable(y_hat)
mse0 = tf.reduce_mean(tf.square(a - b))
mse1 = tf.losses.mean_squared_error(a, b)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
value0 = (sess.run(mse0))
value1 = (sess.run(mse1))
print "MSE calculation using NumPy: ", (np.mean((y - y_hat) ** 2))
print "MSE calculation using tf.reduce_mean(tf.square): ", value0
print "MSE calculation using tf.losses.mean_squared_error: ", value1
print "The value difference: ", (value0 - value1)
if __name__ == "__main__":
main()
Ниже приведен результат выполнения.
MSE calculation using NumPy: 3.45982961943
MSE calculation using tf.reduce_mean(tf.square): 3.45982961943
MSE calculation using tf.losses.mean_squared_error: 3.4598296
The value difference: 5.0563521814e-08
Кто-нибудь может сказать мне, почему tf.losses.mean_squared_error()
дает немного другой результат? Для расчета MSE рекомендуется использовать этот API более tf.reduce_mean(tf.square())
?