Keras中集成ResNet50与DenseNet121遇图断开错误求助
解决Keras集成ResNet50和DenseNet121时的“Graph disconnected”错误
你猜的完全正确!这个错误的核心原因就是两个模型各自创建了独立的输入层,哪怕它们的输入形状完全一致,Keras的计算图也无法自动把它们关联到同一个输入源上,最终导致“图断开”的问题。
问题根源
当你直接加载ResNet50和DenseNet121且未指定input_tensor参数时,每个模型都会生成自己的输入层(比如报错里的input_8就是其中一个模型的输入层)。Keras的计算图要求所有层都必须连接到同一个输入张量,否则模型不知道该把输入数据喂给哪个输入层,自然就会抛出“无法获取张量值”的错误。
具体解决方案
我们只需要创建一个共享的输入层,让两个模型都基于这个输入层构建,就能解决这个问题。步骤如下:
定义共享输入张量
先创建一个符合模型输入要求的共享输入层:from tensorflow.keras.layers import Input # 匹配ResNet50和DenseNet121的默认输入形状 shared_input = Input(shape=(224, 224, 3))加载模型时指定共享输入
加载两个预训练模型时,通过input_tensor参数指定刚才创建的共享输入,同时设置include_top=False去掉顶层分类层:from tensorflow.keras.applications import ResNet50, DenseNet121 # 让两个模型共享同一个输入张量 resnet_base = ResNet50(include_top=False, input_tensor=shared_input, weights='imagenet') densenet_base = DenseNet121(include_top=False, input_tensor=shared_input, weights='imagenet')融合特征并构建最终模型
提取两个模型的特征输出,进行融合(比如拼接、相加等),再添加自定义的分类层:from tensorflow.keras.layers import Concatenate, GlobalAveragePooling2D, Dense from tensorflow.keras.models import Model # 获取两个模型的特征输出 resnet_features = resnet_base.output densenet_features = densenet_base.output # 融合特征(这里用拼接操作,你也可以根据需求用Add()、Multiply()等) merged_features = Concatenate(axis=-1)([resnet_features, densenet_features]) # 添加全局平均池化和分类层 x = GlobalAveragePooling2D()(merged_features) x = Dense(256, activation='relu')(x) # 替换num_classes为你的任务类别数 final_output = Dense(num_classes, activation='softmax')(x) # 构建完整的融合模型 combined_model = Model(inputs=shared_input, outputs=final_output)
额外注意事项
- 如果不需要预训练权重,可以把
weights参数设为None,但共享输入张量的设置逻辑完全相同。 - 如果后续需要冻结预训练模型的权重(只训练自定义层),可以通过
resnet_base.trainable = False和densenet_base.trainable = False来实现。
内容的提问来源于stack exchange,提问作者teddy
相关产品推荐
相关产品推荐

