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
相关产品推荐
相关产品推荐

