Desidero mettere a punto GoogLeNet per la classificazione Multi-label con Caffe. L'ho già messo a punto su una classificazione con etichetta singola, ma non riesco ancora a passare alla Multi-label.Classificazione multi-etichetta con Caffe
Le principali fasi che sto facendo che sono diverse:
Creare LMDB per dati & terra verità
sto modificando il codice here e here per creare una LMDB con i dati e le altre con la verità a terra .
Sostituzione SoftmaxWithLoss con SigmoidCrossEntropyLoss
Aggiornamento del train_val.prototxt, ho sostituire strati SoftmaxWithLoss a SigmoidCrossEntropyLoss, e impostare i livelli di dati in modo che siano caricati entrambi DB di. Ho impostato i parametri del tasso di apprendimento come ho fatto con il problema di classificazione con etichetta singola.
Questa procedura sembra funzionare. Il flusso di dati, ed è possibile eseguire solver.step (1). Per verificare che i dati e le etichette siano caricati correttamente, ho calcolato esplicitamente la perdita utilizzando la formula e ottenuto lo stesso risultato di Caffe.
Problema
La rete non converge. Eseguendolo in diverse centinaia di iterazioni, ognuna delle diverse classi è in media attorno alla popolazione di classe. Cioè se la classe a ha 0,35 1 e 0,65 0 nella popolazione, la rete convergerà in ~ 0,35 probabilità di classificazione per ogni osservazione, indipendentemente dalla vera etichetta.
possibile errore 1
Ho il sospetto che il problema è perché non riesco a caricare le immagini correttamente nel caffe in un modo che GoogLeNet preaddestrato modello può imparare da loro. La mia precedente esperienza finora è convert_imageset che funziona perfettamente. In questo momento sto utilizzando il codice shelhamer per salvare le immagini nel LMDB:
im = np.array(Image.open(os.path.join(data_dir,in_)))
im = im[:,:,::-1]
im = im.transpose((2,0,1))
im_dat = caffe.io.array_to_datum(im)
in_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString())
ho normalizzare la media nello strato di dati durante il caricamento dell'immagine. Sembra giusto? C'è un altro modo per farlo?
Possibile errore 2
Potrebbe anche essere che il train_val.prototxt è stata definita sbagliata. C'è qualcos'altro che deve essere fatto di passare a SoftmaxWithLoss -> SigmoidCrossEntropyLoss?
Qualsiasi aiuto sarà molto apprezzato! Grazie!
sembra che la vostra rete di rimanere bloccati con una "tutti 1" previsione. Potrebbe succedere se i tuoi gradienti sono troppo alti e guidano i parametri in regioni prive di significato. Puoi tracciare un grafico di perdita dell'allenamento vs numero di iterazione? Proverò a ridurre il tasso di apprendimento di uno o due * ordini di grandezza * e ad allenarmi nuovamente, verificare se il modello è bloccato di nuovo. – Shai
Se la rete non sta convergendo, è necessario verificare la velocità di apprendimento. Generalmente per la messa a punto, si dovrebbe avere un tasso di apprendimento più basso (o un alto tasso di apprendimento per cominciare e un rapido decadimento). Se la perdita del treno è in aumento su epoche, è un'indicazione che il tuo tasso di apprendimento è troppo alto. – user3334059
Hai visto questo problema? https://github.com/BVLC/caffe/issues/2407 – ginge