Keras提前停止回调错误,val_loss指标不可用

时间:2018-02-28 17:19:12

标签: python tensorflow keras

我正在训练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不合适,但我不确定为什么......另一个不寻常的事情是错误只发生在我使用较小的数据集时。

感谢任何帮助。

9 个答案:

答案 0 :(得分:4)

我对之前的答案进行了投票,因为它为我提供了验证数据和输入到" fit_generator"功能并找出问题的根本原因究竟是什么。总之,在我的数据集很小的情况下,我计算了" validation_steps"和" steps_per_epoch"结果证明是零(0)导致错误。

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

答案 1 :(得分:1)

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

因此无法计算验证损失。

答案 2 :(得分:1)

发生错误是因为我们忘记了在使用'callbacks': [keras.callbacks.EarlyStopping(monitor='val_loss', patience=1)],的情况下忘记通过fit()方法设置validation_data

导致错误的代码是:

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)

答案 3 :(得分:1)

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

此解决方案在我的错误消息中的句子中:“可用的度量标准是:...”

答案 4 :(得分:0)

发生此错误是由于数据集较小,要解决此问题,请增加火车时间并在80:20时分割火车集合。

答案 5 :(得分:0)

我也收到了这个警告。它出现在[切换到Keras 2.2.4的主分支以启用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 :(得分:0)

我使用fit_generator收到了此错误消息。在第一个时期结束后出现错误。

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

Keras在第一个纪元末执行回调列表,但是直到第20个纪元时它才真正计算val_loss,因此val_loss还不可用。

设置validation_freq = 1可以解决此问题。

答案 7 :(得分:0)

使用tf.compat.v1.disable_eager_execution()将解决此问题。尝试使validation_freq = 1也是一个好主意。但是,您必须等待每个时期完成的脚本终端输出 Like this result 因此,我建议通过张量板,重量和偏斜等观察结果。

答案 8 :(得分:0)

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