2016-05-05 24 views
7

Sto utilizzando mxnet per addestrare un classificatore di immagini di classe 11. Sto osservando uno strano comportamento l'accuratezza dell'allenamento stava aumentando lentamente e salì al 39% e nell'epoca successiva è scesa al 9% e poi si avvicina al 9% per il resto dell'allenamento. Ho riavviato l'allenamento con il modello salvato (con una precisione di allenamento del 39%) mantenendo tutti gli altri parametri uguali. Ora la precisione dell'allenamento è in aumento. Quale può essere la ragione qui? Non sono in grado di capirlo. E sta diventando difficile addestrare il modello in questo modo in quanto richiede di vedere costantemente i valori di accuratezza dell'allenamento.Improvvisa riduzione dell'accuratezza durante l'allenamento di una rete neurale profonda

tasso di apprendimento è costante a 0,01

+0

molto probabilmente il tuo tasso di apprendimento è troppo alto e il modello sta saltando. Difficile da dire senza conoscere i tuoi iperparametri – fabrizioM

+0

tasso di apprendimento in 0,01 – sau

+0

Una volta ho avuto un problema simile quando, per caso, ho impostato un'attivazione lineare e ho utilizzato l'entropia categoriale come funzione di costo. –

risposta

7

come si può vedere la vostra precisione in ritardo è vicino a uno casuale. c'è 2 problemi comuni in questo tipo di casi.

  • il tuo tasso di apprendimento è alto. prova ad abbassarlo
  • L'errore (o l'entropia) che stai tentando di utilizzare ti sta dando il valore NaN. se si sta tentando di utilizzare entropie con funzioni di registro, è necessario utilizzarle con precisione.
-2

È successo probabilmente perché 0log0 restituisce NaN.

Si potrebbe evitare di;

cross_entropy = -tf.reduce_sum(labels*tf.log(tf.clip_by_value(logits,1e-10,1.0)))

+0

Non si dovrebbe limitare il gradiente limitando la perdita tagliando i logits, questo in realtà crea un gradiente di 0 in quegli intervalli e la rete si blocca. Dovresti invece tagliare la sfumatura direttamente. –

1

È comune durante l'addestramento delle reti neurali per la precisione per migliorare un po 'e poi peggiorare - in generale, questo è causato da un eccesso di raccordo. È anche abbastanza comune per la rete "diventare sfortunata" e cadere in una brutta parte dello spazio dei parametri corrispondente ad un'improvvisa diminuzione di accuratezza - a volte può riprendersi rapidamente, ma a volte no.

In generale, l'abbassamento del tasso di apprendimento è un buon approccio a questo tipo di problema. Inoltre, l'impostazione di un piano di apprendimento come FactorScheduler può aiutarti a raggiungere una convergenza più stabile abbassando il tasso di apprendimento ogni poche epoche. In effetti, questo a volte può nascondere errori nel scegliere un tasso di apprendimento iniziale troppo alto.

0

Ho affrontato lo stesso problema. E l'ho risolto usando (y-a)^una funzione di perdita invece della funzione di entropia incrociata (a causa del log (0)). Spero che ci sia una soluzione migliore per questo problema.