8

Ich brauche etwas Hilfe, um eine CaffeDB für siamesische CNN aus einem einfachen Verzeichnis mit Bildern und Label-Text-Datei zu erstellen. Am besten wäre eine Python-Methode.
Das Problem besteht darin, nicht durch das Verzeichnis zu gehen und Bilderpaare zu erstellen. Mein Problem besteht eher darin, aus diesen Paaren eine CaffeDB zu machen.
Bisher habe ich nur convert_imageset verwendet, um eine CaffeDB aus einem Bildverzeichnis zu erstellen.
Danke für Hilfe!Wie CaffeDB Trainingsdaten für siamesische Netzwerke aus Bildverzeichnis erstellen

+0

Welche Verlustschicht werden Sie verwenden? – Shai

+0

Ich weiß es noch nicht. Für meinen Anwendungsfall habe ich einige Bilder (100k) für jede Klasse (4 + Müllklasse) und ich möchte, dass das Netz zwischen Klassen besser unterscheidet. Mit "normalem" linearem CNN gab es zu viele Fehler im Netz und ich dachte daran, ein siamesisches CNN zu versuchen, damit das Netz die Unterschiede besser lernt. Wenn Sie einige Vorschläge für eine gute Verlustschicht haben, sagen Sie es mir bitte. – Feuerteufel

+0

kontrastive Verlustschichten scheinen für diesen Anwendungsfall geeignet zu sein. – Shai

Antwort

7

Warum machen Sie nicht einfach zwei Datensätze mit guten alten 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" } 
    ... 
} 

Wie für den Verlust, da jedes Beispiel hat man eine Klasse Label benötigen label_a und label_b in eine same_not_same_label zu konvertieren. Ich schlage vor, Sie tun dies "on-the-fly" mit einer Python-Schicht. Im prototxt den Anruf zu Python Ebene hinzuzufügen:

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 
} 

erstellen siamese.py (stellen Sie sicher, dass es in Ihrem $PYTHONPATH ist). In siamese.py sollten Sie die Schichtklasse haben:

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 

Stellen Sie sicher, dass die Beispiele in den beiden Sätzen in einer anderen Art und Weise mischen, so dass Sie nicht-triviale Paare bekommen. Außerdem, wenn Sie den ersten und zweiten Datensätze mit verschiedenen Anzahl von Beispielen konstruieren, dann werden Sie verschiedene Paare in jeder Epoche sehen;)


Achten Sie darauf, das Netzwerk aufzubauen, um die Gewichte des duplizierten zu teilen Schichten, siehe this tutorial für weitere Informationen.

+0

Ich fand keine siamese.py Datei, weder in Caffe/Python noch in Python2.7 Installationsverzeichnis. Ich arbeite an Ubuntu 15.04 und habe die Caffe-Master-Filiale in 10/2015. Es gibt nur das mnist siamesische Beispiel und ich habe das Netz bereits wie im Tutorial mit Shared-Parameter entworfen, nur der Anfang mit der Dateneingabe ist mir nicht klar. Ich verwende bisher keine Python-Ebene. Ich definiere einfach das Netz und führe caffe mit train command für einen gegebenen solver.prototxt aus. Wie: caffe train -solver solver.prototxt -gpu alle. Meine Datenschicht bezieht sich auf das Verzeichnis mit * .mdb und die mittlere binärproto Datei – Feuerteufel

+0

@Feuteteufel müssen Sie ** eine 'siamesische.py' Datei erstellen und sicherstellen, dass sie sich in Ihrem' $ PYTHONPATH' befindet. Diese Datei sollte den Code in der Frage enthalten (zusammen mit den richtigen 'Imports', die zum Importieren von Caffe benötigt werden). Wenn Sie eine Python-Ebene in Ihrem [Makefile] (https://github.com/BVLC/caffe/blob/master/Makefile.config.example#L82) aktiviert haben, dann wird caffe den Python-Code für Sie als Teil seiner '' ausführen Caffe-Zug'. – Shai

+0

Ok, die Python-Ebene wurde nicht aktiviert, daher erstelle ich sie gerade neu. Die richtigen Zeilen für Importe für die siamese.py sind "import sys", "sys.path.insert (0, 'pfad/zu/caffe/python')" und "import caffe" oder etwas mehr? In der Verlustschicht wird das selbe_not_same_label dann als dritte Eingabe verwendet? – Feuerteufel