Jak wyprowadzić drugą warstwę sieci?

9

Mój model jest przeszkolony w zakresie obrazów cyfrowych ( MNIST dataset). Próbuję wydrukować dane wyjściowe drugiej warstwy mojej sieci - tablicy 128 liczb.

Po przeczytaniu wielu przykładów - na przykład tego , i tego , czy to .

Nie udało mi się tego zrobić we własnej sieci. Żadne z rozwiązań nie działa w moim własnym algorytmie.

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

Otrzymałem wiele różnych komunikatów o błędach. Próbowałem poradzić sobie z każdym z nich, ale nie mogłem tego sam.

czego mi brakuje? Jak wyprowadzić drugą warstwę? Jeśli mój kształt jest (28,28)- jaki powinien być typ i wartość input_shape?


Nieudane próby i błędy, na przykład:

(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: dane wejściowe powinny być listą lub krotką.

(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: Błąd podczas odczytu zmiennej zasobu dense_1 / bias z kontenera: localhost. Może to oznaczać, że zmienna nie została zainicjowana. Nie znaleziono: kontener localhost nie istnieje. (Nie można znaleźć zasobu: localhost / dense_1 / bias) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]

Shir K.
źródło
1
Linki w pytaniu są zepsute, dodaj je, aby mieć pojęcie o tym, czego próbowałeś
Théo Rubenach,
@ ThéoRubenach Gotowe
Shir K

Odpowiedzi:

3

Wygląda na to, że miksujesz stare keras (przed tensorflow 2.0:) import kerasi nowe keras ( from tensorflow import keras).

Staraj się nie używać starych kamer razem z tensorflow> = 2.0 (i nie odwoływać się do starej dokumentacji jak w twoim pierwszym linku), ponieważ łatwo jest ją pomylić z nową (chociaż nie jest to absolutnie nielogiczne):

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'

Zachowanie będzie wysoce niestabilne mieszanie tych dwóch bibliotek.

Gdy to zrobisz, używając odpowiedzi z tego, co próbowałeś, m jest twoim modelem i my_input_shapejest kształtem twoich modeli wejściowych, tj. Kształtu jednego obrazu (tutaj (28, 28) lub (1, 28, 28), jeśli masz partie):

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

Jeśli masz jeden obraz img, możesz bezpośrednio napisaćnew_temp_model.predict(img)

Thoo Rubenach
źródło
Rubenach, co masz na myśli przez „my_input_shape”? jaka powinna być wartość tego var?
Shir K,
1
Cóż, kształt danych wejściowych modelu, masz go nawet we własnym kodzie podczas definiowania modelu:input_shape=(28, 28)
Théo Rubenach
1
tutaj używam losowych danych, ale w twoim przypadku powinieneś my_input_dataoczywiście zastąpić własnymi danymi
Théo Rubenach
Co rozumiesz przez „własne dane”? jakie powinny być wartości - dane treningowe? dane testowe? powinien to być tylko 1 obiekt (obraz), czy lista / tablica / krotka obiektów (obrazków)? Próbowałem wielu różnych kombinacji tego i żadna z nich nie działała. Kiedy ustawiłem „input_shape”, jak wspomniałeś, otrzymałem błąd „AttributeError: obiekt„ tuple ”nie ma atrybutu„ shape ””
Shir K
1
Zaktualizowałem odpowiednio swoją odpowiedź. Obraz, którego chcesz użyć, zależy od przypadku użycia, nie ma to nic wspólnego z kodem. Jeśli nadal jesteś zdezorientowany, może zadaj nowe pytanie na innej stronie wymiany stosów?
Thoo Rubenach
3

(Zakładając TF2)

Myślę, że najprostszym podejściem byłoby nazwać swoje warstwy, a następnie wywołać je przy użyciu standardowych danych wejściowych, aby model

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')
])

Następnie po prostu utwórz dane wejściowe i

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 jest tym, czego szukasz

Alternatywne podejście

Jeśli szukasz bardziej ogólnego rozwiązania, zakładając, że Twój model jest sekwencyjny, możesz użyć indexsłowa kluczowego w get_layerten sposób

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)

Na końcu tej pętli my_inputpowinno być to, czego szukasz

bluesummers
źródło
co rozumiesz przez „my_input = ... # Powinno być jak standardowe wejście do twojej sieci”? jaka powinna być wartość tego var?
Shir K,
1
Wszelkie standardowe dane wejściowe, takie jak te, których oczekuje model sekwencyjny - jeśli dane wejściowe to 28x28, powinieneś przekazać tablicę 1x28x28 dla jednego przykładu
bluesummers
1
Zredagowałem moją odpowiedź na
bluesummers
Jak wydrukować wartości w 'wyjście_z ukrytych'? Obecny wynik to „wyjście_z ukrytego tensora („ hidden_1 / Relu: 0 ”, shape = (1, 128), dtype = float32)”. Próbowałem użyć sesji i eval, ale otrzymuję błędy.
Shir K
1
Jeśli w TF2, zwykle powinieneś zadzwonić output_of_hidden.numpy() a to przekształci go w tablicę
numpy