我正在训练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不合适,但我不确定为什么......另一个不寻常的事情是错误只发生在我使用较小的数据集时。
感谢任何帮助。
答案 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也是一个好主意。但是,您必须等待每个时期完成的脚本终端输出
因此,我建议通过张量板,重量和偏斜等观察结果。
答案 8 :(得分:0)
导入依赖时尽量避免使用 tf.keras。当我直接使用 Keras(例如,导入层和回调)时,它对我有用。