Come produrre il secondo livello di una rete?


9

Il mio modello è addestrato sulle immagini digitali ( MNIST dataset). Sto provando a stampare l'output del secondo strato della mia rete, un array di 128 numeri.

Dopo aver letto un sacco di esempi - per esempio questo , e questo , o questo .

Non sono riuscito a farlo sulla mia rete. Nessuna delle soluzioni funziona con il mio algoritmo.

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

Ho ricevuto molti messaggi di errore diversi. Ho provato a gestirli tutti, ma non sono riuscito a capirlo da solo.

Cosa mi sto perdendo? Come produrre il secondo livello? Se la mia forma è (28,28): quale dovrebbe essere il tipo e il valore di input_shape?


Prove ed errori non riusciti, ad esempio:

(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: gli input dovrebbero essere un elenco o una tupla.

(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: errore durante la lettura della variabile di risorsa dense_1 / bias dal contenitore: localhost. Ciò potrebbe significare che la variabile non è stata inizializzata. Non trovato: il localhost del contenitore non esiste. (Impossibile trovare la risorsa: localhost / dense_1 / bias) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]


1
I collegamenti alla tua domanda sono interrotti, per favore aggiungili per avere un'idea di quello che hai provato
Théo Rubenach,

@TéoRubenach Fatto
Shir K il

Risposte:


3

Sembra che tu stia mescolando vecchie keras (prima di tensorflow 2.0:) import kerase nuove keras ( from tensorflow import keras).

Cerca di non usare le vecchie macchine fotografiche insieme a tensorflow> = 2.0 (e di non fare riferimento alla vecchia documentazione come nel tuo primo link), poiché è facilmente confusa con quella nuova (sebbene nulla di strettamente illogico):

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'

Il comportamento sarà altamente instabile mescolando queste due librerie.

Una volta fatto questo, usando una risposta da quello che hai provato, m essere il tuo modello ed my_input_shapeessere la forma dei tuoi modelli, ad esempio la forma di un'immagine (qui (28, 28) o (1, 28, 28) se hai lotti):

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

Se hai un'immagine imgpuoi scrivere direttamentenew_temp_model.predict(img)


Rubenach cosa intendi con "my_input_shape"? quale dovrebbe essere il valore di quel var?
Shir K

1
bene la forma dell'input del tuo modello, lo hai anche nel tuo codice quando definisci il tuo modello:input_shape=(28, 28)
Théo Rubenach,

1
qui uso dati casuali, ma nel tuo caso dovresti sostituirli my_input_datacon i tuoi dati ovviamente
Théo Rubenach,

Cosa intendi con "i tuoi dati"? quali dovrebbero essere i valori interni - dati di allenamento? dati di test? dovrebbe essere solo 1 oggetto (immagine) o un elenco / matrice / tupla di oggetti (immagini)? Ho provato molte combinazioni diverse di questo e nessuno ha funzionato. Quando ho impostato 'input_shape' come hai detto, ho ricevuto l'errore '' AttributeError: l'oggetto 'tuple' non ha attributo 'forma' '
Shir K

1
Ho aggiornato la mia risposta di conseguenza. L'immagine che vuoi usare dipende dal tuo caso d'uso, non ha nulla a che fare con il codice. Se sei ancora confuso, forse fai una nuova domanda su un altro sito stackexchange?
Théo Rubenach,

3

(Supponendo TF2)

Penso che l'approccio più semplice sarebbe quello di nominare i livelli e quindi chiamarli con input standard, quindi il tuo modello potrebbe apparire come

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

Quindi basta creare un input e

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 è quello che stai cercando

Approccio alternativo

Se stai cercando una soluzione più generale, supponendo che il tuo modello sia sequenziale, puoi usare la indexparola chiave get_layerlike this

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)

Alla fine di questo ciclo my_inputdovrebbe essere quello che stai cercando


cosa intendi con "my_input = ... # Dovrebbe essere come l'input standard alla tua rete"? quale dovrebbe essere il valore di quel var?
Shir K

1
Qualsiasi input standard, come quello che si aspetta il modello sequenziale - se l'input è 28x28, dovresti passare l'array 1x28x28 per un singolo esempio
bluesummers il

1
Ho modificato la mia risposta a
bluesummers il

Come stampare i valori all'interno di 'output_of_hidden'? Il risultato attuale è 'output_of_hidden Tensor ("hidden_1 / Relu: 0", shape = (1, 128), dtype = float32)'. Ho provato a utilizzare session & eval ma ricevo errori.
Shir K

1
Se in TF2, di solito dovresti chiamare output_of_hidden.numpy()e lo convertirà in matrice
numpy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.