8

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

+0

quale strato di perdita hai intenzione di utilizzare? – Shai

+0

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

+0

strati di perdita contrastiva sembra essere adatto per questo caso d'uso. – Shai

risposta

7

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.

+0

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

+0

@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

+0

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