KarhouTam / FL-bench

Benchmark of federated learning. Dedicated to the community. 🤗
GNU General Public License v3.0
503 stars 82 forks source link

关于finetune的问题 #25

Closed TigerAB1 closed 1 year ago

TigerAB1 commented 1 year ago

您好,首先非常感谢您的开源精神和贡献,我在学习您的代码的时候我发现如果在生成数据的时候,如果我用--split user,那么在 ` def finetune(self): """ The fine-tune function. If your method has different fine-tuning opeation, consider to override this. This function will only be activated while in FL test round. """ self.model.train() for _ in range(self.args.finetune_epoch): for x, y in self.trainloader: if len(x) <= 1: continue

            x, y = x.to(self.device), y.to(self.device)
            logit = self.model(x)
            loss = self.criterion(logit, y)
            self.optimizer.zero_grad()
            loss.backward()
            self.optimizer.step()`时候,由于在test的时候for client_id in self.test_clients: ,那么self.trainloader且不是空的?不知道是我理解错误还是什么,如果您百忙之中能回答我的问题,我将不胜感激。
KarhouTam commented 1 year ago

您好,@TigerAB1。首先感谢您对这个开源项目的认可。

关于您的问题,使用 --split user 会使得数据集切分成:训练客户和测试客户。训练客户中的数据全部用来训练模型;而测试客户则全部数据均用于测试模型。这样 finetune 功能就不跟 --split user 相容,因为 finetune 需要客户端上有训练用数据。 如果您有需要用到 finetune 功能,建议切分数据集时使用 --split sample 或不指定参数(sample 为默认参数) 。 --split sample 会使每个客户端都分配到训练数据和测试数据。

TigerAB1 commented 1 year ago

好的,感谢