TensorFlow中两模型输出相加输入第三模型时图断开的正确性验证
问题分析与解决方案
原代码报错原因
原代码在model_C(addition)处触发Graph disconnected错误,核心原因是:model_C函数内部封装了一个Model对象,而你传入的addition是一个计算张量(不是Input层节点)。Keras的Model要求输入必须是显式的Input节点,直接用张量初始化Model会导致该Model的输入节点与外部计算图脱节,最终引发图断开问题。
修改后代码的逻辑正确性
你修改后的代码逻辑是正确的,完整实现了需求:
- 先基于
inputs_C(合法的Input层)创建model_C的独立Model - 通过
modelC(addition)调用该Model,相当于把addition张量作为model_C的输入,让model_C的所有层重新连接到addition节点上,最终形成连通的计算图:输入→ model_A/model_B → 逐元素相加 → model_C → 最终输出
不过这个写法可以进一步简化,推荐两种更简洁的实现方式:
方式1:将model_C改为返回层序列(不封装为Model)
如果不需要单独复用model_C,直接让它返回输出张量,更适合嵌套到大模型中:
def model_C(inputs): f1 = Conv2D(32, 3, padding='same')(inputs) f1 = BatchNormalization()(f1) f1 = Activation('relu')(f1) f2 = Conv2D(16, 3, padding='same')(f1) f2 = BatchNormalization()(f2) f2 = Activation('relu')(f2) f3 = Conv2D(1, 3, padding='same')(f2) # 直接返回输出张量,不创建Model return f3 def model_final(height, width, channels): inputs = Input((height, width, channels)) modelA = model_A(inputs) modelB = model_B(inputs) addition = Add()([modelA.output, modelB.output]) # 直接传入张量得到输出 c_output = model_C(addition) return Model(inputs, c_output)
方式2:保留model_C为独立Model(简化版)
如果需要单独训练或复用model_C,可以保留Model封装,同时简化代码:
def model_final(height, width, channels): inputs = Input((height, width, channels)) modelA = model_A(inputs) modelB = model_B(inputs) addition = Add()([modelA.output, modelB.output]) # 直接创建model_C并传入张量,无需额外定义inputs_C modelC = model_C(Input(shape=(height, width, 32))) c_output = modelC(addition) return Model(inputs, c_output)
总结
你修改后的代码完全符合需求逻辑,可正常运行。上述优化方式能让代码更简洁直观,可根据是否需要复用model_C来选择。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

