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
Antwort
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.
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
@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
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
Welche Verlustschicht werden Sie verwenden? – Shai
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
kontrastive Verlustschichten scheinen für diesen Anwendungsfall geeignet zu sein. – Shai