联邦学习【01】杨强第三章横向联邦学习复现

环境:有无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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值