【问题标题】:How to split a model trained in keras?如何拆分在 keras 中训练的模型?
【发布时间】:2018-08-18 00:15:09
【问题描述】:

我训练了一个具有 4 个隐藏层和 2 个密集层的模型,并且我保存了该模型。

现在我想加载那个模型并想分成两个模型,一个有一个隐藏层,另一个只有一个密集层。

我已经通过以下方式将模型与隐藏层分开

model = load_model ("model.hdf5")
HL_model = Model(inputs=model.input, outputs=model.layers[7].output)

这里的模型是加载模型,在第 7 层是我的最后一个隐藏层。我试图将密集的东西分开

DL_model = Model(inputs=model.layers[8].input, outputs=model.layers[-1].output)

我收到错误

TypeError: Input layers to a `Model` must be `InputLayer` objects.

拆分后,HL_model的输出将成为DL_model的输入。

谁能帮我创建一个具有密集层的模型?


PS: 我也试过下面的代码

from keras.layers import Input 
inputs = Input(shape=(9, 9, 32), tensor=model_1.layers[8].input)
model_3 = Model(inputs=inputs, outputs=model_1.layers[-1].output)

并得到错误

RuntimeError: Graph disconnected: cannot obtain value for tensor Tensor("conv2d_1_input:0", shape=(?, 144, 144, 3), dtype=float32) at layer "conv2d_1_input". The following previous layers were accessed without issue: []

这里(144, 144, 3)模型的输入图像尺寸中。

【问题讨论】:

    标签: machine-learning deep-learning keras conv-neural-network


    【解决方案1】:

    您需要先指定一个新的Input 层,然后将剩余的层堆叠在上面:

    DL_input = Input(model.layers[8].input_shape[1:])
    DL_model = DL_input
    for layer in model.layers[8:]:
        DL_model = layer(DL_model)
    DL_model = Model(inputs=DL_input, outputs=DL_model)
    

    【讨论】:

    • 谢谢,我按照您的建议进行操作。我收到错误ValueError: The shape of the input to "Flatten" is not fully defined (got (None, 9, 9, 32). Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model. 然后我将DL_input = Input(model.layers[8].input_shape) 更改为DL_input = Input((9, 9, 32),这是图层的实际形状。现在它正在工作。
    • 信息量很大,所以我投了赞成票。请进行必要的更改,以便我可以接受它作为答案。
    • @Akhilesh 对,我已经编辑了第一行(传递给Input 的形状不应该包含第一个批次维度,但input_shape 包含),现在检查它是否有效。跨度>
    • 此方法是否传输权重和偏差?
    • 如果您的网络不是完全连续的,这将不起作用。例如,如果它有跳过连接
    【解决方案2】:

    更通用一点。您可以使用以下函数来拆分模型

    from keras.layers import Input
    from keras.models import Model
    def get_bottom_top_model(model, layer_name):
        layer = model.get_layer(layer_name)
        bottom_input = Input(model.input_shape[1:])
        bottom_output = bottom_input
        top_input = Input(layer.output_shape[1:])
        top_output = top_input
    
        bottom = True
        for layer in model.layers:
            if bottom:
                bottom_output = layer(bottom_output)
            else:
                top_output = layer(top_output)
            if layer.name == layer_name:
                bottom = False
    
        bottom_model = Model(bottom_input, bottom_output)
        top_model = Model(top_input, top_output)
    
        return bottom_model, top_model
    bottom_model, top_model = get_bottom_top_model(model, "dense_1")
    

    Layer_name 只是您要拆分的层的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多