【问题标题】:How to stop training when it hits a specific validation accuracy?当达到特定的验证准确度时如何停止训练?
【发布时间】:2020-01-02 12:05:50
【问题描述】:

我正在训练一个卷积网络,一旦验证错误达到​​ 90%,我想停止训练。我曾考虑过使用 EarlyStopping 并将基线设置为 .90,但只要验证准确度低于给定时期数的基线(此处仅为 0),它就会停止训练。所以我的代码是:

es=EarlyStopping(monitor='val_acc',mode='auto',verbose=1,baseline=.90,patience=0)
history = model.fit(training_images, training_labels, validation_data=(test_images, test_labels), epochs=30, verbose=2,callbacks=[es])

当我使用此代码时,我的训练在第一个 epoch 后停止并给出结果:

训练 60000 个样本,验证 10000 个样本

纪元 1/30 60000/60000 - 7s - 损失:0.4600 - acc:0.8330 - val_loss:0.3426 - val_acc:0.8787

一旦验证准确率达到 90% 或以上,我还能尝试什么来停止训练?

下面是剩下的代码:

  tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
  tf.keras.layers.MaxPooling2D(2, 2),
  tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)),
  tf.keras.layers.MaxPooling2D(2, 2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(152, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer=Adam(learning_rate=0.001),loss='sparse_categorical_crossentropy', metrics=['accuracy'])
es=EarlyStopping(monitor='val_acc',mode='auto',verbose=1,baseline=.90,patience=0)
history = model.fit(training_images, training_labels, validation_data=(test_images, test_labels), epochs=30, verbose=2,callbacks=[es])

谢谢!

【问题讨论】:

  • 试试mode='max'
  • 我也试过了,结果是一样的。将模式设置为“自动”和“最大”对于验证准确性也不相同?
  • 你得到了什么结果?
  • 使用mode = 'min'

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

Early Stopping Callback 将搜索一个停止增加(或减少)的值,因此它不适合您的问题。但是tf.keras 允许您使用custom callbacks

你的例子:

class MyThresholdCallback(tf.keras.callbacks.Callback):
    def __init__(self, threshold):
        super(MyThresholdCallback, self).__init__()
        self.threshold = threshold

    def on_epoch_end(self, epoch, logs=None): 
        val_acc = logs["val_acc"]
        if val_acc >= self.threshold:
            self.model.stop_training = True

对于 TF 2.3 或更高版本,您可能必须使用 "val_accuracy" 而不是 "val_acc"。感谢 Christian Westbrook 在 cmets 中的注释。

上述回调在每个 epoch 结束时,将从所有可用日志中提取 Validation Accuracy。然后它将与用户定义的阈值(在您的情况下为 90%)进行比较。如果满足标准,训练将停止。

你可以简单地调用:

my_callback = MyThresholdCallback(threshold=0.9)
history = model.fit(training_images, training_labels, validation_data=(test_images, test_labels), epochs=30, verbose=2, callbacks=[my_callback])

或者,如果您想立即停止,可以使用def on_batch_end(...)。但是,这需要参数 batch, logs 而不是 epoch, logs

【讨论】:

  • 非常感谢!这正是我要找的!
  • 很高兴它有帮助!
  • 当我在 TensorFlow 2.3 上尝试这个自定义回调时,我在调用 logs["val_acc"] 时遇到了 KeyError,并且不得不替换那个键 "val_accuracy"。这个回调很有帮助!
【解决方案2】:

现有答案看起来不错,但我过去使用过较短的版本:

class CustomCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        if logs.get('accuracy') >= 9e-1:
            self.model.stop_training = True

你可以这样实现:

callback = CustomCallback()

history = model.fit(..., callbacks=[callback])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2019-06-09
    • 2020-07-08
    • 2020-03-29
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多