Estoy entrenando un Keras (backend de Tensorflow, Python, en MacBook) y obtengo un error en la devolución de llamada de detención temprana en la función fit_generator. El error es el siguiente:

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'

Mi código es el siguiente (que se ve bien):

:
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)

El mensaje de error parece estar relacionado con la devolución de llamada de detención temprana, pero la devolución de llamada parece estar bien. Además, el error indica que val_loss no es apropiado, pero no estoy seguro de por qué ... Una cosa más inusual sobre esto es que el error solo ocurre cuando uso conjuntos de datos más pequeños.

Cualquier ayuda es apreciada.

16
Eric Broda 28 feb. 2018 a las 20:19

5 respuestas

La mejor respuesta

Si el error solo ocurre cuando usa conjuntos de datos más pequeños, es muy probable que use conjuntos de datos lo suficientemente pequeños como para no tener una sola muestra en el conjunto de validación.

Por lo tanto, no puede calcular una pérdida de validación.

5
Daniel Möller 28 feb. 2018 a las 17:39

También recibí esta advertencia. Apareció después de [cambiar a la rama maestra de Keras 2.2.4 para habilitar la funcionalidad 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

Sin embargo, a pesar de la advertencia, la detención temprana en val_loss todavía funciona (al menos para mí). Por ejemplo, este es el resultado que recibí cuando el cálculo se detuvo temprano:

Epoch 00076: early stopping

Antes de esa actualización de Keras, la detención temprana funcionó en val_loss sin advertencia.

No me preguntes por qué funciona porque no tengo ni idea.

(Puede probar este comportamiento con un pequeño ejemplo que sabe que debería detenerse antes).

0
Luca Urbinati 20 oct. 2019 a las 17:50

El error se nos ocurre porque olvidamos establecer validation_data en el método fit (), mientras se usaba 'callbacks': [keras.callbacks.EarlyStopping(monitor='val_loss', patience=1)],

El código que causa el error es:

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

Añadiendo validation_data=(self.x_validate, self.y_validate), en fit () fijo:

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)
4
menrfa 7 jun. 2019 a las 08:05

He votado a favor la respuesta anterior, ya que me dio la idea de verificar los datos y las entradas a la función fit_generator y descubrir cuál era la causa raíz del problema. En resumen, en los casos en que mi conjunto de datos era pequeño, calculé validation_steps y steps_per_epoch que resultó ser cero (0), lo que causó el error.

Supongo que la mejor respuesta a largo plazo, tal vez para el equipo de Keras, es causar un error / excepción en fit_generator cuando estos valores son cero, lo que probablemente conduciría a una mejor comprensión sobre cómo abordar este problema.

6
Keet Sugathadasa 22 jun. 2019 a las 18:12

Este error se debe a un conjunto de datos más pequeño, para resolver esto, aumentar los tiempos de tren y dividir el conjunto de trenes en 80:20.

1
Denny Prakash 6 dic. 2018 a las 11:43