2016-04-07 14 views
4

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).

+2

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

Antwort

6

Das Problem ist nicht mit 4096, sondern mit 25088. Sie müssen die Ausgabe Feature-Maps für jede Ebene Ihres Netzwerks auf der Grundlage der Eingabe Feature Maps berechnen. Beachten Sie, dass die Ebene fc eine Eingabe fester Größe erfordert, sodass die Ausgabe der vorherigen Ebene conv mit der von der Ebene fc benötigten Eingabegröße übereinstimmen muss. Berechnen Sie die fc6-Eingabe-Feature-Map-Größe (dies ist die Ausgabe-Feature-Map der vorherigen conv-Ebene) unter Verwendung der Eingabe-Feature-Map-Größe der vorherigen Ebene conv. Hier ist die Formel:

H_out = (H_in + 2 x Padding_Height - Kernel_Height)/Stride_Height + 1 
W_out = (W_in + 2 x Padding_Width - Kernel_Width)/Stride_Width + 1 
0

Dieser Fehler kommt, wenn Sie die Bilder auf 224 sind beschneiden, statt der 227, die mit dem ursprünglichen Datensatzes durchgeführt wurde. Passen Sie das an und Sie sollten gut gehen.