在Keras中构建堆叠集成模型时出现Graph disconnected错误是什么原因?
报错根因
你触发Graph disconnected错误的核心原因是3个基模型各自持有独立的输入层节点,但你构建堆叠集成模型时仅绑定了最后一个基模型的输入层作为整个集成模型的输入,前两个基模型的输入层没有关联任何输入源,导致计算路径断裂。
另外你定义基模型时传入的model_input参数未实际使用,加载后的基模型仍然使用自身自带的输入层,没有实现多个基模型共享同一个输入张量的预期逻辑。
修复方案
直接重构集成模型的构建逻辑,所有基模型共享同一个全局输入张量即可,不需要手动修改层名、重复加载权重,修复后代码如下:
import tensorflow as tf from tensorflow.keras.layers import concatenate, Dense from tensorflow.keras.models import Model, load_model from tensorflow.keras.optimizers import SGD # 定义全局共享输入层,所有基模型共用该输入 shared_input = tf.keras.Input(shape=(224, 224, 3), name='shared_input') def get_base_model_output(weight_path, input_tensor): # 加载预训练基模型 base_model = load_model(weight_path) # 冻结基模型权重,训练时仅更新元学习层参数 for layer in base_model.layers: layer.trainable = False # 绑定输入张量,返回基模型在该输入下的输出张量 return base_model(input_tensor) # 依次获取三个基模型的输出,全部绑定到同一个共享输入 out_1 = get_base_model_output('model1.h5', shared_input) out_2 = get_base_model_output('model2.h5', shared_input) out_3 = get_base_model_output('model3.h5', shared_input) # 拼接三个基模型的输出概率向量 merge_layer = concatenate([out_1, out_2, out_3]) # 定义元学习层 hidden_layer = Dense(9, activation='relu')(merge_layer) output_layer = Dense(3, activation='softmax')(hidden_layer) # 构建完整堆叠模型 stacked_model = Model(inputs=shared_input, outputs=output_layer, name='stacking_ensemble') # 编译模型 sgd = SGD(learning_rate=1e-3, decay=1e-6, momentum=0.95, nesterov=True) stacked_model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy']) # 验证模型结构 stacked_model.summary()
额外说明
- 原代码中
load_model操作已经加载了权重,后续不需要再调用load_weights重复加载,属于冗余逻辑 - 用
base_model(input_tensor)的调用方式会自动处理不同基模型的层名冲突问题,不需要手动修改_name私有属性,兼容性更强
内容的提问来源于stack exchange,提问作者shiva
相关产品推荐
相关产品推荐

