【问题标题】:Calculation of val_loss in Keras' multiple outputKeras 多重输出中 val_loss 的计算
【发布时间】:2019-05-05 13:45:58
【问题描述】:

我有一个关于如何在 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。 根据预测结果计算出的 RMSE 为 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 规范的理解不正确吗?

【问题讨论】:

    标签: python keras deep-learning loss-function multipleoutputs


    【解决方案1】:

    您的第一个假设是正确的,但进一步的推导有点错误。
    因为 MSE 是模型输出平方误差的平均值,正如您在 Keras 中看到的 documentation

    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)值是正确的。

    【讨论】:

    • 非常感谢您的善意建议。现在一切都清楚了。在我的模型中,输出不是一个标量而是一个 24 维向量,所以我认为它会在 Keras 中被处理为 24 个多重输出。我认为 rmse1, rmse2..rmse23 将为每个输出 y1, y2 ... y23 计算,而 val_loss 是它们的总和(= rmse1 + rmse2 .. rmse23)。但感谢您的建议,我注意到它被视为单个输出。
    • @shamada 不客气!如果您认为我的回答正确,请接受我的回答,如果有用请点赞。
    猜你喜欢
    • 2020-01-14
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多