2016-07-26 23 views
5

Also ich versuche this Papier über einen Siamesen neuronales Netzwerk zu implementieren . Ich verwende stattdessen die CIFAR10 dataset mit 10 Klassen.einen siamesischen NN in Keras Implementierung

Die Spezifikationen eines der Beine wird der Einfachheit halber wiedergegeben. Notation: C_x ist eine Faltungsschicht, S_x ist eine Unterabtastschicht und F_x ist eine vollständig verbundene Schicht; mit einem gemeinsamen Index x:

  1. C1: feature maps: 15, kernel size = (7, 7)
  2. S2: feature maps: 15, field-of-view = (2, 2)
  3. C3: feature maps: 45, kernel size = (6, 6)
  4. S4: feature maps: 45, field-of-view = (4, 3)
  5. C5: feature maps: 250, kernel size = (5, 5)
  6. F6 (vollständig verbundene Schicht): keine. von Einheiten = 50

Was habe ich

model = Sequential() 

#C1 
model.add(Convolution2D(15, 7, 7, 
activation='relu', 
border_mode='same', 
input_shape=input_img_shape)) 
print("C1 shape: ", model.output_shape) 

#S2 
model.add(MaxPooling2D((2,2), border_mode='same')) 
print("S2 shape: ", model.output_shape) 
#... 

#C5 
model.add(Convolution2D(250, 5, 5, 
activation='relu', 
border_mode='same')) 
print("C5 shape: ", model.output_shape) 

#F6 
model.add(Dense(50)) 

Versuche Nachricht Dies wirft eine lange Fehler, die ich glaube, ein reshape Fehler ist. Ein Ausschnitt des Fehlers:

Exception: Input 0 is incompatible with layer dense_13: expected 
ndim=2, found ndim=4 

Ich weiß, dass das Problem in der letzten dichten Schicht isoliert ist, da der Code läuft glatt, wenn ich kommentiere Sie sich aus. Aber ich bin mir nicht sicher, wie genau ich dann meine endgültige vollständig verbundene Schicht formen/spezifizieren sollte, damit sie mit der früheren Faltungsschicht kompatibel ist.

Einige Orte, die ich

This ist ein verwandtes Problem betrachtet habe, obwohl die Implementierung etwas anders ist (es scheint, dass es zum Zeitpunkt des Schreibens dieses Artikels nicht eine ‚Siamesen‘ in keras Kernschicht). Ich bin mir bewusst, dass es auch implementations in Theano gibt, was ich bedenken werde, wenn ich es einfach nicht in Keras machen kann.

Danke!

Antwort

3

Wie von Matias Valdenegro erwähnt, Keras hat bereits ein Beispiel für Siamese network. Das Beispiel verwendet jedoch nur dichte Ebenen.

Ihr Problem ist, dass Sie richtige Form zu haben, siehe this Keras CNN example

Diese zwei Beispiele sollen eine Flatten Schicht zwischen Faltungs Schichten und dichten Schichten hinzufügen müssen, um Ihren Siamesen Netzwerk aufzubauen.

+0

Könnte ich konzeptionell fragen, warum Sie eine "abgeflachte" Ebene benötigen? Das ist neu für mich, weil ich es nicht in der Zeitung erwähnt habe. Vielen Dank! – AndreyIto

+1

@AndreyIch dies ist mehr ein Implementierungsdetail: In Keras hat die Ausgabe des Layers 'Convolution2D' 4 Dimensionen [(siehe Quelle)] (https://github.com/fchollet/keras/blob/master/keras/layers /convolutional.py#L248), während die Eingabe des 'Dense' Layers die Dimension 2 [(siehe Quelle)] haben sollte (https://github.com/fchollet/keras/blob/master/keras/layers/core.py # L567). Sie müssen also Ihre Daten mit der Ebene "Flatten" glätten, bevor Sie sie durch die Ebene "Dichte" ziehen. – sytrus

1

Sie keine siamesische Schicht benötigen, brauchen Sie nur functional API die Keras verwenden, um ein Modell mit zwei Eingängen und einem Ausgang zu erzeugen.

Es scheint, dass Keras Beispiele already contain ein Modell, das sehr ähnlich dem ist, das Sie implementieren.

+0

Vielen Dank für Ihre Eingabe!Ja, ich bin auf dieses Beispiel gestoßen, und es hat mir geholfen, die allgemeine Struktur zusammenzustellen, aber es hat sich nicht mit dem spezifischen Problem der Verwaltung von Formen zwischen Ebenen befasst. Danke trotzdem! – AndreyIto