Ich benutze PyCaffe, um ein neurales Netzwerk zu implementieren, das vom VGG 16-Schicht-Netzwerk inspiriert ist. Ich möchte das vortrainierte Modell von GitHub page verwenden. Im Allgemeinen funktioniert dies, indem die Ebenennamen angepasst werden.Caffe Shape Mismatch Fehler mit vortrainierten VGG-16 Modell
Für meine "fc6"
Schicht habe ich die folgende Definition in meiner train.prototxt Datei:
layer {
name: "fc6"
type: "InnerProduct"
bottom: "pool5"
top: "fc6"
inner_product_param {
num_output: 4096
}
}
Here ist die prototxt-Datei für die VGG-16 deploy Architektur. Beachten Sie, dass die "fc6"
in ihrem Prototyp identisch ist mit meiner (außer für die Lernrate, aber das ist irrelevant). Es ist auch erwähnenswert, dass die Eingänge in meinem Modell alle die gleiche Größe haben: 3-Kanal 224x224px Bilder.
Ich verfolge this tutorial ziemlich eng, und der Block von Code, der mir ein Problem ist gibt, ist die folgende:
solver = caffe.SGDSolver(osp.join(model_root, 'solver.prototxt'))
solver.net.copy_from(model_root + 'VGG_ILSVRC_16_layers.caffemodel')
solver.test_nets[0].share_with(solver.net)
solver.step(1)
Die erste Zeile ermittelter prototxt lädt und dann die zweite Zeile kopiert die Gewichte von der vortrainiertes Modell (VGG_ILSVRC_16_layers.caffemodel
). Wenn der Solver läuft, bekomme ich diesen Fehler:
Cannot copy param 0 weights from layer 'fc6'; shape mismatch. Source param
shape is 1 1 4096 25088 (102760448); target param shape is 4096 32768 (134217728).
To learn this layer's parameters from scratch rather than copying from a saved
net, rename the layer.
Der Kern ist es, dass ihr Modell der Schicht der Größe 1x1x4096 sein erwartet, während Mine nur 4096. Aber ich bekomme nicht, wie ich das ändern kann ?
Ich fand this answer in dem Benutzer Google-Gruppe mich anweist Netto-Operation zu tun, die vorher gelerntes Modell vor dem Kopieren neu zu gestalten, sondern um dem zu tun, dass ich die lmdb
Dateien von der ursprünglichen Schichten Datenarchitektur, die ich don‘ t haben (es wirft einen Fehler, wenn ich versuche, das Netzchirurgie-Skript laufen zu lassen).
Sie haben kein Problem mit der Ausgabedimension '4096', sondern mit der Eingabedimension: Sie haben eine Eingabe mit 25088 dim, während VGG eine Eingabe von dim 32768 erwartet. Sie haben etwas an den conv-Layern geändert, die die geändert haben Merkmalsgröße. – Shai