tensorflow - tf.keras 中的 EarlyStopping 问题

标签 tensorflow keras early-stopping

我正在训练我的第一个迁移学习模型(耶!),当验证损失在超过 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 个时期内变化不超过 0.1”。如果可以的话,我可以获得教程的链接吗?

最佳答案

编辑

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

它应该在您的 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 上查看此讨论主题我发现这很有用。

关于tensorflow - tf.keras 中的 EarlyStopping 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60627667/

相关文章:

java - Tensorflow java中图像的批量分类

javascript - 使用 TensorFlow.js 对图像进行对象计数

python - 无法记录使用 Keras 构建但使用 Tensorflow 估计器训练的模型的损失

tensorflow - 归一化为 [0,1] 与 [-1,1]

python - 如何使用 Theano 在 Keras 中实现共享相同权重的 2 个相同的层分支

python-3.x - 如何实现提前停止标准 - Tensorflow Object Detection API

python - 如何从回调函数中中断Word2vec训练?

tensorflow - tensorflow 的多个标签

python - 如何在 Keras 中裁剪张量,并为每个子张量使用不同的裁剪值?

python - 使用 SKlearn 进行多标签分类 - 如何使用验证集?