Wie wird die zweite Schicht eines Netzwerks ausgegeben?

9

Mein Modell ist auf Ziffernbildern trainiert ( MNIST dataset). Ich versuche, die Ausgabe der zweiten Schicht meines Netzwerks zu drucken - ein Array mit 128 Zahlen.

Nachdem viele Beispiele zu lesen - zum Beispiel dieses , und dies , oder dies .

Ich habe es in meinem eigenen Netzwerk nicht geschafft. Keine der Lösungen funktioniert mit meinem eigenen Algorithmus.

Link zu Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaD

Ich habe viele verschiedene Fehlermeldungen erhalten. Ich habe versucht, mit jedem von ihnen umzugehen, konnte es aber nicht alleine herausfinden.

Was vermisse ich? Wie wird die zweite Ebene ausgegeben? Wenn meine Form ist (28,28)- was sollte der Typ und Wert von sein input_shape?


Fehlgeschlagene Versuche und Fehler zum Beispiel:

(1)

for layer in model.layers:

    get_2nd_layer_output = K.function([model.layers[0].input],[model.layers[2].output])
    layer_output = get_2nd_layer_output(layer)[0]
    print('\nlayer output: get_2nd_layer_output=, layer=', layer, '\nlayer output: get_2nd_layer_output=', get_2nd_layer_output)

TypeError: Eingaben sollten eine Liste oder ein Tupel sein.

(2)

input_shape=(28, 28)
inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 0.])
print('layer_outs',layer_outs)

tensorflow.python.framework.errors_impl.FailedPreconditionError: Fehler beim Lesen der Ressourcenvariablen Dichte_1 / Bias aus Container: localhost. Dies könnte bedeuten, dass die Variable nicht initialisiert wurde. Nicht gefunden: Container localhost existiert nicht. (Ressource konnte nicht gefunden werden: localhost / dicht_1 / Bias) [[{{Knoten dicht_1 / BiasAdd / ReadVariableOp}}]]

Shir K.
quelle
1
Die Links in Ihrer Frage sind defekt.
Fügen
@ ThéoRubenach Fertig
Shir K

Antworten:

3

Sieht so aus, als würden Sie alte Keras (vor Tensorflow 2.0 :) import kerasund neue Keras ( from tensorflow import keras) mischen .

Versuchen Sie, keine alten Keras neben Tensorflow> = 2.0 zu verwenden (und beziehen Sie sich nicht auf die alte Dokumentation wie in Ihrem ersten Link), da diese leicht mit der neuen verwechselt werden kann (obwohl nichts streng unlogisch ist):

from tensorflow import keras
from keras.models import Model
print(Model.__module__) #outputs 'keras.engine.training'

from tensorflow.keras.models import Model
print(Model.__module__) #outputs 'tensorflow.python.keras.engine.training'

Das Verhalten beim Mischen dieser beiden Bibliotheken ist sehr instabil.

Sobald dies erledigt ist, verwenden Sie eine Antwort von dem, was Sie versucht haben, m ist Ihr Modell und my_input_shapeist die Form Ihrer Modelleingabe, dh die Form eines Bildes (hier (28, 28) oder (1, 28, 28), falls vorhanden Chargen):

from tensorflow import keras as K
my_input_data = np.random.rand(*my_input_shape) 
new_temp_model = K.Model(m.input, m.layers[3].output) #replace 3 with index of desired layer
output_of_3rd_layer = new_temp_model.predict(my_input_data) #this is what you want

Wenn Sie ein Bild haben img, können Sie direkt schreibennew_temp_model.predict(img)

Théo Rubenach
quelle
Rubenach was meinst du mit 'my_input_shape'? Was sollte der Wert dieser Var sein?
Shir K
1
input_shape=(28, 28)
Nun,
1
hier verwende ich zufällige Daten, aber in Ihrem Fall sollten my_input_dataSie diese natürlich durch Ihre eigenen Daten ersetzen
Théo Rubenach
Was meinen Sie mit "Ihren eigenen Daten"? Was sollten die Werte im Inneren sein - Trainingsdaten? Testdaten? sollte es nur 1 Objekt (Bild) oder eine Liste / ein Array / ein Tupel von Objekten (Bildern) sein? Ich habe viele verschiedene Kombinationen davon ausprobiert und nichts davon hat funktioniert. Als ich 'input_shape' wie von Ihnen erwähnt einstellte, erhielt ich den Fehler '' AttributeError: 'tuple'-Objekt hat kein Attribut' shape ''
Shir K
1
Ich habe meine Antwort entsprechend aktualisiert. Das Bild, das Sie verwenden möchten, hängt von Ihrem Anwendungsfall ab. Es hat nichts mit Code zu tun. Wenn Sie immer noch verwirrt sind, stellen Sie vielleicht eine neue Frage auf einer anderen Stackexchange-Site?
Théo Rubenach
3

(Angenommen, TF2)

Ich denke, der einfachste Ansatz wäre, Ihre Ebenen zu benennen und sie dann mit Standardeingabe aufzurufen, damit Ihr Modell möglicherweise so aussieht

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28), name='flatten'),
    keras.layers.Dense(128, activation='relu', name='hidden'),
    keras.layers.Dense(10, activation='softmax')
])

Dann erstellen Sie einfach eine Eingabe und

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
output_of_flatten = model.get_layer('flatten')(my_input)
output_of_hidden = model.get_layer('hidden')(output_of_flatten)

output_of_hidden ist das, wonach Sie suchen

Alternativer Ansatz

Wenn Sie nach einer allgemeineren Lösung suchen und davon ausgehen, dass Ihr Modell sequentiell ist, können Sie das indexSchlüsselwort get_layerwie folgt verwenden

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
desired_index = 1  # 1 == second layer

for i in range(desired_index):
    my_input = model.get_layer(index=i)(my_input)

Am Ende dieser Schleife my_inputsollte das stehen, wonach Sie suchen

Bluesummers
quelle
Was meinst du mit 'my_input = ... # Sollte wie die Standardeingabe in dein Netzwerk sein'? Was sollte der Wert dieser Var sein?
Shir K
1
Jede Standardeingabe, wie sie das sequentielle Modell erwartet - wenn Ihre Eingabe 28x28 ist, sollten Sie ein Array von 1x28x28 für ein einzelnes Beispiel übergeben
Bluesummers
1
Ich habe meine Antwort auf
bluesummers
Wie drucke ich die Werte in 'output_of_hidden'? Das aktuelle Ergebnis ist 'output_of_hidden Tensor ("hidden_1 / Relu: 0", shape = (1, 128), dtype = float32)'. Ich habe versucht, session & eval zu verwenden, erhalte jedoch Fehler.
Shir K
1
Wenn in TF2, sollten Sie normalerweise anrufen output_of_hidden.numpy()und es konvertiert es in numpy Array
Bluesummers