2015-10-20 20 views
8

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!

+2

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

+1

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

+0

Hai visto questo problema? https://github.com/BVLC/caffe/issues/2407 – ginge

risposta

0

In dati di input GoogLeNet deve essere sottratto dai media:

... 
im = im.transpose((2,0,1)) 
mean = np.array((104,117,123)) 
im -= mean 
im_dat = caffe.io.array_to_datum(im) 
...