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

TensorFlow中两模型输出相加输入第三模型时图断开的正确性验证

问题分析与解决方案

原代码报错原因

原代码在model_C(addition)处触发Graph disconnected错误,核心原因是:model_C函数内部封装了一个Model对象,而你传入的addition是一个计算张量(不是Input层节点)。Keras的Model要求输入必须是显式的Input节点,直接用张量初始化Model会导致该Model的输入节点与外部计算图脱节,最终引发图断开问题。

修改后代码的逻辑正确性

你修改后的代码逻辑是正确的,完整实现了需求:

  1. 先基于inputs_C(合法的Input层)创建model_C的独立Model
  2. 通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:48:09