2017-03-21 4 views
0
## what my model looks like 

# defining the model archictecture 
model = Sequential() 
# 1st conv layer 
model.add(Conv2D(32, (5, 5), activation='relu', input_shape=x_ip_shape)) 
# 1st max pool 
model.add(MaxPooling2D(pool_size=(2, 2))) 
# 2nd conv layer 
model.add(Conv2D(64, (7, 7), activation='relu')) 
# 2nd max pool 
model.add(MaxPooling2D(pool_size=(2, 2))) 
# Flattenning the input 
model.add(Flatten()) 
# 1st Fully connected layer 
model.add(Dense(10, activation='relu')) 
# Adding droput 
model.add(Dropout(0.25)) 
# softmax layer 
model.add(Dense(classes_out, activation='softmax')) 

# defining loss, optimizer learning rate and metric 
model.compile(loss='categorical_crossentropy',optimizer=keras.optimizers.Adam(1e-4), metrics=['accuracy']) 


## prediction 
scores = model.evaluate(test_x, test_labels, verbose=0) 

FRAGE: Stattdessen kann ich die Ausgabe für einen Vorwärtspass für # 1. Vollständig verbundene Schicht erhalten, das heißt model.add(Dense(10, activation='relu'))?Keras bekommen Ausgabe von intermidate Schichten

Ich ging durch Beispiel auf keras FAQ. Aber es verwirrt mich: In dieser:

get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()], [model.layers[3].output]) 

wo ich die Eingangsdaten übergeben? Was bedeutet model.layers [0] .input? Speichert das trainierte Model die Eingabe?

Antwort

2

Die get_3rd_layer_output ist eine Theano-Funktion. Sie müssen nicht viele Änderungen daran vornehmen.

model.layers[0].input wird bleiben, wie es ist, wenn Sie die Ausgabe (jede Schicht) gegebene Eingabe der ersten Schicht im Netzwerk wollen. Mit anderen Worten, wenn Sie die Ausgabe eines Layers mit der vierten Ebene als Eingabe wünschen, sollten Sie dies in model.layers[4].input ändern.

K.learning_phase() zeigt an, ob Sie die Ausgabe in der Trainingsphase oder in der Testphase wollen. Es gibt einige Unterschiede zwischen den Ausgaben dieser beiden, da es Schichten wie Dropout gibt, die sich während der Zug- und Testzeit anders verhalten. Sie möchten Null übergeben, wenn Sie ähnlich wie predict() ausgeben möchten.

model.layers[3].output: Hier können Sie Änderungen vornehmen müssen. Ermitteln Sie den Index des Layers, von dem Sie die Ausgabe durchführen möchten. Wenn Sie IDE (z. B. Pycharm) haben, klicken Sie auf model Variable und sehen Sie den Index Ihrer Schicht (erinnern Sie sich, dass es von Null beginnt). Ist dies nicht der Fall, weisen Sie diesem Layer einen Namen zu und Sie können dann alle Layer-Namen herausfinden, indem Sie model.layers eingeben. Von diesem können Sie den Index leicht erhalten. Wenn Sie beispielsweise die Ausgabe von der 10. Ebene möchten, ändern Sie dies in model.layers[10].output.

Wie nennt man das?

Wiederum ist dies eine Theano Funktion, so dass ein symolic ein. Sie müssen Werte übergeben und bewerten. Sie tun es wie folgt:

out = get_3rd_layer_output([X, 0])[0] # test mode 

Denken Sie daran, auch wenn X ein einzelner Datenpunkt ist, sollte seine Form (1,) + x_ip_shape sein.

+0

Ich verstehe die Rolle von K.learning_phase() hier nicht. In der Theorie setzen wir beim Training einige versteckte Ausgaben mit einer gegebenen Wahrscheinlichkeit auf 0. Und beim Testen nehmen wir Erwartungen an. 1. Wenn ich die Ausgabe einer Intermidate-Schicht bekommen möchte, ist es nicht immer zur Testzeit? 2. Sag, ich habe das Modell trainiert. Jetzt möchte ich die Intermidate-Ausgabe für einige Zugproben überprüfen. In diesem Fall würde ich den Testmodus verwenden, richtig? –

+0

Sie würden den Testmodus verwenden, aber ich denke, dass sie die Funktionalität gegeben haben. Was, wenn dein Training nicht wie erwartet funktioniert, dann würdest du den Zwischenausgang in der Trainingsphase sehen wollen, oder? –

Verwandte Themen