Расчет val_loss в множественном выводе Keras - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть вопрос о том, как рассчитать 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 Ответ

0 голосов
/ 04 декабря 2018

Ваше первое предположение верно, но дальнейшая деривация пошла не так, как надо.
Поскольку 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), представленные моделью, являются правильными.

...