3

我正在训练我的第一个迁移学习模型(耶!),当验证损失在 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 回调吗?类似于“如果 val_accuracy > 0.90 && val_loss 在 3 个 Epochs 中变化不超过 0.1”。如果可以的话,我可以得到一个教程的链接吗?
4

2 回答 2

2

编辑

它不起作用,因为您将callback参数放在错误的方法调用中。(事实上​​,我在拟合模型时收到了一个无效的参数错误callbackscompile因此我不确定为什么你的模型编译没有问题。)

它应该在您的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)

关于第二个问题,自定义回调是可能的,您可以参考此处文档中的示例。基本上你必须在on_epoch_end.

另一方面,我认为您不应该在多个指标上提前停止,选择一个重要的指标(即您正在优化的指标 - val_accuracy)并监控它。甚至有一些来源不鼓励提前停止,而是将 epoch 视为可调整的超参数。请参阅Reddit上的这个讨论主题,我发现它很有用。

于 2020-03-11T03:49:33.003 回答
0

减少patience=3到更少1,或者2看看会发生什么。

它告诉 Keras 你想尝试多难。耐心= 小数字会告诉 Keras 提前停止训练。另一方面,如果你使用一个很大的数字,它会告诉 Keras 等到达到相当高的准确度

耐心:产生监测量且没有改善的时期数,之后将停止训练。如果验证频率 (model.fit(validation_freq=5)) 大于 1,则可能不会为每个 epoch 生成验证数量

于 2020-03-11T00:57:29.347 回答