2017-04-09 7 views
2

I Schicht Conv2D haben definiert als:
Wie bekomme ich die Gewichtung von Conv2D in Keras korrekt?

Conv2D(96, kernel_size=(5, 5), 
      activation='relu', 
      input_shape=(image_rows, image_cols, 1), 
      kernel_initializer=initializers.glorot_normal(seed), 
      bias_initializer=initializers.glorot_uniform(seed), 
      padding='same', 
      name='conv_1') 

Dies ist die erste Schicht in meinem Netzwerk ist.
Eingangsabmessungen sind 64 mal 160, Bild ist 1 Kanal.
Ich versuche, Gewichte von dieser Faltungsschicht zu visualisieren, aber nicht sicher, wie man sie bekommt.
Hier ist, wie ich das jetzt tue:

1.Call

layer.get_weights()[0] 

Diese returs eine Reihe von Form (5, 5, 1, 96). 1 ist, weil Bilder 1-Kanal sind.

2.Take 5 von 5 Filter von

layer.get_weights()[0][:,:,:,j][:,:,0] 

Sehr hässlich, aber ich bin nicht sicher, wie dies zu vereinfachen, werden die Kommentare sehr geschätzt.

Ich bin mir nicht sicher in diesen 5 durch 5 Quadrate. Sind sie eigentlich Filter?
Wenn nicht könnte jemand bitte erzählen, wie man Filter vom Modell richtig ergreift?

Antwort

4

Ich habe versucht, die Gewichte wie so nur die ersten 25 anzuzeigen. Ich habe die gleiche Frage, die Sie tun, ist dies der Filter oder etwas anderes. Es scheint sich nicht um die gleichen Filter zu handeln, die aus tiefen Glaubensnetzwerken oder gestapelten RBMs stammen.

Hier ist die untrainierten visualisiert Gewichte: untrained weights

und hier werden die trainierten Gewichte:

trained weights

Seltsamer gibt es keine Änderung nach dem Training! Wenn Sie sie vergleichen, sind sie identisch.

und dann die DBN RBM filtert Schicht 1 auf der Oberseite und der Schicht 2 auf der Unterseite: DBM RBM filters

Wenn i gesetzt kernel_intialization = „Einsen“ dann bekomme ich Filter, die gut aussehen, aber der Nettoverlust verringert sich allerdings nie mit vielen Versuchs- und Fehleränderungen:

Hier ist der Code zum Anzeigen der 2D Conv Gewichte/Filter.

ann = Sequential() 
    x = Conv2D(filters=64,kernel_size=(5,5),input_shape=(32,32,3)) 
    ann.add(x) 
    ann.add(Activation("relu")) 

...

x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

    ann.fit(Xtrain, ytrain_indicator, epochs=5, batch_size=32) 

    x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

--------------------------- UPDATE ----- -------------------

Also habe ich es nochmal mit einer Lernrate von 0.01 statt 1e-6 versucht und die Bilder zwischen 0 und 1 normalisiert statt 0 und 255, indem die Bilder durch 255,0 geteilt werden.Nun werden die Faltungsfilter ändern und die Ausgabe des ersten Faltungsfilter sieht so aus: Untrained Weights

Der gelernte Filter werden Sie feststellen, geändert wird (nicht viel) mit einer angemessenen Lernrate: Trained Convolution Filter

Hier ist Bild sieben der CIFAR-10 Test-Set: Image 7 CIFAR-10 Car

Und hier die Ausgabe der ersten Faltungsschicht: Convolution Layer Output

Und wenn ich nehmen Sie die letzte Windung Laye r (keine dichten Schichten dazwischen) und es einem nicht klassifizierten Klassifikator zuführen, ist es ähnlich, rohe Bilder hinsichtlich der Genauigkeit zu klassifizieren, aber wenn ich die Faltungsschichten trainiere, erhöht die Ausgabe der letzten Faltungsschicht die Genauigkeit des Klassifikators (zufällige Gesamtstruktur).

Also würde ich schlussfolgern, die Faltungsschichten sind in der Tat Filter sowie Gewichte.

+0

Danke für Ihre Antwort! Es ist eine seltsame Sache hier: Gewichte sind im Falle einer zufälligen Initialisierung ähnlich. Ich verwende Glorot-Initialisierung, die für Conv-Layer empfohlen wird. Die verwirrendste Frage für mich ist: Wir trainieren das Netzwerk, aber wir erleben dieselben Gewichte. Was haben wir trainiert? Habe keine Antwort dafür ... –

+0

Was ist also die dritte Dimension der Gewichte? In 'x1w = x.get_weights() [0] [:,:, 0,:]', die 0 in '[:,:, 0,:]' '. Ich denke, die ersten zwei Dims sind der Kernel x und y, und der letzte ist die Anzahl der Kernel - aber ich habe keine Ahnung, was die 3. Dimension ist. Es scheint die Dimension der Ausgabe der vorherigen Ebene zu sein, aber ich verstehe nicht warum oder was das wirklich bedeutet. – wordsforthewise

+0

Die 0 ist der rote Kanal. Die drei Dimensionen sind rot, grün und blau. Der erste ist x der zweite ist y der dritte ist Kanal und der letzte ist der n-ten Windungsschicht. – John

Verwandte Themen