如何将一个模型的中间层的输出用作另一模型的输入? [英] How can I use the output of intermediate layer of one model as input to another model?

查看:750
本文介绍了如何将一个模型的中间层的输出用作另一模型的输入?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我训练了模型A,并尝试将带有name="layer_x"的中间层的输出用作模型B的附加输入.

I train a model A and try to use the output of the intermediate layer with the name="layer_x" as an additional input for model B.

我试图像Keras doc一样使用中间层的输出 https://keras.io/getting-started/faq/#如何获取中间层的输出.

I tried to use the output of the intermediate layer like on the Keras doc https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-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)

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

When I debug I get an error on this line:

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'

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

I can access the tensor with get_layer("layer_x").output and the output_mask is None. Do I have to set manually an output mask and how do I set up this output mask if needed?

推荐答案

您似乎做错了两件事:

intermediate_output = intermediate_layer_model.predict(data)

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

when you do .predict(), you are actually passing data through the graph and asking what will be the result. When you do that, intermediate_output will be a numpy array and not a layer as you would like it to be.

第二,您不需要重新创建新的中间模型.您可以直接使用model_a中您感兴趣的部分.

Secondly, you don't need to recreate a new intermediate model. You can directly use the part of model_a that interest you.

这是为我编译"的代码:

Here is a code that "compiles" for me :

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)

我希望这就是你想要做的.

I hope this is what you wanted to do.

请告诉我是否不清楚:-)

Please tell me if something isn't clear :-)

这篇关于如何将一个模型的中间层的输出用作另一模型的输入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆