FedProto代码复现

github clone到本地后,配置环境部分略 貌似我没有按照原论文FedProto: Federated Prototype Learning across Heterogeneous Clients标准环境来配置,原文的版本要求如下:

Requirements:
Python 3.6 or greater
PyTorch 1.6 or greater
Torchvision
Numpy 1.18.5

我的各个版本如下:

python 3.12.1
pytorch 2.2.0
numpy 1.26.4

目前来说大致没有问题 原文实验结果:

针对第一条指令 按照原文指令分别运行:

python federated_main.py --mode task_heter --dataset mnist --num_classes 10 --num_users 20 --ways 3 --shots 100 --stdev 2 --rounds 100 --train_shots_max 110 --ld 1
python federated_main.py --mode task_heter --dataset mnist --num_classes 10 --num_users 20 --ways 4 --shots 100 --stdev 2 --rounds 100 --train_shots_max 110 --ld 1
python federated_main.py --mode task_heter --dataset mnist --num_classes 10 --num_users 20 --ways 5 --shots 100 --stdev 2 --rounds 100 --train_shots_max 110 --ld 1

三个指令跑出来分别有如下结果:

mnist - ways = 3

mnist - ways = 4

mnist - ways = 5

对比原文:

MNIST 数据集
accurary/n_sizen=3n=4n=5
my_with proto98.3997.2296.57
the paper_with proto97.13+-0.3096.80+-0.4196.70+-0.29
可以看到与原文有一些微妙偏差 但总体来说达到甚至超过了原文的 accuary

针对第二条指令:

python federated_main.py --mode model_heter --dataset femnist --num_classes 62 --num_users 20 --ways 3 --shots 100 --stdev 2 --rounds 120 --train_shots_max 110 --ld 1
python federated_main.py --mode model_heter --dataset femnist --num_classes 62 --num_users 20 --ways 4 --shots 100 --stdev 2 --rounds 120 --train_shots_max 110 --ld 1
python federated_main.py --mode model_heter --dataset femnist --num_classes 62 --num_users 20 --ways 5 --shots 100 --stdev 2 --rounds 120 --train_shots_max 110 --ld 1

在运行的时候并不顺利 似乎是不存在对应设置的路径

检查系统目录后发现确实不存在这样一个路径 于是我自己根据readme文件中的链接自己下载了by_class.zip,并创建了如上图所示的对应路径,于是运行成功,但训练过程中又出现如下问题:

经检查对应目录确实没有这个图片,猜测可能是循环范围过大(?)

阅读源码后发现可能是由于shell传入的train_shorts_max过大,这可能是由于数据集是我自行下载于作者使用的不完全相同

num_img = args.train_shots_max * args.num_users

我尝试将tran_shots_maxs由110修改为100,发现训练可以正常运行了!

python federated_main.py --mode model_heter --dataset femnist --num_classes 62 --num_users 20 --ways 3 --shots 100 --stdev 2 --rounds 120 --train_shots_max 100 --ld 1

悲,在训练结束后发现,仍然报错:

发现是 解包的问题 我们找到对应的代码:

原代码:

    accurary/n_sizecc_list_l, acc_list_g = test_inference_new_het_lt(args, local_model_list, test_dataset, classes_list, user_groups_lt, global_protos)
    print('For all users (with protos), mean of test acc is {:.5f}, std of test acc is {:.5f}'.format(np.mean(acc_list_g),np.std(acc_list_g)))
    print('For all users (w/o protos), mean of test acc is {:.5f}, std of test acc is {:.5f}'.format(np.mean(acc_list_l), np.std(acc_list_l)))

修改为:

    acc_list_l, acc_list_g,loss_list = test_inference_new_het_lt(args, local_model_list, test_dataset, classes_list, user_groups_lt, global_protos)
    print('For all users (with protos), mean of test acc is {:.5f}, std of test acc is {:.5f}'.format(np.mean(acc_list_g),np.std(acc_list_g)))
    print('For all users (w/o protos), mean of test acc is {:.5f}, std of test acc is {:.5f}'.format(np.mean(acc_list_l), np.std(acc_list_l)))
    print('For all users (with protos), mean of proto loss is {:.5f}, std of test acc is {:.5f}'.format(np.mean(loss_list), np.std(loss_list)))

并用comm rounds=1来测试:

结果正常!

修改代码后 最终结果为:

femnist ways = 3

femnist ways = 4

在运行ways =5这条指令的时候:

python federated_main.py --mode model_heter --dataset femnist --num_classes 62 --num_users 20 --ways 5 --shots 100 --stdev 2 --rounds 120 --train_shots_max 110 --ld 1

运行一轮(Global Round 0结束)后再次报错。。

IndexError: list index out of range

femnist.py中添加代码逻辑查看是不是数据索引越界了:

由输出可以知道,确实是对应数据下标溢出了

添加新的代码逻辑修复这个问题:

问题成功解决,在由Global Round 0跳转到Global Round 1时不再报错。

运行结果如下:

FEMNIST 数据集
accuracy/n_sizen=3n=4n=5
my with proto95.8494.4394.63
the paper with proto96.82+-1.7594.93+-1.6193.67+-2.23

针对第三条指令 分别运行:

python federated_main.py --mode task_heter --dataset cifar10 --num_classes 10 --num_users 20 --ways 3 --shots 100 --stdev 2 --rounds 110 --train_shots_max 110 --ld 0.1 --local_bs 32
python federated_main.py --mode task_heter --dataset cifar10 --num_classes 10 --num_users 20 --ways 4 --shots 100 --stdev 2 --rounds 110 --train_shots_max 110 --ld 0.1 --local_bs 32
python federated_main.py --mode task_heter --dataset cifar10 --num_classes 10 --num_users 20 --ways 5 --shots 100 --stdev 2 --rounds 110 --train_shots_max 110 --ld 0.1 --local_bs 32

结果如下:

cifar10 - ways = 3

cifar10 - ways = 4

cifar10 - ways =5

对比原文:

CIFAR10 数据集
acc/n_sizen=3n=4n=5
my_with proto68.9054.8359.10
the paper_with proto84.49+-1.9779.12+-2.0377.08+-1.98

于原文精确度相差比较大,尝试在github原仓库寻找解决办法:

发现这个问题貌似是普遍存在?

找到了两条比较新的评论 问题仍未解决...

<think>好的,用户想查找与FedFV相关的代码或实现。首先,我需要确定FedFV的具体含义。FedFV可能指的是联邦学习中的某个算法或框架,比如联邦平均(FedAvg)的变种,或者是其他优化方法如FedProx、FedFV(可能指联邦公平性优化或其他)? 首先,我应该验证FedFV是否是一个已知的联邦学习算法。通过快速回忆,联邦学习中的常见算法包括FedAvg、FedProx、FedMA、SCAFFOLD等。FedFV可能是一个较新的方法,或者可能是特定论文中提出的算法,比如联邦公平性优化(Federated Fairness Vertical)或者其他名称的变体。 接下来,考虑用户可能需要的是联邦学习框架中FedFV的实现,或者是否有开源代码库提供了相关实现。常见的联邦学习框架如TensorFlow Federated(TFF)、PyTorch的FedML、FATE等,可能包含各种算法的实现。此外,GitHub、GitLab等代码托管平台可能有研究者的个人实现。 用户可能没有提供足够的信息,比如FedFV的全称或相关论文,因此需要进一步询问或假设。假设FedFV是指某个特定论文中的方法,比如《FedFV: A Fair and Verifiable Federated Learning Framework》或其他类似标题的论文,那么正确的做法是建议用户查阅相关论文,通常论文会在GitHub上提供官方代码链接。 另外,考虑用户可能在寻找现成的代码示例,但若FedFV不是广泛实现的算法,可能需要指导用户如何自行实现,比如基于现有联邦学习框架扩展,或者参考论文中的伪代码进行编码。 还需要检查是否有引用来源中提到相关实现。例如,引用[1]提到代码生成LLM对开发有帮助,可能暗示用户可以使用这类工具辅助编写代码,但需要确保正确性。引用[2]关于VS Code的信息可能与开发环境相关,但和FedFV本身无关。 总结步骤: 1. 确认FedFV的具体定义和来源。 2. 建议用户查阅相关论文获取官方代码链接。 3. 推荐联邦学习框架,检查是否包含FedFV实现。 4. 指导用户使用GitHub等平台搜索。 5. 提供基于现有框架的实现思路。 6. 提醒用户注意数据隐私和合规要求。 可能的问题:用户可能不清楚FedFV的全称或出处,需要引导他们提供更多信息。同时,如果FedFV是较新的或小众算法,开源实现可能有限,需要建议他们根据论文自行实现。</think>[用户可见层] ### 关于FedFV代码实现的查找建议 #### 1. **确认FedFV的具体定义** FedFV可能指代不同场景下的联邦学习优化算法。例如: - **联邦公平性优化**(Federated Fairness Vertical) - **联邦特征验证**(Federated Feature Validation) - 特定论文中提出的方法(如《FedFV: A Communication-Efficient Federated Learning Framework》) 建议先通过**论文或技术文档**明确其全称和上下文,这有助于精准搜索代码[^1]。 #### 2. **查找官方开源代码** - **方法1:关联论文搜索** 如果FedFV出自某篇论文,通常作者会在GitHub发布官方实现。例如: - 在Google Scholar搜索论文标题,查看“代码”或“GitHub”链接 - 访问论文作者的实验室主页或GitHub账户 - **方法2:联邦学习框架扩展** 主流框架如 **TensorFlow Federated (TFF)** 或 **PyTorch FedML** 可能包含类似算法的实现。例如: ```python # FedML示例代码结构(需根据FedFV论文修改) from fedml.core.alg_frame.client import Client class FedFVClient(Client): def local_train(self, model, dataset): # 实现本地训练逻辑 ``` #### 3. **GitHub关键词搜索** - **搜索建议** 使用组合关键词:`FedFV federated learning`、`FedFV implementation`、`FedFV code` - 示例结果: - [联邦学习公平性代码库](https://github.com/fedfv/fairness)(假设链接) - [FedFV通信优化实现](https://github.com/user/fedfv) #### 4. **自行实现参考步骤** 若无可直接使用的代码,可基于以下流程实现: 1. **复现算法逻辑** 根据论文伪代码编写核心部分,例如聚合策略或本地更新规则。 2. **选择基础框架** 基于PyTorch或TensorFlow构建联邦学习流程。 3. **集成验证模块** 若FedFV包含验证机制(如模型参数校验),需添加加密或哈希校验逻辑。 #### 5. **注意事项** - **数据隐私**:联邦学习涉及多方数据,需确保代码符合GDPR等规范。 - **依赖库版本**:TensorFlow Federated等框架需匹配特定Python版本。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值