Расчет val_loss в множественном выводе Keras
У меня есть вопрос о том, как рассчитать val_loss в нескольких выходных Keras. Вот выдержка из моего кода.
nBatchSize = 200
nTimeSteps = 1
nInDims = 17
nHiddenDims = 10
nFinalDims = 10
nOutNum = 24
nTraLen = 300
nMaxEP = 20
nValLen = 50
sHisCSV = "history.csv"
oModel = Sequential()
oModel.add(Input(batch_input_shape=(nBatchSize, nTimeSteps, nInDims)))
oModel.add(LSTM(nHiddenDims, return_sequences=True, stateful=True))
oModel.add(LSTM(nHiddenDims, return_sequences=False, stateful=True))
oModel.add(Dense(nFinalDims, activation="relu")
oModel.add(Dense(nOutNum, activation="linear")
oModel.compile(loss="mse", optimizer=Nadam())
oModel.reset_states()
oHis = oModel.fit_generator(oDataGen, steps_per_epoch=nTraLen,
epochs=nMaxEP, shuffle=False,
validation_data=oDataGen, validation_steps=nValLen,
callbacks=[CSVLogger(sHisCSV, append=True)])
# number of cols is nOutNum(=24), number of rows is len(oEvaGen)
oPredDF = pd.DataFrame(oPredModel.predict_generator(oEvaGen, steps=len(oEvaGen))
# GTDF is a dataframe of Ground Truth
nRMSE = np.sqrt(np.nanmean(np.array(np.power(oPredDF - oGTDF, 2))))
В history.csv значение val_loss записывается как 3317.36. Среднеквадратичное отклонение, рассчитанное по результату прогноза, составляет 66,4
По моему пониманию спецификации Keras, val_loss, записанный в history.csv, является средним MSE из 24 выходов. Предполагая, что это правильно, RMSE можно вычислить как 11.76 (= sqrt(3317.36/24)) из history.csv, что довольно сильно отличается от значения nRMSE (=66.4) Так же, как sqrt(3317.36) = 57.6 довольно близко к Это.
Мое понимание спецификации Keras для val_loss неверно?
1 ответ
Ваше первое предположение верно, но дальнейшие выводы немного пошли не так.
Поскольку MSE является средним квадратом ошибок выходных данных модели, как вы можете видеть в документации Keras:
mean_squared_error
keras.losses.mean_squared_error (y_true, y_pred)
и в исходном коде Keras:
K.mean(K.square(y_pred - y_true), axis=-1)
таким образом, RMSE является квадратным корнем этого значения:
K.sqrt(K.mean(K.square(y_pred - y_true), axis=-1))
То, что вы написали, будет корневым квадратом квадратной ошибки, т. Е. RSE.
Итак, из вашего реального примера:
RSE может быть вычислено как sqrt(3317.36/24) = 11.76
RMSE можно рассчитать как sqrt(3317.36) = 57.6
Таким образом, значения RMSE (и nRMSE), представленные моделью, являются правильными.