web-dev-qa-db-fra.com

keras utilisant la sortie de la couche intermédiaire

Je forme un modèle A et j'essaie d'utiliser la sortie de la couche intermédiaire avec le nom = "layer_x" pour une entrée supplémentaire dans le modèle B.

J'ai essayé d'utiliser la sortie de la couche intermédiaire comme sur le document keras https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an- couche intermédiaire

Modèle A:

inputs = Input(shape=(100,))
dnn = Dense(1024, activation='relu')(inputs)
dnn = Dense(128, activation='relu', name="layer_x")(dnn)
dnn = Dense(1024, activation='relu')(dnn)
output = Dense(10, activation='softmax')(dnn)

Modèle B:

input_1 = Input(shape=(200,))
input_2 = Input(shape=(100,)) # input for model A

# loading model A
model_a = keras.models.load_model(path_to_saved_model_a)

intermediate_layer_model = Model(inputs=model_a.input, 
                                 outputs=model_a.get_layer("layer_x").output)

intermediate_output = intermediate_layer_model.predict(data)

merge_layer = concatenate([input_1, intermediate_output])
dnn_layer = Dense(512, activation="relu")(merge_layer)
output = Dense(5, activation="sigmoid")(dnn_layer)
model = keras.models.Model(inputs=[input_1, input_2], outputs=output)

Lorsque je débogue, j'obtiens une erreur sur cette ligne:

intermediate_layer_model = Model(inputs=model_a.input, 
                                 outputs=model_a.get_layer("layer_x").output)

File "..", line 89, in set_model
  outputs=self.neural_net_asc.model.get_layer("layer_x").output)
File "C:\WinPython\python-3.5.3.AMD64\lib\site-packages\keras\legacy\interfaces.py", line 87, in wrapper
  return func(*args, **kwargs)
File "C:\WinPython\python-3.5.3.AMD64\lib\site-packages\keras\engine\topology.py", line 1592, in __init__
  mask = node.output_masks[tensor_index]
AttributeError: 'Node' object has no attribute 'output_masks'

Je peux accéder au Tenseur avec get_layer ("layer_x"). Output et le output_mask est None. Dois-je définir manuellement un masque de sortie et comment configurer ce masque de sortie si nécessaire?

8
KyleReemoN-

Il y a deux choses que vous semblez mal faire:

intermediate_output = intermediate_layer_model.predict(data)

lorsque vous faites .predict(), vous passez en fait des données à travers le graphique et vous demandez quel sera le résultat. Lorsque vous faites cela, intermediate_output Sera un tableau numpy et non une couche comme vous le souhaiteriez.

Deuxièmement, vous n'avez pas besoin de recréer un nouveau modèle intermédiaire. Vous pouvez directement utiliser la partie de model_a Qui vous intéresse.

Voici un code qui "compile" pour moi:

from keras.layers import Input, Dense, concatenate
from keras.models import Model

inputs = Input(shape=(100,))
dnn = Dense(1024, activation='relu')(inputs)
dnn = Dense(128, activation='relu', name="layer_x")(dnn)
dnn = Dense(1024, activation='relu')(dnn)
output = Dense(10, activation='softmax')(dnn)

model_a = Model(inputs=inputs, outputs=output)

# You don't need to recreate an input for the model_a, 
# it already has one and you can reuse it
input_b = Input(shape=(200,))

# Here you get the layer that interests you from model_a, 
# it is still linked to its input layer, you just need to remember it for later
intermediate_from_a = model_a.get_layer("layer_x").output

# Since intermediate_from_a is a layer, you can concatenate it with the other input
merge_layer = concatenate([input_b, intermediate_from_a])
dnn_layer = Dense(512, activation="relu")(merge_layer)
output_b = Dense(5, activation="sigmoid")(dnn_layer)
# Here you remember that one input is input_b and the other one is from model_a
model_b = Model(inputs=[input_b, model_a.input], outputs=output_b)

J'espère que c'est ce que tu voulais faire.

Veuillez me dire si quelque chose n'est pas clair :-)

11
Nassim Ben