0

我第一次在回归问题上使用 Keras。我设置了一个提前停止回调,以耐性=3 监控 val_loss(均方误差)。然而,即使 val_loss 在最后几个 epoch 中减少,训练也会停止。要么我的代码中存在错误,要么我无法理解回调的真正含义。谁能明白发生了什么?我在下面提供训练进度和模型构建代码。

如下所示,训练在 epoch 8 停止,但 val_loss 自 epoch 6 以来一直在下降,我认为它应该继续运行。只有一次 val_loss 增加(从 epoch 5 到 6),耐心为 3。

Epoch 1/100
35849/35849 - 73s - loss: 11317667.0000 - val_loss: 7676812.0000
Epoch 2/100
35849/35849 - 71s - loss: 11095449.0000 - val_loss: 7635795.0000
Epoch 3/100
35849/35849 - 71s - loss: 11039211.0000 - val_loss: 7627178.5000
Epoch 4/100
35849/35849 - 71s - loss: 10997918.0000 - val_loss: 7602583.5000
Epoch 5/100
35849/35849 - 65s - loss: 10955304.0000 - val_loss: 7599179.0000
Epoch 6/100
35849/35849 - 59s - loss: 10914252.0000 - val_loss: 7615204.0000
Epoch 7/100
35849/35849 - 59s - loss: 10871920.0000 - val_loss: 7612452.0000
Epoch 8/100
35849/35849 - 59s - loss: 10827388.0000 - val_loss: 7603128.5000

模型构建如下:

from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
from keras import initializers

# create model
model = Sequential()
model.add(Dense(len(predictors), input_dim=len(predictors), activation='relu',name='input',
                kernel_initializer=initializers.he_uniform(seed=seed_value)))
model.add(Dense(155, activation='relu',name='hidden1',
                kernel_initializer=initializers.he_uniform(seed=seed_value)))
model.add(Dense(1, activation='linear',name='output',
                kernel_initializer=initializers.he_uniform(seed=seed_value)))
callback = EarlyStopping(monitor='val_loss', patience=3,restore_best_weights=True)

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

# Fit the model
history = model.fit(X,y, validation_split=0.2, epochs=100, 
           batch_size=50,verbose=2,callbacks=[callback])

在尝试了一些超参数(例如激活函数)后,我一直遇到同样的问题。不过,它并不总是在 epoch 8 停止。我也尝试改变耐心。

详细信息:Ubuntu 18.04 Tensorflow 2.6.0 Python 3.8.5

4

1 回答 1

2

您误解了 Keras 如何定义改进。您是正确的,因为第val_loss7 和第 8 时期的下降而仅在第 6 时期有所增加。但您缺少的是,第 7 和第 8 时期的改进并没有提高第 5 时期的当前最佳值(7599179.0000)。当前的最佳损失值发生在第 5 个时期,您的回调等待 3 个时期以查看是否有任何东西可以击败它,而不是在这 3 个时期内是否会有所改善。在第 8 个时期,当损失没有低于第 5 个时期时,回调终止了训练。

于 2021-08-17T15:06:45.707 回答