在 keras 中训练 LSTM 模型时,损失值到底给出了啥?

Posted

技术标签:

【中文标题】在 keras 中训练 LSTM 模型时,损失值到底给出了啥?【英文标题】:What exactly does the loss value give while training a LSTM model in keras?在 keras 中训练 LSTM 模型时,损失值到底给出了什么? 【发布时间】:2021-01-16 04:30:57 【问题描述】:

我有一个 LSTM 模型,它根据今天的出水量、温度和降水量来预测明天的出水量。

model = Sequential()
model.add(LSTM(units=24, return_sequences=True, 
           input_shape=(X_Train.shape[1],X_Train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(20, activation='relu'))
model.add(Dense(1, activation='linear'))
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
history = model.fit(X_Train, Y_Train, epochs=8,
               validation_data=(X_Test, Y_Test))

While training I got:

Epoch 1/8
4638/4638 [==============================] - 78s 17ms/step - loss: 
1.9951e-04 - val_loss: 1.5074e-04
Epoch 2/8
4638/4638 [==============================] - 77s 17ms/step - loss: 
9.6735e-05 - val_loss: 1.0922e-04
Epoch 3/8
4638/4638 [==============================] - 78s 17ms/step - loss: 
6.5202e-05 - val_loss: 5.9079e-05
Epoch 4/8
4638/4638 [==============================] - 77s 17ms/step - loss: 
5.1011e-05 - val_loss: 4.9478e-05
Epoch 5/8
4638/4638 [==============================] - 77s 17ms/step - loss: 
4.3992e-05 - val_loss: 5.1148e-05
Epoch 6/8
4638/4638 [==============================] - 77s 17ms/step - loss: 
3.9901e-05 - val_loss: 4.2351e-05
Epoch 7/8
4638/4638 [==============================] - 74s 16ms/step - loss: 
3.6884e-05 - val_loss: 4.0763e-05
Epoch 8/8
4638/4638 [==============================] - 74s 16ms/step - loss: 
3.5287e-05 - val_loss: 3.6736e-05

但是当我手动计算均方误差时,我得到了不同的结果

mean_square_root = mean_squared_error(predicted_y_values_unnor, Y_test_actual)
130.755469707972

Manual Calculation:

我想知道为什么训练时验证损失与手动计算时不同。训练时的损失如何计算?

【问题讨论】:

你是怎么得到predicted_y_values_unnor的? 在深度学习中,通常会给出归一化的输入(mean=0 和 std-dev=1)。这就是为什么损失数字非常小。 我现在明白了。我将归一化损失与我的非归一化均方误差进行比较。 太棒了。很高兴能帮助你。请接受答案,以便我们能够帮助社区中的其他人。 【参考方案1】:

你选择的loss是行中的mean_squared_error

model.compile(optimizer = 'adam', loss = 'mean_squared_error')

这是你的 LSTM 模型最小化的损失。

均方误差或 MSE 损失是用于回归问题的默认损失。均方误差计算为预测值和实际值之间的平方差的平均值。无论预测值和实际值的符号如何,结果始终为正,完美值为 0.0。平方意味着较大的错误比较小的错误导致更多的错误,这意味着模型因犯了较大的错误而受到惩罚。

LSTM 是一个通用模型,您可以选择许多不同的损失函数。这是 keras 内置的可用功能列表 https://keras.io/api/losses/ 您需要根据您的问题选择损失函数。

【讨论】:

我使用测试数据上的 sklean mean_squared_error 函数计算了预测值和实际值之间的平方差的平均值。它与训练时的验证损失有很大不同。训练时的验证损失在 10^-5 的范围内,而使用 sklearn 计算均方误差的值为 130.75。我在比较两个不同的东西吗?

以上是关于在 keras 中训练 LSTM 模型时,损失值到底给出了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Keras LSTM 模型过拟合

如何为 LSTM 实现 Keras 自定义损失函数

Python Keras LSTM 学习在高损失时收敛过快

LSTM 模型中 epoch 图中的损失跳跃 - keras

使用Tensorflow后端的Keras LSTM RNN中令人费解的训练损失与纪元...行为的任何原因

验证准确度为零,损失更高。使用 LSTM 进行意图分类