Ho bisogno di aiuto per creare un CaffeDB per la CNN siamese su una semplice directory con immagini e file di testo dell'etichetta. Il migliore sarebbe un modo Python per farlo.
Il problema non è quello di camminare nella directory e creare coppie di immagini. Il mio problema è più di far uscire un CaffeDB da quelle coppie.
Finora ho utilizzato solo convert_imageset
per creare un CaffeDB fuori da una directory di immagini.
Grazie per l'aiuto!Come creare i dati di allenamento di CaffeDB per le reti siamesi fuori dalla directory delle immagini
risposta
Perché non è sufficiente creare due dataset utilizzando il buon vecchio convert_imagest
?
layer {
name: "data_a"
top: "data_a"
top: "label_a"
type: "Data"
data_param { source: "/path/to/first/data_lmdb" }
...
}
layer {
name: "data_b"
top: "data_b"
top: "label_b"
type: "Data"
data_param { source: "/path/to/second/data_lmdb" }
...
}
Per quanto riguarda la perdita, dal momento che ogni esempio ha un'etichetta di classe è necessario convertire label_a
e label_b
in un same_not_same_label
. Ti suggerisco di fare questo "al volo" usando un livello python. Nel prototxt
aggiungere la chiamata a livello di pitone:
layer {
name: "a_b_to_same_not_same_label"
type: "Python"
bottom: "label_a"
bottom: "label_b"
top: "same_not_same_label"
python_param {
# the module name -- usually the filename -- that needs to be in $PYTHONPATH
module: "siamese"
# the layer name -- the class name in the module
layer: "SiameseLabels"
}
propagate_down: false
}
Creare siamese.py
(assicurarsi che sia nel vostro $PYTHONPATH
). In siamese.py
si dovrebbe avere la classe di livello:
import sys, os
sys.path.insert(0,os.environ['CAFFE_ROOT'] + '/python')
import caffe
class SiameseLabels(caffe.Layer):
def setup(self, bottom, top):
if len(bottom) != 2:
raise Exception('must have exactly two inputs')
if len(top) != 1:
raise Exception('must have exactly one output')
def reshape(self,bottom,top):
top[0].reshape(*bottom[0].shape)
def forward(self,bottom,top):
top[0].data[...] = (bottom[0].data == bottom[1].data).astype('f4')
def backward(self,top,propagate_down,bottom):
# no back prop
pass
Assicurarsi di mescolare le esempi nei due set in modo diverso, in modo da ottenere le coppie non banali. Inoltre, se si costruisce la prima e la seconda serie di dati con diversa numero di esempi, poi si vedrà coppie diverse in ogni epoca;)
Assicurarsi che si costruisce la rete per condividere i pesi del duplicato strati, vedere this tutorial per ulteriori informazioni.
Non ho trovato nessun file siamese.py, né in caffe/python né in python2.7 dir installazione. Sto lavorando su Ubuntu 15.04 e ho ottenuto il ramo caffe-master nel 10/2015. C'è solo l'esempio mnist siamese e ho già progettato la rete come nel tutorial con parametro condiviso, solo l'inizio con l'input dei dati non mi è chiaro. Finora non uso un livello python. Ho appena definito la rete ed eseguo caffe con il comando del treno per un dato solver.prototxt. Mi piace: caffe train -solver solver.prototxt -gpu all. Il mio livello dati si riferisce alla directory con * .mdb e al file binaryproto medio – Feuerteufel
@Feuerteufel è necessario ** creare ** un file 'siamese.py' e assicurarsi che sia in' $ PYTHONPATH'. questo file dovrebbe contenere il codice nella domanda (insieme al corretto 'import's richiesto per importare caffe'). Se hai abilitato un livello Python nel tuo [Makefile] (https://github.com/BVLC/caffe/blob/master/Makefile.config.example#L82) di caffe eseguirà il codice python come parte del suo ' treno caffe'. – Shai
Ok, il livello Python non era abilitato quindi lo sto ricostruendo proprio ora. Le linee appropriate per le importazioni per siamese.py sono "import sys", "sys.path.insert (0, 'path/to/caffe/python')" e "import caffe" o qualcosa di più? Nel livello di perdita lo stesso nome_somma_label viene quindi utilizzato come terzo input? – Feuerteufel
quale strato di perdita hai intenzione di utilizzare? – Shai
Non lo so ancora. Per il mio caso d'uso ho alcune immagini (100k) per ogni classe (4 + garbage class) e voglio che la rete distingua meglio le classi. Con la CNN "normale" ci sono stati molti errori della rete e ho pensato di provare una CNN siamese per fare in modo che la rete imparasse meglio le differenze. Se hai qualche suggerimento sullo strato di perdita, per favore dimmelo. – Feuerteufel
strati di perdita contrastiva sembra essere adatto per questo caso d'uso. – Shai