即使未达到min_delta条件,Keras模型也会提前停止



我正在训练一个Keras序列模型,如下所示。它适用于5个数字的mnist数据集。28x28图像被压平后,它们所属类别的一个热门符号出现了。

model = keras.Sequential([
keras.layers.InputLayer(input_shape = (784, )),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dense(15, activation='relu'),
keras.layers.Dense(3, activation='relu'),
keras.layers.Dense(5, activation='softmax')
])
optzr = keras.optimizers.SGD(learning_rate=0.001, momentum=0.0, nesterov=False)
es = keras.callbacks.EarlyStopping(monitor='loss', min_delta=0.0001, verbose=2)
model.compile(optimizer=optzr, loss='categorical_crossentropy', metrics=['accuracy'])
out = model.fit(xtrain, ytrain, validation_data=(xval, yval), batch_size=32, verbose=2, epochs=20, callbacks=[es])

在运行模型时,这就是的输出

Epoch 1/20
356/356 - 2s - loss: 1.7157 - accuracy: 0.1894 - val_loss: 1.6104 - val_accuracy: 0.1997 - 2s/epoch - 5ms/step
Epoch 2/20
356/356 - 1s - loss: 1.6094 - accuracy: 0.1946 - val_loss: 1.6102 - val_accuracy: 0.1997 - 1s/epoch - 3ms/step
Epoch 00002: early stopping

在这里,尽管损失减少了0.1以上,但该模型宣布满足提前停止的条件,并停止训练。

您应该在回调定义中将patience设置为1。如果没有,则默认为0

es = keras.callbacks.EarlyStopping(monitor='loss', min_delta=1e-4, verbose=2, patience=1)
Keras通过保留一个名为wait的内部变量来实现EarlyStoping。如果性能没有提高min_delta,则该变量每历元增加一个,否则重置为0。如果wait大于或等于patience,则停止训练。
# Only check after the first epoch.
if self.wait >= self.patience and epoch > 0:
self.stopped_epoch = epoch
self.model.stop_training = True

由于patience默认为0,所以一旦第一个历元过去(一旦epoch > 0(,self.wait >= self.patience总是True

要在性能停止改善时立即停止,实际上需要将patience设置为1,而不是0

相关内容

  • 没有找到相关文章

最新更新