摘要:ModelArts提供了一个实现个性化联邦学习的API——pytorch_fedamp_emnist_classification,它主要是让拥有相似数据分布的客户进行更多合作的一个横向联邦学习框架,让我们来对它进行一些学习和探索。

随着数字技术的发展,以及全社会对数字化的不断重视,数据的资源属性前所未有地突显出来。相应地,数据隐私和数据安全也越来越受到人们的关注,联邦学习应运而生,成为当前比较热门的一个AI算法发展方向。

什么是联邦学习:

联邦学习(Federated Learning)是一种新兴的人工智能基础技术,在 2016 年由谷歌最先提出,原本用于解决安卓手机终端用户在本地更新模型的问题,其设计目标是在保障大数据交换时的信息安全、保护终端数据和个人数据隐私、保证合法合规的前提下,在多参与方或多计算结点之间开展高效率的机器学习。

金融运用领域前景:

目前在金融领域,各个金融机构都会建设基于自己的业务场景风控模型,当运用了联邦学习即可基于各自的风控模型建立联合模型,就能更准确地识别信贷风险,金融欺诈。同时共同建立联邦学习模型,还能解决原数据样本少、数据质量低的问题。

如何实战联邦学习:

ModelArts提供了一个实现个性化联邦学习的API——pytorch_fedamp_emnist_classification,它主要是让拥有相似数据分布的客户进行更多合作的一个横向联邦学习框架,让我们来对它进行一些学习和探索。

1. 环境准备¶

1.1. 导入文件操作模块和输出清理模块¶

import os
import shutil
from IPython.display import clear_output

1.2. 下载联邦学习包并清除输出¶

!wget https://obsfs-notebook.obs.cn-north-4.myhuaweicloud.com/FedAMP.zip
clear_output(wait=False)

1.3. 如果存在FedAMP文件夹,则把它完整地删除,然后重新创建FedAMP文件夹¶

if os.path.exists('FedAMP'):
shutil.rmtree('FedAMP')
!mkdir FedAMP

1.4. 把下载的联邦学习包解压到该文件夹,删除压缩包,并清理输出¶

!unzip FedAMP.zip -d FedAMP
!rm FedAMP.zip
clear_output(wait=False)

1.5. 安装基于Pytorch的图像处理模块torchvision,并清理输出¶

!pip install torchvision==0.5.0
clear_output(wait=False)

1.6. 安装torch框架并清理输出¶

!pip install torch==1.4.0
clear_output(wait=False)

1.7. 安装联邦学习包,删除原文件,并清理输出¶

!pip install FedAMP/package/moxing_pytorch-1.17.3.fed-cp36-cp36m-linux_x86_64.whl
!rm -r FedAMP/package
clear_output(wait=False)

1.8. 导入torch框架、numpy、random、matplotlib.pyplot、华为moxing¶

import torch, random
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import moxing as mox

1.9. 导入华为moxing框架下的联邦算法、支持和服务¶

from moxing.framework.federated import fed_algorithm
from moxing.framework.federated import fed_backend
from moxing.framework.federated import fed_server

1.10. 导入华为moxing torch框架下联邦学习的的载入、保存、hook和服务¶

from moxing.pytorch.executor.federated.util import torch_load
from moxing.pytorch.executor.federated.util import torch_save
from moxing.pytorch.executor.federated.util import TorchFedHook
from moxing.pytorch.executor.federated import client

1.11. 导入FedAMP和torch.nn下的函数包

from moxing.framework.federated.fed_algorithm import FedAMP
import torch.nn.functional as F

1.12. 准备好文件路径¶

if mox.file.is_directory('/tmp/fed_workspace/'):
mox.file.remove('/tmp/fed_workspace/', recursive=True)

2. 建立数据读取类和数据结构类(具体内容将在下文用到时说明)¶

class DataFileLoaderHorizontal():
def __init__(self, data=None, label=None):
if data is None:
self.data = data
if label is None:
self.label = label
def getDataToTorch(self):
return torch.FloatTensor(self.data), torch.FloatTensor(self.label)
def load_file_binary(self, data_filename=None, label_filename=None):
assert data_filename is not None
assert label_filename is not None
self.data = np.load(data_filename, allow_pickle=True)
self.label = np.load(label_filename, allow_pickle=True)
self.data, self.label = self.data.astype(float), self.label.astype(float)
class m_Data():
def __init__(self):
self.train_samples = None
self.train_labels = None
self.test_samples = None
self.train_samples = None

3. 将数据读入对应虚拟租户¶

3.1. 设置虚拟租户数量¶

num_clients = 62

3.2. 创建一个数据读取类¶

df1 = DataFileLoaderHorizontal()

3.3. 初始化训练集、测试集文件名和文件扩展名¶

rain_sample_filename = 'FedAMP/EMNIST/client_train_samples_'
train_label_filename = 'FedAMP/EMNIST/client_train_labels_'
val_sample_filename = 'FedAMP/EMNIST/client_test_samples_'
val_label_filename = 'FedAMP/EMNIST/client_test_labels_'
filename_sx = '.npy'

3.4. 让我们来探索一下训练数据集¶

3.4.1. 先导入一个样本集¶

df1.load_file_binary(data_filename=train_sample_filename + str(1) + filename_sx,
label_filename=train_label_filename + str(1) + filename_sx)

这里使用了“2.”中DataFileLoaderHorizontal类的load_file_binary方法,该方法首先确认传入的文件名不为空,然后numpy的load方法将.npy文件载入,最后用astype方法将其转为float类型

3.4.2. 先看一下自变量¶

df1.data

array([[[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

...,

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.]],

...,

[[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

...,

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.]],

[[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

...,

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.],

[0., 0., 0., ..., 0., 0., 0.]]])

df1.data[0]

array([[0. , 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. ],

[0. , 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. ],

………………

[0. , 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. ],

[0. , 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. , 0. , 0. ,

, 0. , 0. ]])

len(df1.data)

1000

可以看到,它是一个比较稀疏的三维数组,由1000个二维数组组成

3.4.3. 再看一下标签集¶

df1.label

array([40., 7., 5., 4., 8., 8., 0., 9., 3., 34., 2., 2., 8.,

6., 5., 3., 9., 9., 6., 8., 5., 6., 6., 6., 6., 5.,

5., 8., 5., 6., 7., 5., 8., 59., 2., 9., 7., 6., 3.,

4., 57., 7., 9., 49., 52., 25., 4., 2., 43., 6., 9., 5.,

3., 5., 7., 7., 3., 0., 6., 7., 5., 27., 9., 24., 2.,

2., 7., 6., 1., 9., 45., 7., 0., 14., 9., 9., 0., 2.,

6., 5., 1., 4., 6., 36., 8., 0., 34., 0., 0., 53., 5.,

0., 2., 7., 52., 32., 2., 4., 35., 49., 15., 2., 60., 8.,

0., 7., 51., 19., 3., 1., 24., 9., 2., 2., 4., 8., 8.,

4., 3., 0., 9., 7., 6., 26., 7., 4., 7., 7., 2., 8.,

9., 4., 1., 4., 9., 8., 3., 16., 0., 5., 3., 16., 5.,

3., 1., 7., 19., 53., 4., 0., 2., 5., 23., 19., 46., 5.,

2., 7., 4., 51., 57., 7., 16., 2., 1., 0., 2., 4., 0.,

41., 21., 8., 1., 2., 39., 3., 1., 6., 58., 32., 3., 9.,

6., 4., 3., 54., 7., 3., 60., 7., 8., 3., 3., 2., 2.,

5., 60., 5., 5., 6., 7., 9., 9., 2., 8., 3., 43., 5.,

1., 9., 5., 9., 13., 6., 7., 6., 6., 59., 0., 8., 7.,

7., 2., 57., 4., 8., 3., 4., 6., 4., 3., 9., 8., 0.,

6., 48., 0., 4., 2., 3., 4., 8., 18., 2., 2., 4., 30.,

7., 2., 9., 7., 1., 1., 2., 20., 36., 9., 5., 32., 3.,

3., 3., 3., 3., 20., 37., 1., 25., 1., 0., 57., 2., 2.,

0., 3., 9., 2., 18., 2., 3., 40., 28., 1., 4., 2., 8.,

4., 8., 5., 0., 18., 0., 1., 2., 7., 8., 6., 0., 2.,

5., 35., 0., 1., 53., 2., 3., 3., 2., 8., 32., 3., 5.,

6., 8., 2., 7., 40., 8., 5., 6., 8., 4., 9., 1., 13.,

6., 3., 3., 5., 3., 51., 60., 2., 3., 40., 1., 0., 47.,

59., 9., 6., 1., 2., 1., 9., 8., 0., 3., 8., 53., 61.,

8., 5., 18., 7., 0., 4., 1., 1., 51., 0., 9., 43., 6.,

51., 5., 7., 22., 24., 42., 3., 47., 0., 59., 7., 42., 7.,

58., 7., 1., 0., 4., 8., 8., 8., 20., 1., 16., 9., 0.,

3., 23., 6., 4., 45., 5., 0., 1., 2., 9., 1., 27., 9.,

5., 4., 7., 7., 0., 15., 3., 9., 36., 9., 47., 3., 29.,

56., 42., 2., 7., 42., 4., 1., 9., 0., 34., 3., 5., 0.,

15., 0., 6., 4., 7., 4., 5., 0., 15., 9., 8., 43., 7.,

7., 6., 42., 6., 8., 7., 61., 2., 8., 1., 5., 7., 57.,

2., 23., 9., 4., 1., 59., 3., 1., 9., 9., 15., 5., 47.,

27., 6., 6., 0., 4., 2., 3., 2., 22., 3., 6., 2., 6.,

5., 8., 7., 9., 7., 3., 49., 5., 5., 1., 6., 8., 0.,

6., 7., 45., 4., 6., 3., 9., 5., 0., 12., 18., 8., 4.,

3., 4., 6., 6., 4., 5., 3., 29., 7., 7., 5., 9., 7.,

4., 0., 6., 8., 5., 2., 8., 1., 9., 8., 7., 25., 1.,

6., 8., 4., 9., 3., 1., 2., 9., 2., 5., 1., 9., 5.,

1., 2., 1., 5., 24., 45., 7., 0., 4., 8., 49., 9., 6.,

4., 2., 35., 4., 9., 8., 7., 8., 1., 6., 1., 7., 9.,

1., 8., 1., 1., 3., 0., 17., 47., 6., 0., 3., 2., 5.,

5., 55., 28., 9., 56., 7., 8., 2., 2., 50., 8., 4., 9.,

4., 3., 1., 1., 0., 5., 38., 8., 9., 0., 1., 5., 2.,

25., 5., 0., 4., 7., 9., 7., 61., 4., 4., 2., 2., 6.,

41., 45., 20., 5., 8., 5., 8., 7., 9., 4., 3., 1., 7.,

19., 3., 8., 1., 9., 7., 27., 3., 0., 4., 8., 8., 2.,

46., 6., 6., 5., 1., 8., 6., 8., 2., 4., 5., 33., 5.,

5., 5., 8., 0., 2., 31., 5., 1., 7., 1., 5., 48., 41.,

9., 4., 61., 9., 9., 34., 16., 7., 5., 0., 5., 32., 0.,

52., 3., 1., 4., 6., 29., 4., 2., 0., 4., 0., 1., 48.,

3., 9., 5., 1., 7., 6., 4., 4., 5., 8., 8., 9., 1.,

46., 0., 29., 0., 5., 4., 4., 48., 56., 9., 3., 1., 3.,

1., 5., 7., 9., 8., 8., 6., 6., 0., 8., 0., 53., 1.,

6., 1., 4., 4., 8., 11., 9., 8., 1., 44., 4., 2., 1.,

3., 7., 6., 2., 39., 8., 9., 4., 6., 4., 1., 2., 7.,

33., 4., 36., 3., 40., 1., 8., 5., 3., 3., 3., 28., 13.,

9., 1., 46., 1., 5., 22., 0., 9., 0., 0., 2., 1., 2.,

43., 7., 4., 0., 2., 28., 39., 48., 4., 0., 5., 3., 6.,

6., 7., 19., 6., 4., 0., 35., 13., 3., 28., 2., 6., 23.,

2., 5., 1., 0., 8., 8., 2., 10., 27., 0., 49., 58., 23.,

9., 2., 7., 7., 2., 9., 5., 4., 9., 22., 5., 8., 6.,

4., 58., 6., 5., 4., 9., 1., 7., 0., 3., 33., 3., 7.,

9., 6., 3., 1., 1., 6., 2., 1., 2., 7., 3., 7., 8.,

6., 0., 4., 34., 41., 8., 3., 6., 8., 6., 1., 6., 3.,

56., 24., 0., 0., 1., 58., 0., 1., 9., 29., 8., 9., 6.,

6., 8., 9., 1., 39., 3., 0., 4., 25., 8., 33., 0., 2.,

3., 7., 5., 0., 7., 7., 6., 46., 7., 8., 6., 2., 0.,

8., 7., 5., 20., 56., 9., 4., 41., 9., 8., 4., 13., 5.,

3., 61., 4., 5., 1., 33., 0., 1., 7., 1., 0., 6., 3.,

6., 2., 6., 4., 22., 5., 4., 36., 0., 9., 2., 9., 3.,

2., 0., 0., 7., 2., 35., 5., 9., 4., 4., 0., 6., 6.,

9., 5., 5., 39., 3., 1., 60., 4., 52., 6., 4., 0., 1.,

6., 9., 8., 52., 3., 1., 7., 3., 3., 9., 7., 8.])

可以推测,每一份训练集由1000个样本组成,自变量为二维数组

3.4.4. 将样本集和标签集转化为torch.FloatTensor类型¶

samples, labels = df1.getDataToTorch()

3.5. 让我们来创建一个“2.0”中m_Data的实例,并将训练样本集和标签集导入m_Data¶

3.5.1. 先来创建一个m_Data¶

m_data = m_Data()

3.5.2. 初始化输入格式¶

input_dim = (-1, 1, 28, 28)

3.5.3. 创建m_data的训练集¶

m_data.train_samples = samples.reshape(input_dim)
m_data.train_labels = labels.squeeze()

3.5.4. 创建m_data的测试集¶

df1.load_file_binary(data_filename=val_sample_filename + str(1) + filename_sx,
label_filename=val_label_filename + str(1) + filename_sx)
samples, labels = df1.getDataToTorch()
m_data.val_samples = samples.reshape(input_dim)
m_data.val_labels = labels.squeeze()

在此,我们对比m_Data的数据结构,可以发现,m_Data的数据结构中似乎有个小bug,尽管它不影响使用 class m_Data(): def init(self): self.train_samples = None self.train_labels = None self.test_samples = None self.train_samples = None 这里的test_samples应该是val_samples,最后一个train_samples应该是val_labels

pytorch_fedamp_emnist_classification的第一次学习让我们先学到这里。

我们已经在ModelAts上实现了pytorch_fedamp_emnist_classification的环境配置,对样本数据结构以及pytorch_fedamp_emnist_classification需要的数据结构进行了简单地探索。

本文分享自华为云社区《联邦学习算法之一ModelArts “pytorch_fedamp_emnist_classification”学习(一)》,原文作者:darkpard。

点击关注,第一时间了解华为云新鲜技术~

跟我学ModelArts丨探索ModelArts平台个性化联邦学习API的更多相关文章

  1. 使用JavaScript调用手机平台上的原生API

    我之前曾经写过一篇文章使用Cordova将您的前端JavaScript应用打包成手机原生应用,介绍了如何使用Cordova框架将您的用JavaScript和HTML开发的前端应用打包成某个手机平台(比 ...

  2. MD5加密实现类不是Windows平台下联邦信息处理标准验证过的加密算法的一部分

    在.NET应用程序中,MD5CryptoServiceProvider实例化时,造成This implementation is not part of the Windows Platform FI ...

  3. 百度LBS开放平台个性化地图 制作一款独一无二的地图

    百度LBS开放平台个性化地图  制作一款独一无二的地图 天天用百度地图的亲们是否已不再满足仅仅看例如以下的地图样式了呢? 默认百度地图样式 是否特别渴望看特别不一样的地图呢.如带京城81号气息的午夜蓝 ...

  4. Apache Pulsar 在腾讯 Angel PowerFL 联邦学习平台上的实践

    腾讯 Angel PowerFL 联邦学习平台 联邦学习作为新一代人工智能基础技术,通过解决数据隐私与数据孤岛问题,重塑金融.医疗.城市安防等领域. 腾讯 Angel PowerFL 联邦学习平台构建 ...

  5. 人车识别实验丨华为ModelArts VS 百度Easy DL硬核体验

    摘要:想了解时下流行的自动驾驶相关AI模型吗?接下来就用华为云的ModelArts和百度的Easy DL带你体验一下AI平台是怎么进行模型训练的. 华为ModelArts自动学习 VS 百度Easy ...

  6. 实践案例丨基于ModelArts AI市场算法MobileNet_v2实现花卉分类

    概述 MobileNetsV2是基于一个流线型的架构,它使用深度可分离的卷积来构建轻量级的深层神经网,此模型基于 MobileNetV2: Inverted Residuals and Linear ...

  7. Demo分享丨看ModelArts与HiLens是如何让车自己跑起来的

    摘要:基于HiLens Kit已经基本开发完成,可部署到HiLens Kit,模型的选择为基于DarkNet53的YOLOv3模型,权重为基于COCO2014训练的数据集,而车道线的检测是基于Open ...

  8. 使用Fsharp 探索 Dotnet 平台

    Fsharp的交互开发环境使得我们在了解DotNet平台时能够快速的获得需要的反馈. 反馈在任何技艺的磨练过程中必不可少,我认为也是最重要的环节之一.在“一万小时天才理论”中,著名的髓鞘质就是在快速有 ...

  9. 从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波

    摘要:常用于消除噪声的图像平滑方法包括三种线性滤波(均值滤波.方框滤波.高斯滤波)和两种非线性滤波(中值滤波.双边滤波),本文将详细讲解两种非线性滤波方法. 本文分享自华为云社区<[Python ...

  10. 跟我学Python丨图像增强及运算:局部直方图均衡化和自动色彩均衡化处理

    摘要:本文主要讲解图像局部直方图均衡化和自动色彩均衡化处理.这些算法可以广泛应用于图像增强.图像去噪.图像去雾等领域. 本文分享自华为云社区<[Python从零到壹] 五十四.图像增强及运算篇之 ...

随机推荐

  1. Regions 题解

    Regions 这里提供一种时间复杂度不那么优秀但十分好写也好理解的做法. 题目大意 给定一颗 \(n\) 个节点的树,每个节点拥有一个颜色,进行若干次询问,每次询问给出两种颜色 \(A,B\),求所 ...

  2. Kubernetes文档支持的版本

    简介 https://kubernetes.io/zh-cn/docs/ 官方中文网站一共是可以阅读5个k8s版本的文档.这5个版本包括k8s最新版和最近的4个版本.例如当前最新版是1.28,那么文档 ...

  3. AGC044C Strange Dance 题解

    在2020年A卷省选day2t2有类似建立trie的技巧. 题目链接 显然是建一棵三叉trie树,代表0/1/2 对这棵trie树,我们需要支持子树交换和全局加1 考虑第一个操作怎么做?直接打个懒标记 ...

  4. xxl-job安装部署文档

    xxl-job安装部署文档 注意:替换yaml文件中的mysql地址 安装方式 kubectl apply -f xxl-job.yaml -n xxxx 安装配置文件 xxl-job.yaml ## ...

  5. 记录一下我的ctf比赛的web题目

    Web之getshell: 具体代码如下 <?php highlight_file(__FILE__); error_reporting(0); echo "<h1>WEL ...

  6. [MDP.NetCore] 使用AzureAD+服務主體,快速建立兩個服務之間的Service身分認證

    MDP.AspNetCore.Authentication.AzureAD.Services for Service Principal MDP.AspNetCore.Authentication.A ...

  7. 从零开始学习Python

    从零开始学习Python是一个令人兴奋和有趣的过程.无论你是完全没有编程经验,还是已经熟悉其他编程语言,Python都可以成为你迈向程序员之路的理想起点. 首先,在开始学习之前,请确保在计算机上安装了 ...

  8. 【scipy 基础】--空间计算

    scipy.spatial子模块提供了一系列用于处理和计算空间数据和几何形状的算法和工具,在许多领域都有广泛的应用,例如计算机视觉.地理信息系统.机器人学.医学影像分析等. 下面,来具体看看scipy ...

  9. 聊聊分布式 SQL 数据库Doris(七)

    LSM-Tree Doris的存储结构是类似LSM-Tree设计的,因此很多方面都是通用的,先阅读了解LSM相关的知识,再看Doris的底层存储与读取流程会清晰透彻很多,如下是几个关键的设计: SST ...

  10. 将 .NET Aspire 部署到 Kubernetes 集群

    使用Aspirate可以将Aspire程序部署到Kubernetes 集群 工具安装 dotnet tool install -g aspirate --prerelease 注意:Aspirate ...