我第一次在回归问题上使用 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