我有一个关于如何计算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))))
在历史.csv,价值损失被写为3317.36。 由预测结果计算出的RMSE为66.4。在
根据我的理解,我的Keras规范历史.csv 是24个输出的平均均方误差。 假设它是正确的,RMSE可以计算为11.76(=sqrt(3317.36/24)),从历史.csv, 这与nRMSE的值(=66.4)大不相同 正如sqrt(3317.36)=57.6相当接近。在
我对Keras关于val_损失的规范的理解是否不正确?在
您的第一个假设是正确的,但进一步的推导有点出错。
由于MSE是模型输出平方误差的平均值,正如您在Kerasdocumentation中看到的:
在Keras源代码中:
因此,RMSE是该值的平方根:
^{pr2}$你写的是平方误差的平方根,即RSE。在
从你的实际例子来看:
RSE可以计算为
sqrt(3317.36/24) = 11.76
RMSE可以计算为
sqrt(3317.36) = 57.6
因此,模型提供的RMSE(和nRMSE)值是正确的。在
相关问题 更多 >
编程相关推荐