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?
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 :-)