环境:有无gpu均可
anaconda环境:conda install pytorch1.13.1 torchvision0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia
具体安装命令结合自己的gpu的cuda版本
项目代码放在
https://gitee.com/ihan1001gitee
https://github.com/ihan1001github
项目架构
conf.json文件,存放训练参数
{
"model_name" : "resnet18",
"no_models" : 10,
"type" : "cifar",
"global_epochs" :20,
"local_epochs" : 3,
"k" : 10,
"batch_size" : 32,
"lr" : 0.001,
"momentum" : 0.0001,
"lambda" : 0.1
}
model_name:模型名称
no_models:客户端总数量
type:数据集信息
global_epochs:全局迭代次数,即服务端与客户端的通信迭代次数
local_epochs:本地模型训练迭代次数
k:每一轮迭代时,服务端会从所有客户端中挑选k个客户端参与训练。
batch_size:本地训练每一轮的样本数
lr,momentum,lambda:本地训练的超参数设置
lr(learning rate)表示模型在每一次迭代时更新参数的步长大小。通常需要根据数据集和模型的具体情况来选择一个合适的学习率,如果学习率过高,则容易导致参数更新过快而无法收敛;如果学习率过低,则会使得模型收敛速度变慢甚至无法收敛。例如,可以使用optim.SGD类中的lr参数来设置学习率。
momentum是一种加速梯度下降的方法,它可以在更新参数的过程中积累之前的梯度信息,并将其作为当前梯度的一部分。这样可以使得梯度下降更加平滑,避免震荡或者陷入局部极小值。通常可以将momentum设置为0.9左右,具体取值也需要根据数据集和模型来进行调整。例如,可以使用optim.SGD类中的momentum参数来设置动量。
lambda是一种正则化方法,用于避免模型过拟合。正则化可以通过对模型的损失函数添加一个惩罚项来实现。通常有两种常见的正则化方法:L1正则化和L2正则化。L1正则化会使得模型的权重向量变得更加稀疏,可以通过torch.nn.L1Loss或者optim.L1Loss来实现;L2正则化则会使得模型的权重向量变得更加平滑,可以通过torch.nn.MSELoss或者optim.MSELoss来实现。参数lambda用于控制正则化项的大小,通常需要根据数据集和模型的具体情况来进行调整。
dataset.py
'''
-*- coding: utf-8 -*-
@Time : 2023/11/23 17:35
@Author : ihan
@File : FederateAI
@Software: PyCharm
'''
import torch
from torchvision import datasets, transforms
#获取数据集
#调用语句 train_datasets, eval_datasets = datasets.get_dataset("./data/", conf["type"])
def get_dataset(dir, name):
if name == 'mnist':
train_dataset = datasets.MNIST(dir, train=True, download=True, transform=transforms.ToTensor())
print(train_dataset)
print("--------------------")
'''
dir 数据路径
train=True 代表训练数据集 Flase代表测试数据集
download 是否从互联网下载数据集并存放在dir中
transform=transforms.ToTensor() 表示将图像转换为张量形式
'''
eval_dataset = datasets.MNIST(dir, train=False, transform=transforms.ToTensor())
print(eval_dataset)
print("--------------------")
elif name == 'cifar':
'''
transforms.Compose 是将多个transform组合起来使用(由transform构成的列表)
'''
transform_train = transforms.Compose([
#
transforms.RandomCrop(32, padding=4),#transforms.RandomCrop: 切割中心点的位置随机选取
#随机裁剪原始图像,裁剪的大小为32x32像素,padding参数表示在图像的四周填充4个像素,以避免裁剪后图像边缘信息丢失。
transforms.RandomHorizontalFlip(),#以0.5的概率对图像进行随机水平翻转,增加数据集的多样性。
transforms.ToTensor(),#将图像转换为张量形式,便于后续处理。
#transforms.Normalize: 给定均值:(R,G,B) 方差:(R,G,B),将会把Tensor正则化
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
#对图像进行标准化操作,减去均值并除以标准差。这里使用的均值和标准差是CIFAR-10数据集的全局均值和标准差,可以使模型更容易收敛。
])
print(transform_train)
print("--------------------")
transform_test = transforms.Compose