Keras 与 Adam 的训练过早停止
Keras training with Adam stops prematurely
我第一次使用 Keras 解决回归问题。我已经设置了一个提前停止回调,以 patience=3 监控 val_loss(均方误差)。然而,即使 val_loss 在最后几个时期减少,训练也会停止。要么我的代码中有错误,要么我没能理解回调的真正含义。任何人都可以理解发生了什么吗?我在下面提供训练进度和模型构建代码。
如下所示,训练在第 8 轮停止,但 val_loss 自第 6 轮以来一直在下降,我认为它应该继续 运行。只有一次 val_loss 增加(从第 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])
在尝试了一些超参数(例如激活函数)之后,我仍然遇到同样的问题。不过,它并不总是停在第 8 个时期。我也试过改变耐心
详情:
Ubuntu 18.04
张量流 2.6.0
Python3.8.5
您误解了 Keras 对改进的定义。您是正确的,因为 val_loss
在第 7 和第 8 个时期减少,仅在第 6 个时期增加。但您缺少的是第 7 和第 8 时期的改进并没有提高第 5 个时期的当前最佳值(7599179.0000 ).当前的最佳损失值出现在第 5 个时期,您的回调等待 3 个时期以查看是否有任何东西可以击败它,而不是在这 3 个时期内是否会有改进。在第 8 个时期,当损失没有低于第 5 个时期时,回调终止了训练。
我第一次使用 Keras 解决回归问题。我已经设置了一个提前停止回调,以 patience=3 监控 val_loss(均方误差)。然而,即使 val_loss 在最后几个时期减少,训练也会停止。要么我的代码中有错误,要么我没能理解回调的真正含义。任何人都可以理解发生了什么吗?我在下面提供训练进度和模型构建代码。
如下所示,训练在第 8 轮停止,但 val_loss 自第 6 轮以来一直在下降,我认为它应该继续 运行。只有一次 val_loss 增加(从第 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])
在尝试了一些超参数(例如激活函数)之后,我仍然遇到同样的问题。不过,它并不总是停在第 8 个时期。我也试过改变耐心
详情: Ubuntu 18.04 张量流 2.6.0 Python3.8.5
您误解了 Keras 对改进的定义。您是正确的,因为 val_loss
在第 7 和第 8 个时期减少,仅在第 6 个时期增加。但您缺少的是第 7 和第 8 时期的改进并没有提高第 5 个时期的当前最佳值(7599179.0000 ).当前的最佳损失值出现在第 5 个时期,您的回调等待 3 个时期以查看是否有任何东西可以击败它,而不是在这 3 个时期内是否会有改进。在第 8 个时期,当损失没有低于第 5 个时期时,回调终止了训练。