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

TFF多输出FedAvg模型运行触发KeyError:0及TypeError如何修复

问题根因

1. KeyError:0

你的Keras模型输出是键为a/v的字典结构,但传入from_keras_model的loss是列表形式,TFF会默认用数字索引匹配输出,找不到索引0对应的输出项,因此抛出KeyError。

2. TypeError

仅传入单个损失函数时,TFF会把整个输出字典直接传给损失函数,而BinaryCrossentropy只能处理张量输入,无法解析字典结构,因此触发类型错误。

修复步骤

步骤1:修复CNN模型的语法错误

当前CNN模型的第一层全连接层输入写错了,还未定义变量x就直接调用,需要改为对接输入层inp:

def CNN():
    inp = Input(shape=(13055,))
    # 修正输入为inp
    x = Dense(units=64, activation='relu')(inp)
    a = Dense(units=unit, activation=activ, name='a')(x)
    v = Dense(units=unit, activation=activ, name='v')(x)
    model = Model(inputs=inp, outputs={'a': a, 'v': v})
    return model

步骤2:调整损失、指标的传入格式为字典

将model_fn中传入的loss和metrics都改为字典格式,和模型输出的key一一对应:

def model_fn(self):
    fed_model = CNN()
    return tff.learning.from_keras_model(
      fed_model,
      input_spec=self.preprocessed_sample_dataset.element_spec,
      # 损失用字典匹配每个输出的key
      loss={
          'a': tf.keras.losses.BinaryCrossentropy(),
          'v': tf.keras.losses.BinaryCrossentropy()
      },
      # 指标同样用字典,每个输出对应独立的指标计算
      metrics={
          'a': tf.keras.metrics.BinaryAccuracy(),
          'v': tf.keras.metrics.BinaryAccuracy()
      })

可选:配置损失权重

如果需要为不同输出的损失设置不同权重,可以新增loss_weights参数,同样用字典格式传入:

loss_weights={'a': 0.5, 'v': 0.5}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:27:03