TensorFlow联邦学习无法查看本地epoch输出及精度曲线绘制问题
问题1:输出指标是否为每轮迭代后全局模型的对应指标
不是,两类输出的含义有明确区别:
- 每次打印的
round xx, metrics=xxx内容中的准确率、损失值,是当前联邦轮次下所有客户端完成本地训练后,上报的本地训练指标的加权聚合平均值,仅反映客户端本地训练过程的平均效果,不是聚合更新完成后的全局模型对应指标。 - 每轮下方输出的
1/1 - 1s - loss: xxx - accuracy: xxx内容,是将聚合完成的全局模型权重加载到评估模型后,在验证集上运行评估得到的结果,这部分才是每轮迭代结束后,完成权重更新的全局模型的真实指标。
问题2:不使用TensorBoard绘制全局模型验证精度变化曲线的方法
你现有代码已经在每轮评估时将全局模型的验证精度、验证损失分别存入了tff_val_acc、tff_val_loss列表,不需要依赖TensorBoard,补充记录轮次序列后直接用matplotlib即可绘图,具体实现步骤如下:
- 训练启动前导入绘图库,初始化轮次记录列表:
import matplotlib.pyplot as plt tff_rounds = [] tff_val_acc = [] tff_val_loss = []
- 在每轮评估完成、存储验证指标的位置,补充记录当前轮次编号:
ev_result = eval_model.evaluate(x_val, y_val, verbose=2) tff_rounds.append(round_num) # 新增行,记录当前联邦轮次 tff_val_acc.append(ev_result[1]) tff_val_loss.append(ev_result[0])
- 所有轮次训练全部结束后,执行以下代码即可生成全局模型验证精度变化曲线:
# 绘制验证准确率曲线 plt.figure(figsize=(8, 4)) plt.plot(tff_rounds, tff_val_acc, marker='o', label='验证集准确率') plt.xlabel('联邦训练轮次') plt.ylabel('准确率') plt.title('全局模型验证精度变化曲线') plt.xticks(tff_rounds) # x轴刻度与每一轮对齐 plt.legend() plt.grid(alpha=0.3) plt.show()
注意:你提到的「10轮训练、每轮包含10个本地epoch」是客户端侧的本地训练配置,全局模型每完成1轮联邦聚合才会更新一次权重,因此全局模型的验证精度序列长度和联邦轮数一致(共10个数据点),不存在100个全局epoch对应的精度点。如果需要查看客户端本地每个epoch的训练指标,需要自定义客户端训练逻辑实现指标上报,TFF默认的迭代过程不会向外抛出本地逐epoch的训练指标。
额外提示:你贴出的核心代码中,for name, value in tff_metrics['train'].items():行存在多余缩进,运行时会抛出语法错误,需要调整缩进至与上方train_metrics = tff_metrics['train']行同级。
内容的提问来源于stack exchange,提问作者Dushi Fdz
相关产品推荐
相关产品推荐

