Пользовательский RMSE - это не то же самое, что взять корень встроенного Keras MSE для того же прогноза. - PullRequest
3 голосов
/ 27 сентября 2019

Я определил пользовательскую функцию RMSE:

def rmse(y_pred, y_true):
    return K.sqrt(K.mean(K.square(y_pred - y_true)))

Я сравнивал ее со среднеквадратичной ошибкой, предоставленной Keras:

keras.losses.mean_squared_error(y_true, y_pred)

ЗначенияЯ получаю метрики MSE и RMSE соответственно для некоторых (одинаковых) прогнозов:

mse: 115.7218 - rmse: 8.0966

Теперь, когда я беру корень MSE, я получаю 10.7574, чтоочевидно выше, чем RMSE, который выводит пользовательская функция RMSE.Я не смог выяснить, почему это так, и я не нашел связанных сообщений на эту конкретную тему.Может быть, в функции RMSE есть ошибка, которую я просто не вижу?Или это как-то связано с тем, как Керас определяет axis=-1 в функции MSE (цель, которую я еще не полностью понял)?

Вот где я вызываю RMSE и MSE:

model.compile(loss="mae", optimizer="adam", metrics=["mse", rmse])

Так что я ожидаю, что корень MSE будет таким же, как RMSE.

Первоначально я задавал этот вопрос на Cross Validated, но он был отложен как не по теме.

1 Ответ

1 голос
/ 27 сентября 2019

Возможно, есть ошибка в функции потерь RMSE, которую я просто не вижу?Или это как-то связано с тем, как Keras определяет ось = -1 в функции потерь MSE (цель, которую я еще не полностью понял)?

Когда Keras выполняет расчет потерь, размер партиисохраняется, что является причиной axis=-1.Возвращаемое значение является тензором.Это связано с тем, что потери для каждого образца , возможно, должны быть взвешены, прежде чем брать среднее значение, в зависимости от того, переданы ли определенные аргументы в методе fit(), например sample_weight.

.одинаковые результаты с обоими подходами.

from tensorflow import keras
import numpy as np
from keras import backend as K

def rmse(y_pred, y_true):
    return K.sqrt(K.mean(K.square(y_pred - y_true)))

l1 = keras.layers.Input(shape=(32))
l2 = keras.layers.Dense(10)(l1)
model = keras.Model(inputs=l1, outputs=l2)

train_examples = np.random.randn(5,32)
train_labels=np.random.randn(5,10)

подход MSE

model.compile(loss='mse', optimizer='adam')
model.evaluate(train_examples, train_labels)

RMSE подход

model.compile(loss=rmse, optimizer='adam')
model.evaluate(train_examples, train_labels)

Выход

5/5 [==============================] - 0s 8ms/sample - loss: 1.9011
5/5 [==============================] - 0s 2ms/sample - loss: 1.3788

sqrt (1.9011) = 1.3788

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...