You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

keras.utils.plot_model()重命名自定义层后模型结构绘制异常

Keras plot_model重命名层后仅显示线性结构的问题排查与解决

问题原因

  • 层重命名破坏了分支连接关系:手动重命名层后,若未同步更新后续合并/拼接层的输入引用,模型计算图会出现隐性断裂。summary()仅展示层的存在与参数,不会校验连接完整性,但plot_model依赖完整的计算图路径来绘制分支结构。
  • 自定义模型的命名映射混乱:若5个自制预训练模型是子类化Model,重命名内部层可能导致模型输入输出节点的映射关系错乱,plot_model无法解析多分支的嵌套结构。

解决方法

  1. 重命名后重新构建模型连接
    先完成所有层的重命名,再手动重新定义各分支的输出与合并逻辑,确保计算图完整:

    # 重命名TextVectorization层
    text_vec_title = TextVectorization(..., name="text_vectorizer_title")
    text_vec_body = TextVectorization(..., name="text_vectorizer_body")
    text_vec_tags = TextVectorization(..., name="text_vectorizer_tags")
    
    # 重命名自制预训练模型
    pretrained_title = CustomModel(..., name="pretrained_title_model")
    pretrained_body = CustomModel(..., name="pretrained_body_model")
    pretrained_tags = CustomModel(..., name="pretrained_tags_model")
    pretrained_meta1 = CustomModel(..., name="pretrained_meta_model1")
    pretrained_meta2 = CustomModel(..., name="pretrained_meta_model2")
    
    # 重新定义分支输出与合并
    out_title = pretrained_title(text_vec_title(input_title))
    out_body = pretrained_body(text_vec_body(input_body))
    out_tags = pretrained_tags(text_vec_tags(input_tags))
    out_meta1 = pretrained_meta1(input_meta1)
    out_meta2 = pretrained_meta2(input_meta2)
    
    concatenated = Concatenate(name="concat_all_branches")([out_title, out_body, out_tags, out_meta1, out_meta2])
    mlp_hidden = Dense(64, activation="relu", name="mlp_hidden_layer")(concatenated)
    final_out = Dense(1, activation="sigmoid", name="final_output")(mlp_hidden)
    
    # 重新构建完整模型
    ensemble = Model(inputs=[input_title, input_body, input_tags, input_meta1, input_meta2], outputs=final_out)
    
  2. 调用plot_model时指定关键参数
    使用expand_nested=True展开嵌套的自定义模型,show_shapes=True明确输入输出维度,强制绘制完整分支结构:

    keras.utils.plot_model(
        ensemble,
        to_file="ensemble_model.png",
        show_shapes=True,
        expand_nested=True,
        show_layer_names=True
    )
    
  3. 修复自定义模型的配置方法
    若自制预训练模型是子类化Model,需重写get_config()方法,确保层命名与结构信息能被正确序列化,让plot_model解析嵌套结构:

    class CustomModel(keras.Model):
        def __init__(self, ..., name=None):
            super().__init__(name=name)
            # 定义层
            self.dense1 = Dense(32, name="custom_dense1")
            self.dense2 = Dense(16, name="custom_dense2")
    
        def call(self, inputs):
            x = self.dense1(inputs)
            return self.dense2(x)
    
        def get_config(self):
            config = super().get_config()
            # 保存自定义层的配置
            config.update({
                "dense1": keras.layers.serialize(self.dense1),
                "dense2": keras.layers.serialize(self.dense2)
            })
            return config
    

内容的提问来源于stack exchange,提问作者Pavlo Yan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:27:07