Comment sortir la deuxième couche d'un réseau?

9

Mon modèle est formé aux images numériques ( MNIST dataset). J'essaie d'imprimer la sortie de la deuxième couche de mon réseau - un tableau de 128 chiffres.

Après avoir lu beaucoup d'exemples - par exemple ce , et cela , ou cela .

Je n'ai pas réussi à le faire sur mon propre réseau. Aucune des solutions ne fonctionne avec mon propre algorithme.

Lien vers Colab: https://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv?fbclid=IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRXxAx3b98I

J'ai reçu beaucoup de messages d'erreur différents. J'ai essayé de gérer chacun d'eux, mais je ne pouvais pas le comprendre par moi-même.

Qu'est-ce que je rate? Comment sortir la deuxième couche? Si ma forme est (28,28)- quel devrait être le type et la valeur de input_shape?


Essais et erreurs ayant échoué, par exemple:

(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: les entrées doivent être une liste ou un tuple.

(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: Erreur lors de la lecture de la variable de ressource dense_1 / biais du conteneur: localhost. Cela pourrait signifier que la variable n'était pas initialisée. Introuvable: l'hôte local de conteneur n'existe pas. (Impossible de trouver la ressource: localhost / dense_1 / biais) [[{{node dense_1 / BiasAdd / ReadVariableOp}}]]

Shir K
la source
1
Les liens dans votre question sont brisés, veuillez les ajouter pour avoir une idée de ce que vous avez essayé
Théo Rubenach
@ ThéoRubenach Fait
Shir K

Réponses:

3

On dirait que vous mélangez d'anciens keras (avant tensorflow 2.0:) import keraset de nouveaux keras ( from tensorflow import keras).

Essayez de ne pas utiliser d'anciens kéros avec tensorflow> = 2.0 (et de ne pas vous référer à l'ancienne documentation comme dans votre premier lien), car elle est facilement confondue avec la nouvelle (bien que rien de strictement illogique):

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'

Le comportement sera très instable en mélangeant ces deux bibliothèques.

Une fois cela fait, en utilisant une réponse de ce que vous avez essayé, m étant votre modèle et my_input_shapeétant la forme de vos modèles, c'est-à-dire la forme d'une image (ici (28, 28) ou (1, 28, 28) si vous avez lots):

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

Si vous avez une image, imgvous pouvez directement écrirenew_temp_model.predict(img)

Théo Rubenach
la source
Rubenach, que voulez-vous dire par «my_input_shape»? quelle devrait être la valeur de cette var?
Shir K
1
bien la forme d'entrée de votre modèle, vous l'avez même dans votre propre code lors de la définition de votre modèle:input_shape=(28, 28)
Théo Rubenach
1
ici j'utilise des données aléatoires, mais dans votre cas, vous devez remplacer my_input_datapar vos propres données bien sûr
Théo Rubenach
Qu'entendez-vous par «vos propres données»? quelles devraient être les valeurs à l'intérieur - les données de formation? données de test? Doit-il s'agir d'un seul objet (image) ou d'une liste / tableau / tuple d'objets (images)? J'ai essayé de nombreuses combinaisons différentes de cela et rien de tout cela n'a fonctionné. Lorsque j'ai défini 'input_shape' comme vous l'avez mentionné, j'ai reçu l'erreur '' AttributeError: l'objet 'tuple' n'a pas d'attribut 'shape' '
Shir K
1
J'ai mis à jour ma réponse en conséquence. L'image que vous souhaitez utiliser dépend de votre cas d'utilisation, elle n'a rien à voir avec le code. Si vous êtes toujours confus, posez peut-être une nouvelle question sur un autre site stackexchange?
Théo Rubenach
3

(En supposant TF2)

Je pense que l'approche la plus simple serait de nommer vos couches, puis de les appeler avec une entrée standard, de sorte que votre modèle pourrait ressembler à

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

Ensuite, créez simplement une entrée et

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 est ce que vous cherchez

Approche alternative

Si vous cherchez une solution plus générale, en supposant que votre modèle est séquentiel, vous pouvez utiliser le indexmot - clé get_layercomme ceci

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)

À la fin de cette boucle my_inputdevrait être ce que vous recherchez

bluesummers
la source
que voulez-vous dire par «my_input = ... # Devrait être comme l'entrée standard de votre réseau»? quelle devrait être la valeur de cette var?
Shir K
1
Toute entrée standard, comme ce à quoi le modèle séquentiel s'attend - si votre entrée est 28x28, vous devez passer un tableau 1x28x28 pour un seul exemple
bluesummers
1
Modifié ma réponse à
bluesummers
Comment imprimer les valeurs à l'intérieur de 'output_of_hidden'? Le résultat actuel est 'output_of_hidden Tensor ("hidden_1 / Relu: 0", shape = (1, 128), dtype = float32)'. J'ai essayé d'utiliser session & eval mais je reçois des erreurs.
Shir K
1
Si dans TF2, vous devriez généralement appeler output_of_hidden.numpy()et il le convertira en tableau
numpy