2017-05-15 22 views
3

Ich verwende Conv2D Modell Keras 2.0. Ich kann jedoch nicht vollständig verstehen, was die Funktion mathematisch tut. Ich versuche, die Mathematik mit zufällig generierten Daten und ein sehr einfaches Netzwerk zu verstehen:Math hinter Conv2D-Funktion in Keras

import numpy as np 
import keras 
from keras.layers import Input, Conv2D 
from keras.models import Model 
from keras import backend as K 

# create the model 
inputs = Input(shape=(10,10,1)) # 1 channel, 10x10 image 
outputs = Conv2D(32, (3, 3), activation='relu', name='block1_conv1')(inputs) 
model = Model(outputs=outputs, inputs=inputs) 

# input 
x = np.random.random(100).reshape((10,10)) 

# predicted output for x 
y_pred = model.predict(x.reshape((1,10,10,1))) # y_pred.shape = (1,8,8,32) 

Ich habe versucht, der Wert der ersten Reihe, die erste Spalte in der ersten Merkmalskarte zu berechnen, zum Beispiel, im Anschluss an die Demo in here.

w = model.layers[1].get_weights()[0] # w.shape = (3,3,1,32) 
w0 = w[:,:,0,0] 
b = model.layers[1].get_weights()[1] # b.shape = (32,) 
b0 = b[0] # b0 = 0 

y_pred_000 = np.sum(x[0:3,0:3] * w0) + b0 

Aber relu(y_pred_000) nicht gleich y_pred[0][0][0][0].

Kann jemand darauf hinweisen, was mit meinem Verständnis falsch ist? Vielen Dank.

+0

Was sind die Ergebnisse, die Sie bekommen, wenn ich Ihren Code lief ich 'y_pred_000 = 0.14973172296210166' und' y_pred [0] [0] [0] [? 0] = 0.14973173', was nah genug scheint – sietschie

+0

Vielen Dank für Ihren Kommentar ts Ich habe (auf Windows 10, Python 2.7, K.backend() == Theano) war "y_pred_000 = 0.091446961680955799" und "y_pred [0] [0] [0] [0] = 0.033766586". Aber nachdem das Backend in Tensorflow geändert wurde (Python 3.5, K.backend() == Tensorflow), waren die beiden Ergebnisse gleich! ('y_pred_000 = 0.025001197995700348' und' y_pred [0] [0] [0] [0] = 0.025001198') Ich nehme an, das ist ein Theano oder Python2-spezifisches Problem. – hikaru

Antwort

2

Es ist einfach und es kommt von Theano dim Bestellung. Das Ergebnis der Anwendung von Filter in einer so genannten channel Dimension gespeichert. Im Fall von TensorFlow ist dies die letzte Dimension und deshalb sind die Ergebnisse gut. Im Falle von Theano ist es zweite Dimension (Faltungsergebnis (cases, channels, width, height) so um Ihr Problem Sie Vorhersage Linie ändern müssen, um zu lösen Form hat:

y_pred = model.predict(x.reshape((1,1,10,10))) 

Auch müssen Sie die Art und Weise ändern Sie die Gewichte als Gewichte erhalten in Theano Form hat (output_channels, input_channels, width, height) Sie das Gewicht Getter ändern müssen:

w = model.layers[1].get_weights()[0] # w.shape = (32,1,3,3) 
w0 = w[0,0,:,:] 
+0

Vielen Dank für Ihren Kommentar. Ich habe den Code geändert, wie Sie gesagt haben, aber ich habe den Fehler: 'ValueError: Fehler beim Überprüfen: erwartet input_8, um Form zu haben (None, 10, 10, 1) aber Array mit Form (1L, 1L, 10L, 10L)' Ich nehme an, dass die 'Form' des' Input' nicht mit der Form der neu geformten Eingabe übereinstimmt. Wie soll ich den Code ändern? (In meiner .keras.keras.json, '" image_data_format ":" channels_last "') – hikaru

+0

Ok - also lass die Vorhersagezeile so wie sie war und versuche nur eine zweite Änderung. Wie funktioniert es dann? –

+0

Erneut bekam ich den Fehler: 'ValueError: Operanden konnten nicht zusammen mit shapes (3,3) (1,32)' ausgestrahlt werden. Die Form von 'w [0,0,:,:]' ist '(1,32)', also ist es kein Kernel. – hikaru