tf.keras 中的 EarlyStopping 问题
Trouble with EarlyStopping in tf.keras
我正在训练我的第一个迁移学习模型(耶!),当验证损失在超过 3 个时期内变化不超过 0.1 时,我无法让模型停止训练。
这是相关的代码块
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'],
callbacks=[early_stopping])
EPOCHS = 100
history = model.fit(training_batches,
epochs=EPOCHS,
validation_data=validation_batches)
下面是一些日志:
Epoch 32/100
155/155 [==============================] - 21s 134ms/step - loss: 0.0042 - accuracy: 0.9998 - val_loss: 0.3407 - val_accuracy: 0.9012
Epoch 33/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0040 - accuracy: 0.9998 - val_loss: 0.3443 - val_accuracy: 0.9000
Epoch 34/100
155/155 [==============================] - 21s 134ms/step - loss: 0.0037 - accuracy: 0.9998 - val_loss: 0.3393 - val_accuracy: 0.9019
Epoch 35/100
155/155 [==============================] - 21s 135ms/step - loss: 0.0031 - accuracy: 1.0000 - val_loss: 0.3396 - val_accuracy: 0.9000
Epoch 36/100
155/155 [==============================] - 21s 134ms/step - loss: 0.0028 - accuracy: 1.0000 - val_loss: 0.3390 - val_accuracy: 0.9000
Epoch 37/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9025
Epoch 38/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.8994
Epoch 39/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0022 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9019
问题:
- 当我将 EarlyStopping 回调设置为监控 val_loss 时,为什么训练没有在 Epoch 37 停止?
- 我可以执行更复杂的 EarlyStopping 回调吗?类似于 "If val_accuracy > 0.90 && val_loss hasn't changed by more than 0.1 in 3 Epochs" 的内容。如果可以的话,我可以得到 link 教程吗?
减少 patience=3
以减少 e。 G。 1
或 2
看看会发生什么。
它告诉 Keras 你想尝试多努力。 patience= small number 会告诉 Keras 提前停止训练。另一方面,如果你使用一个大数字,它会告诉 Keras 等待,直到达到相当大的准确度
patience:产生监控数量但没有改善的 epoch 数,之后训练将停止。如果验证频率 (model.fit(validation_freq=5)) 大于一个
,则可能不会为每个 epoch 生成验证数量
编辑
它不起作用,因为您将 callback
参数放在了错误的方法调用中。 (事实上 ,我在使用 callbacks
传递给 compile
拟合模型时收到无效参数错误。因此我不确定为什么你的模型编译没有问题。)
它应该在您的 fit
方法中,如下所示。请注意,建议在您的早停配置中设置verbose = 1
,以便打印出早停日志。
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1, verbose = 1)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
EPOCHS = 100
history = model.fit(training_batches,
epochs=EPOCHS,
callbacks=[early_stopping], # call back should be here!
validation_data=validation_batches)
关于你的第二个问题,自定义回调是可以的,你可以参考文档中的例子here。基本上你必须在 on_epoch_end
.
中定义你的提前停止逻辑
附带说明一下,我认为您不应该提前停止多个指标,选择一个重要的指标(即您正在优化的指标 - val_accuracy
)并对其进行监控。甚至有一些来源不鼓励提前停止,而是将 epoch 视为可调超参数。请参阅 Reddit 上的这个讨论帖,我发现它很有用。
我正在训练我的第一个迁移学习模型(耶!),当验证损失在超过 3 个时期内变化不超过 0.1 时,我无法让模型停止训练。
这是相关的代码块
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'],
callbacks=[early_stopping])
EPOCHS = 100
history = model.fit(training_batches,
epochs=EPOCHS,
validation_data=validation_batches)
下面是一些日志:
Epoch 32/100
155/155 [==============================] - 21s 134ms/step - loss: 0.0042 - accuracy: 0.9998 - val_loss: 0.3407 - val_accuracy: 0.9012
Epoch 33/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0040 - accuracy: 0.9998 - val_loss: 0.3443 - val_accuracy: 0.9000
Epoch 34/100
155/155 [==============================] - 21s 134ms/step - loss: 0.0037 - accuracy: 0.9998 - val_loss: 0.3393 - val_accuracy: 0.9019
Epoch 35/100
155/155 [==============================] - 21s 135ms/step - loss: 0.0031 - accuracy: 1.0000 - val_loss: 0.3396 - val_accuracy: 0.9000
Epoch 36/100
155/155 [==============================] - 21s 134ms/step - loss: 0.0028 - accuracy: 1.0000 - val_loss: 0.3390 - val_accuracy: 0.9000
Epoch 37/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9025
Epoch 38/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.8994
Epoch 39/100
155/155 [==============================] - 21s 133ms/step - loss: 0.0022 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9019
问题:
- 当我将 EarlyStopping 回调设置为监控 val_loss 时,为什么训练没有在 Epoch 37 停止?
- 我可以执行更复杂的 EarlyStopping 回调吗?类似于 "If val_accuracy > 0.90 && val_loss hasn't changed by more than 0.1 in 3 Epochs" 的内容。如果可以的话,我可以得到 link 教程吗?
减少 patience=3
以减少 e。 G。 1
或 2
看看会发生什么。
它告诉 Keras 你想尝试多努力。 patience= small number 会告诉 Keras 提前停止训练。另一方面,如果你使用一个大数字,它会告诉 Keras 等待,直到达到相当大的准确度
patience:产生监控数量但没有改善的 epoch 数,之后训练将停止。如果验证频率 (model.fit(validation_freq=5)) 大于一个
,则可能不会为每个 epoch 生成验证数量编辑
它不起作用,因为您将 callback
参数放在了错误的方法调用中。 (事实上 ,我在使用 callbacks
传递给 compile
拟合模型时收到无效参数错误。因此我不确定为什么你的模型编译没有问题。)
它应该在您的 fit
方法中,如下所示。请注意,建议在您的早停配置中设置verbose = 1
,以便打印出早停日志。
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1, verbose = 1)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
EPOCHS = 100
history = model.fit(training_batches,
epochs=EPOCHS,
callbacks=[early_stopping], # call back should be here!
validation_data=validation_batches)
关于你的第二个问题,自定义回调是可以的,你可以参考文档中的例子here。基本上你必须在 on_epoch_end
.
附带说明一下,我认为您不应该提前停止多个指标,选择一个重要的指标(即您正在优化的指标 - val_accuracy
)并对其进行监控。甚至有一些来源不鼓励提前停止,而是将 epoch 视为可调超参数。请参阅 Reddit 上的这个讨论帖,我发现它很有用。