Pysyft学习笔记02,开始FL

本文介绍了联邦学习,一种不需将训练数据集中到中央服务器的模型训练方法。通过在本地设备上保持数据副本,确保数据隐私,同时使用分布式训练实现模型的协同优化。通过一个简单的torch示例展示了如何将集中式训练转换为联邦学习模式。
摘要由CSDN通过智能技术生成

什么是联邦学习?

它是训练深度学习模型的一种简单而强大的方法。考虑一下训练数据,一般它总是某种收集过程的结果:人们(通过设备)通过记录现实世界中的事件来生成数据。通常,此数据被聚合到单个中央位置,以便您可以训练机器学习模型。而联邦学习扭转了这一局面!

你无需将训练数据带到模型(一个中央服务器),而是将模型带到训练数据(无论其位于何处)。

这个想法允许创建数据的任何人拥有数据唯一的永久副本,从而保持对有权访问该数据的人的控制。很酷吧?

#训练示例
#2.1 一个玩具联合学习的例子
'''让我们从一个集中式训练的玩具模型开始。就像得到模型一样简单。我们首先需要:

玩具数据集
一个模型
用于训练模型以适合数据的一些基本训练逻辑。'''

import torch
from torch import nn
from torch import optim

# 一个玩具数据集
data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)

# 一个玩具模型
model = nn.Linear(2,1)

'''nn.Linear(2, 1): 这是一个线性(全连接)层的创建。在神经网络中,线性层通常用于将输入数据与权重矩阵相乘,然后加上偏置项。具体来说:

2: 第一个参数 2 指定了输入特征的数量。在这个例子中,输入数据的维度是 (batch_size, 2),其中 batch_size 是每次训练时使用的数据样本数量。

1: 第二个参数 1 指定了输出特征的数量。这意味着线性层将把输入特征从 2 维降到 1 维。'''

def train():
    ''''''
    # 训练逻辑
    opt = optim.SGD(params=model.parameters(),lr=0.1)
    #opt = optim.SGD(params=model.parameters(), lr=0.1): 这行代码创建了一个随机梯度下降(SGD)优化器,用于更新模型的参数。
    # params=model.parameters() 表示优化器将更新 model 中的所有可学习参数。lr=0.1 表示学习率设置为 0.1,即每次参数更新时的步长大小。
    for iter in range(20):

        # 1) 消除之前的梯度(如果存在)
        opt.zero_grad()
        # opt.zero_grad(): 这行代码用于清除之前参数的梯度。在每次参数更新之前,都需要先将梯度清零,以避免梯度累积。

        # 2) 预测
        pred = model(data)
        #pred = model(data): 这行代码使用模型 model 对输入数据 data 进行预测,得到预测结果 pred。

        # 3) 计算损失
        loss = ((pred - target)**2).sum()

        # 4) 指出那些导致损失的参数(损失回传)
        loss.backward()

        # 5) 更新参数
        opt.step()

        # 6) 打印进程
        print(loss.data)

train()

改为FL:

#2.1 一个玩具联合学习的例子
'''让我们从一个集中式训练的玩具模型开始。就像得到模型一样简单。我们首先需要:

玩具数据集
一个模型
用于训练模型以适合数据的一些基本训练逻辑。'''

import torch
from torch import nn
from torch import optim

import syft as sy
hook = sy.TorchHook(torch)

# 创建一对工作机

bob = sy.VirtualWorker(hook, id="bob")
alice = sy.VirtualWorker(hook, id="alice")

# 一个玩具数据集
data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)

# 通过以下方式获取每个工作机的训练数据的指针
# 向bob和alice发送一些训练数据
data_bob = data[0:2]
target_bob = target[0:2]

data_alice = data[2:]
target_alice = target[2:]

# 初始化玩具模型
model = nn.Linear(2,1)

data_bob = data_bob.send(bob)
data_alice = data_alice.send(alice)
target_bob = target_bob.send(bob)
target_alice = target_alice.send(alice)

# 将指针组织到列表中
datasets = [(data_bob,target_bob),(data_alice,target_alice)]
#优化器
opt = optim.SGD(params=model.parameters(),lr=0.1)

def train():
    # 训练逻辑
    opt = optim.SGD(params=model.parameters(), lr=0.1)

    for iter in range(10):

        # NEW)遍历每个工作人员的数据集
        for data, target in datasets:
            # NEW) 将模型发送给对应的工作机
            model.send(data.location)

            # 1) 消除之前的梯度(如果存在)
            opt.zero_grad()

            # 2) 预测
            pred = model(data)
            # 3) 计算损失
            loss = ((pred - target) ** 2).sum()

            # 4) 指出那些导致损失的参数(损失回传)
            loss.backward()
            #print(loss)
            # 5) 更新参数
            opt.step()

            # NEW) 获取模型(带梯度)
            model.get()
            #Loss = loss.get()
            #
            # 6) 打印进程
            #print(loss.get())
             #print(loss.data.get)
            print(loss.data)



# 联合平均
train()

问题:输出的这是什么?有没有大佬知道的?

修改为后输出变为

不太理解,请求指教

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值