【问题标题】:How can I use the output of intermediate layer of one model as input to another model?如何将一个模型的中间层的输出用作另一个模型的输入?
【发布时间】:2018-02-17 21:57:24
【问题描述】:

我训练了一个模型 A 并尝试使用带有 name="layer_x" 的中间层的输出作为模型 B 的附加输入。

我尝试使用 Keras 文档中的中间层的输出 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)

当我调试时,我在这一行得到一个错误:

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。我是否必须手动设置输出掩码?如果需要,如何设置此输出掩码?

【问题讨论】:

    标签: python tensorflow neural-network keras


    【解决方案1】:

    您似乎做错了两件事:

    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)
    

    我希望这是你想做的。

    如果有什么不清楚的地方请告诉我:-)

    【讨论】:

    • 嘿,我终于发现了我的错误,我使用了 tensorflow.python.keras api,在这里我从 keras.models 导入了 2 个不同的 keras 版本的 tensorflow 和纯 keras 不能一起工作:) 但谢谢为了您的回答,但我现在也不使用 predict 方法
    • @Nassim 哪个是训练这种“模型链”的正确方法?
    • 这真的取决于情况......自然的方式似乎是1)训练模型A,2)冻结公共层,3)用模型A的冻结层训练模型B
    • @NassimBen 我明白了,我希望在一些 keras (tensorflow) 魔术中进行一次训练......
    • 这种模型确实是特定于应用程序的......你训练它的方式真的取决于这两个模型连接的原因......所以据我所知没有魔法:D对不起
    猜你喜欢
    • 2018-05-20
    • 2019-03-03
    • 1970-01-01
    • 2018-11-22
    • 2018-09-24
    • 2020-05-28
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多