如何将一个模型的中间层的输出作为另一个模型的输入



i训练模型A,并尝试将中间层的输出与name="layer_x"用作模型B的附加输入。

我尝试使用像keras doc上的中间层的输出https://keras.io/getting-started/faq/#how-can-i-i-obtain-the-putput-olex-of-an-intermendiate-layer。

模型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)

模型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)

当我调试时,我会在此行上出现错误:

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:WinPythonpython-3.5.3.amd64libsite-packageskeraslegacyinterfaces.py", line 87, in wrapper
  return func(*args, **kwargs)
File "C:WinPythonpython-3.5.3.amd64libsite-packageskerasenginetopology.py", line 1592, in __init__
  mask = node.output_masks[tensor_index]
AttributeError: 'Node' object has no attribute 'output_masks'

我可以使用get_layer("layer_x").output访问张量,而output_maskNone。我是否必须手动设置输出掩码,如果需要,我该如何设置此输出掩码?

您似乎做错了两件事:

intermediate_output = intermediate_layer_model.predict(data)

进行.predict()时,实际上是在通过图形传递数据,并询问结果是什么。当您这样做时, intermediate_output将是一个numpy数组,而不是您想要的图层。

其次,您无需重新创建新的中间模型。您可以直接使用您感兴趣的model_a的一部分。

这是一个为我"编译"的代码:

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)

我希望这是您想做的。

请告诉我是否有清楚的事情: - (

最新更新