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