【问题标题】:Keras early stopping callback error, val_loss metric not availableKeras 提前停止回调错误,val_loss 指标不可用
【发布时间】:2018-08-08 15:58:48
【问题描述】:

我正在训练一个 Keras(Tensorflow 后端,Python,在 MacBook 上)并且在 fit_generator 函数的早期停止回调中遇到错误。错误如下:

RuntimeWarning: Early stopping conditioned on metric `val_loss` which is not available. Available metrics are:
  (self.monitor, ','.join(list(logs.keys()))),
RuntimeWarning: Can save best model only with val_acc available, skipping.

'skipping.' % (self.monitor), RuntimeWarning
[local-dir]/lib/python3.6/site-packages/keras/callbacks.py:497: RuntimeWarning: Early stopping conditioned on metric `val_loss` which is not available. Available metrics are:
  (self.monitor, ','.join(list(logs.keys()))), RuntimeWarning
[local-dir]/lib/python3.6/site-packages/keras/callbacks.py:406: RuntimeWarning: Can save best model only with val_acc available, skipping.
  'skipping.' % (self.monitor), RuntimeWarning)
Traceback (most recent call last):
  :
  [my-code]
  :
  File "[local-dir]/lib/python3.6/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
  File "[local-dir]/lib/python3.6/site-packages/keras/engine/training.py", line 2213, in fit_generator
callbacks.on_epoch_end(epoch, epoch_logs)
  File "[local-dir]/lib/python3.6/site-packages/keras/callbacks.py", line 76, in on_epoch_end
callback.on_epoch_end(epoch, logs)
  File "[local-dir]/lib/python3.6/site-packages/keras/callbacks.py", line 310, in on_epoch_end
self.progbar.update(self.seen, self.log_values, force=True)
AttributeError: 'ProgbarLogger' object has no attribute 'log_values'

我的代码如下(看起来没问题):

:
ES = EarlyStopping(monitor="val_loss", min_delta=0.001, patience=3, mode="min", verbose=1)
:
self.model.fit_generator(
        generator        = train_batch,
        validation_data  = valid_batch,
        validation_steps = validation_steps,
        steps_per_epoch  = steps_per_epoch,
        epochs           = epochs,
        callbacks        = [ES],
        verbose          = 1,
        workers          = 3,
        max_queue_size   = 8)

错误消息似乎与提前停止回调有关,但回调看起来正常。该错误还指出 val_loss 不合适,但我不知道为什么...关于此的另一件不寻常的事情是,该错误仅在我使用较小的数据集时发生。

感谢任何帮助。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    在导入依赖项时尽量避免使用 tf.keras。当我直接使用 Keras(例如,导入图层和回调)时,它对我有用。

    【讨论】:

      【解决方案2】:

      使用tf.compat.v1.disable_eager_execution() 将解决问题。尝试 validation_freq = 1 也是一个好主意。但是,您必须等待每个 epoch 的脚本终端输出完成 因此,我建议通过 tensorboard、weight&bias 等来观察结果...

      【讨论】:

        【解决方案3】:

        我的问题是我用参数“val_acc”调用了这些回调。 正确的参数是“val_accuracy”。

        这个解决方案出现在我的错误消息中:“Available metrics are: ...”

        【讨论】:

        • 感谢这为我解决了问题
        【解决方案4】:

        我使用 fit_generator 收到此错误消息。在第一个 epoch 完成后出现错误。

        问题是我在 fit_generator 参数中设置了 validation_freq=20。

        Keras 在第一个 epoch 结束时执行回调列表,但直到 epoch 20 之后它才真正计算 val_loss,因此 val_loss (还)不可用。

        设置 validation_freq=1 解决了这个问题。

        【讨论】:

        • 设置 validation_freq=1 fixed the problem. 并且什么都不做可以解决这个问题?
        • 嗨,Nelles,是的,对我来说,它确实解决了问题。对于大多数人来说,根本原因比较复杂,所以对于大多数人来说,它并不能解决问题。正如您从其他答案中看到的那样,症状“val-loss metric not available”可能以不同的方式引起。如果 fit_generator 的 validation_freq > 1,并且在第一个 epoch 之后出现错误消息,那么值得一试。
        【解决方案5】:

        我也收到了这个警告。它出现在[切换到 Keras 2.2.4 的 master 分支以启用 validation_freq 功能][1]:

        //anaconda3/lib/python3.7/site-packages/keras/callbacks/callbacks.py:846: RuntimeWarning: Early stopping conditioned on metric `val_loss` which is not available. Available metrics are: loss,accuracy
          (self.monitor, ','.join(list(logs.keys()))), RuntimeWarning
        

        然而,尽管有警告,提前停止val_loss 仍然有效(至少对我而言)。例如,这是我在计算提前停止时收到的输出:

        Epoch 00076: early stopping
        

        在 Keras 更新之前,val_loss 的提前停止工作没有任何警告。

        不要问我为什么它会起作用,因为我不知道。

        (您可以通过一个您知道应该提前停止的小示例来尝试此行为)。

        【讨论】:

          【解决方案6】:

          我对上一个答案投了赞成票,因为它让我有见识来验证 fit_generator 函数的数据和输入,并找出问题的根本原因。总而言之,在我的数据集很小的情况下,我计算了 validation_stepssteps_per_epoch 导致错误的结果为零 (0)。

          我认为,也许对于 Keras 团队来说,更好的长期答案是当这些值为零时在 fit_generator 中导致错误/异常,这可能会导致更好地理解如何解决这个问题。

          【讨论】:

            【解决方案7】:

            出现这个错误是因为我们忘记在fit()方法中设置validation_data,而使用'callbacks': [keras.callbacks.EarlyStopping(monitor='val_loss', patience=1)],

            导致错误的代码是:

            self.model.fit(
                    x=x_train,
                    y=y_train,
                    callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss', patience=1)],
                    verbose=True)
            

            在 fit() 中添加 validation_data=(self.x_validate, self.y_validate), 已修复:

            self.model.fit(
                    x=x_train,
                    y=y_train,
                    callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss', patience=1)],
                    validation_data=(x_validate, y_validate),
                    verbose=True)
            

            【讨论】:

              【解决方案8】:

              这个错误是由于数据集较小而发生的,为了解决这个问题,增加火车时间并在80:20分割火车。

              【讨论】:

                【解决方案9】:

                如果错误仅在您使用较小的数据集时发生,那么您很可能使用的数据集足够小,以至于验证集中没有单个样本。

                因此它无法计算验证损失。

                【讨论】:

                • 提示:检查验证中的样本数量。由于错误,我有 0 个样本:P 问题已修复
                • 作为解释,您需要将与此类似的行添加到 model.fit() 中:“validation_data”=validation_dataset 假设validation_dataset当然是非空的!
                • 检查你有效的数据集大小,如果它小于batch_size,那么可能会出现这个错误。
                猜你喜欢
                • 1970-01-01
                • 2019-03-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-11-16
                • 2017-10-18
                • 2019-06-03
                相关资源
                最近更新 更多