计算 Keras 多重输出中的val_loss



我有一个关于如何在Keras的多重输出中计算val_loss的问题。这是我的代码摘录。

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编写的是24个输出的平均MSE。假设它是正确的,RMSE可以根据history.csv计算为11.76(=sqrt(3317.36/24((,这与nRMSE的值(=66.4(大不相同正如sqrt(3317.36(=57.6相当接近它一样。

我对val_loss上Keras规范的理解是否不正确?

您的第一个假设是正确的,但进一步的推导有点错误
由于MSE是模型输出的平方误差的平均值,如您在Keras文档中所见:

mean_squared_error
keras.eloss.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(值是正确的。

相关内容

  • 没有找到相关文章

最新更新