34

Attualmente io uso il seguente codice:Come dire a Keras di interrompere l'allenamento in base al valore di perdita?

callbacks = [ 
    EarlyStopping(monitor='val_loss', patience=2, verbose=0), 
    ModelCheckpoint(kfold_weights_path, monitor='val_loss', save_best_only=True, verbose=0), 
] 
model.fit(X_train.astype('float32'), Y_train, batch_size=batch_size, nb_epoch=nb_epoch, 
     shuffle=True, verbose=1, validation_data=(X_valid, Y_valid), 
     callbacks=callbacks) 

Racconta Keras a smettere di formazione quando la perdita non ha migliorato per 2 epoche. Ma voglio smettere di formazione dopo la perdita è diventato più piccolo di alcuni costante "THR":

if val_loss < THR: 
    break 

che ho visto nella documentazione ci sono possibilità di fare il vostro proprio callback: http://keras.io/callbacks/ Ma non abbiamo trovato nulla come fermare processo di formazione . Ho bisogno di un consiglio.

risposta

8

Una soluzione è chiamare model.fit(nb_epoch=1, ...) all'interno di un ciclo for, quindi è possibile inserire un'istruzione di interruzione all'interno del ciclo for e fare qualsiasi altro flusso di controllo personalizzato desiderato.

+0

Sarebbe bello se facessero una richiamata che accetta una singola funzione che può farlo. – Honesty

36

Ho trovato la risposta. Ho esaminato le fonti di Keras e ho trovato il codice per EarlyStopping. Ho fatto il mio richiamo, basato su di esso:

class EarlyStoppingByLossVal(Callback): 
    def __init__(self, monitor='val_loss', value=0.00001, verbose=0): 
     super(Callback, self).__init__() 
     self.monitor = monitor 
     self.value = value 
     self.verbose = verbose 

    def on_epoch_end(self, epoch, logs={}): 
     current = logs.get(self.monitor) 
     if current is None: 
      warnings.warn("Early stopping requires %s available!" % self.monitor, RuntimeWarning) 

     if current < self.value: 
      if self.verbose > 0: 
       print("Epoch %05d: early stopping THR" % epoch) 
      self.model.stop_training = True 

e di utilizzo:

callbacks = [ 
    EarlyStoppingByLossVal(monitor='val_loss', value=0.00001, verbose=1), 
    # EarlyStopping(monitor='val_loss', patience=2, verbose=0), 
    ModelCheckpoint(kfold_weights_path, monitor='val_loss', save_best_only=True, verbose=0), 
] 
model.fit(X_train.astype('float32'), Y_train, batch_size=batch_size, nb_epoch=nb_epoch, 
     shuffle=True, verbose=1, validation_data=(X_valid, Y_valid), 
     callbacks=callbacks) 
+0

Solo se sarà utile per qualcuno - nel mio caso ho usato monitor = 'perdita', ha funzionato bene. – QtRoS

+6

Sembra che Keras sia stato aggiornato. La funzione di callback [EarlyStopping] (https://keras.io/callbacks/#earlystopping) ha ora integrato in min_delta. Non c'è più bisogno di hackerare il codice sorgente, yay! https://stackoverflow.com/a/41459368/3345375 – jkdev

+0

Dopo aver riletto la domanda e le risposte, ho bisogno di correggermi: min_delta significa "Fermati presto se non c'è abbastanza miglioramento per epoca (o per più epoche)." Tuttavia, l'OP ha chiesto come "Fermarsi presto quando la perdita scende al di sotto di un certo livello". – jkdev

13

Il callback keras.callbacks.EarlyStopping ha un argomento min_delta. Dalla documentazione di Keras:

min_delta: la variazione minima nella quantità monitorata per qualificarsi come miglioramento, cioè una variazione assoluta inferiore a min_delta, non verrà considerata come miglioramento.

+0

Per riferimento, ecco i documenti per una versione precedente di Keras (1.1.0) in cui l'argomento min_delta non era ancora incluso: https://faroit.github.io/keras-docs/1.1.0/callbacks/# earlystopping – jkdev

Problemi correlati