Ich habe ein binäres Klassifizierungsmodell mit CNN trainiert und hier ist mein Code
model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
border_mode='valid',
input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (16, 16, 32)
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (8, 8, 64) = (2048)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2)) # define a binary classification problem
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
verbose=1,
validation_data=(x_test, y_test))
Und hier möchte ich die Ausgabe jeder Ebene genau wie TensorFlow erhalten. Wie kann ich das tun?
quelle
K.function([inp]+ [K.learning_phase()], [out])
bedeutet Ihr Code?np.random.random(input_shape)[np.newaxis,...]
kann auch geschrieben werden alsnp.random.random(input_shape)[np.newaxis,:]
K.function
hier und vorherzusagen , verwendet es in der vorherzusagen Schleife hier . Prognostizieren Sie Schleifen über die Stapelgröße (falls nicht standardmäßig 32 festgelegt), um die Einschränkungen des GPU-Speichers zu verringern. Ich bin mir also nicht sicher, warum Sie beobachten,model.predict
ist schneller.Von https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
Eine einfache Möglichkeit besteht darin, ein neues Modell zu erstellen, das die Ebenen ausgibt, an denen Sie interessiert sind:
Alternativ können Sie eine Keras-Funktion erstellen, die die Ausgabe einer bestimmten Ebene bei einer bestimmten Eingabe zurückgibt, z. B.:
quelle
layer_output = get_3rd_layer_output([X, 0])[0]
undlayer_output = get_3rd_layer_output([X, 1])[0]
Die Dokumente erwähnen Zugmodus und TestmodusBasierend auf all den guten Antworten dieses Threads habe ich eine Bibliothek geschrieben, um die Ausgabe jeder Ebene abzurufen. Es abstrahiert die gesamte Komplexität und wurde so benutzerfreundlich wie möglich gestaltet:
https://github.com/philipperemy/keract
Es behandelt fast alle Randfälle
Ich hoffe es hilft!
quelle
Folgendes sieht für mich sehr einfach aus:
Oben befindet sich ein Tensorobjekt, sodass Sie es mithilfe von Operationen ändern können, die auf ein Tensorobjekt angewendet werden können.
Zum Beispiel, um die Form zu bekommen
model.layers[idx].output.get_shape()
idx
ist der Index der Ebene und Sie können ihn von findenmodel.summary()
quelle
Ich habe diese Funktion für mich selbst geschrieben (in Jupyter) und sie wurde von Indraforyous Antwort inspiriert . Alle Ebenenausgaben werden automatisch geplottet. Ihre Bilder müssen eine (x, y, 1) Form haben, wobei 1 für 1 Kanal steht. Sie rufen einfach plot_layer_outputs (...) auf, um zu zeichnen.
quelle
Von: https://github.com/philipperemy/keras-visualize-activations/blob/master/read_activations.py
quelle
Wollte dies als Kommentar (aber nicht hoch genug) zu @ indraforyous Antwort hinzufügen, um das in @ mathticks Kommentar erwähnte Problem zu beheben. Um die
InvalidArgumentError: input_X:Y is both fed and fetched.
Ausnahme zu vermeiden , ersetzen Sie einfach die Zeileoutputs = [layer.output for layer in model.layers]
durchoutputs = [layer.output for layer in model.layers][1:]
, dhAnpassen des minimalen Arbeitsbeispiels von indraforyou:
ps meine Versuche, Dinge auszuprobieren, wie
outputs = [layer.output for layer in model.layers[1:]]
sie nicht funktionierten.quelle
keras
Modells). Ihre Worteinbettungsebene entspricht der Eingabeebene im hier angegebenen Beispiel.Vorausgesetzt, Sie haben:
1- Keras vorab trainiert
model
.2- Eingabe
x
als Bild oder Bildsatz. Die Auflösung des Bildes sollte mit der Dimension der Eingabeebene kompatibel sein. Zum Beispiel 80 * 80 * 3 für 3-Kanal-Bilder (RGB).3- Der Name des Ausgangs
layer
, um die Aktivierung zu erhalten. Zum Beispiel die Ebene "flatten_2". Dies sollte in derlayer_names
Variablen enthalten sein, repräsentiert den Namen der Ebenen der angegebenenmodel
.4-
batch_size
ist ein optionales Argument.Dann können Sie einfach die
get_activation
Funktion verwenden, um die Aktivierung des Ausgangslayer
für einen bestimmten Eingang zu erhaltenx
und vorab zu trainierenmodel
:quelle
Falls Sie einen der folgenden Fälle haben:
InvalidArgumentError: input_X:Y is both fed and fetched
Sie müssen die folgenden Änderungen vornehmen:
outputs
Variable hinzufügenfunctors
loopMinimales Beispiel:
quelle
[x1, x2, xn, 1]
? Mein x1 ist nicht definiert und ich möchte verstehen, was Sie dort definieren.x1
undx2
sind die Eingaben des Modells. Wie bereits erwähnt, haben Sie 2 Eingaben für Ihr Modell.Nun, andere Antworten sind sehr vollständig, aber es gibt eine sehr grundlegende Möglichkeit, die Formen zu "sehen" und nicht zu "bekommen".
Mach einfach eine
model.summary()
. Es werden alle Ebenen und ihre Ausgabeformen gedruckt. "Keine" -Werte geben variable Dimensionen an, und die erste Dimension ist die Stapelgröße.quelle