Слегка разница в результате между 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())?

0 ответов

Другие вопросы по тегам