联邦学习数据集划分Dirichlet划分法及其可视化

文章目录

  • 前言
  • 图片效果:
    • 独立同分布效果
    • 非独立同分布效果
  • 一、参数
    • 输入
    • 输出
  • 二、代码
    • 可视化:
    • 标签划分:
    • 代码调用


前言

用于实现并控制联邦学习客户端之间数据集非独立同分布,并将效果可视化


图片效果:

独立同分布效果

  1. 对不同类别的分配效果可视化:
    在这里插入图片描述
  2. 对不同客户端拥有的数据集的可视化:
    在这里插入图片描述

非独立同分布效果

  1. 对不同类别的分配效果可视化:
    在这里插入图片描述
  2. 对不同客户端拥有的数据集的可视化:
    在这里插入图片描述

一、参数

输入

  • classes:标签名称,列表类型
    -示例:[‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’]
  • train_labels:数据集标签,列表类型
    -示例:[6 9 9 … 9 1 1]
  • alpha:浓度参数,浮点数数值,(0,+∞)
  • client_number:客户端数量,整型数值

输出

client_idcs:各客户端拥有的数据图片下标,列表类型
示例:

client_idcs=[array([  29,   30,   35, ..., 9676, 9683, 9701]), 
 array([ 9171,  9181,  9193, ..., 20167, 20172, 20176]), 
 array([18920, 18925, 18935, ..., 29604, 29609, 29628]),
 array([28887, 28897, 28912, ..., 38602, 38621, 38644]), 
 array([39601, 39606, 39619, ..., 49963, 49971, 49997])]

二、代码

可视化:

def draw_dataset(classes,labels,client_idcs,num_users):
    #设置图片保存位置
    # 构建save文件夹的路径
    # 获取当前文件的父目录  
    parent_dir = os.path.abspath(os.path.join(os.getcwd(), os.pardir))   
    save_dir = os.path.join(parent_dir, 'save/img') 
    # 如果save文件夹不存在,则创建它  
    if not os.path.exists(save_dir):  
        os.makedirs(save_dir)  
    file_path1 = os.path.join(save_dir, '1.png')
    file_path2 = os.path.join(save_dir, '2.png')
    
    # 展示不同label划分到不同client的情况
    n_classes = 10#cifar10有10个类别
    plt.figure(figsize=(12, 8))
    plt.hist([labels[idc]for idc in client_idcs], stacked=True,
             bins=np.arange(min(labels)-0.5, max(labels) + 1.5, 1),
             label=["Client {}".format(i) for i in range(num_users)],
             rwidth=0.5)
    plt.xticks(np.arange(n_classes), classes)
    plt.xlabel("Label type")
    plt.ylabel("Number of samples")
    plt.legend(loc="upper right")
    plt.title("Display Label Distribution on Different Clients")
    plt.savefig(file_path1)

    # 展示不同client上的label分布
    plt.figure(figsize=(12, 8))
    label_distribution = [[] for _ in range(n_classes)]
    for c_id, idc in enumerate(client_idcs):
        for idx in idc:
            label_distribution[labels[idx]].append(c_id)

    plt.hist(label_distribution, stacked=True,
                bins=np.arange(-0.5, num_users + 1.5, 1),
                label=classes, rwidth=0.5)
    plt.xticks(np.arange(num_users), ["Client %d" %
                                        c_id for c_id in range(num_users)])
    plt.xlabel("Client ID")
    plt.ylabel("Number of samples")
    plt.legend()
    plt.title("Display Label Distribution on Different Clients")
    plt.savefig(file_path2)

标签划分:

def dirichlet_split_noniid(classes,train_labels, alpha=100.0, client_number=5):
    '''
    参数为 alpha 的 Dirichlet 分布将数据索引划分为 n_clients 个子集
    '''
    # 总类别数
    n_classes = train_labels.max()+1#也可以自己手动设置
    label_distribution = np.random.dirichlet([alpha]*n_clients, n_classes)
    # 记录每个类别对应的样本下标
    # 返回二维数组
    class_idcs = [np.argwhere(train_labels==y).flatten()
           for y in range(n_classes)]

    # 定义一个空列表作最后的返回值
    client_idcs = [[] for _ in range(n_clients)]
    # 记录N个client分别对应样本集合的索引
    for c, fracs in zip(class_idcs, label_distribution):
        # np.split按照比例将类别为k的样本划分为了N个子集
        # for i, idcs 为遍历第i个client对应样本集合的索引
        for i, idcs in enumerate(np.split(c, (np.cumsum(fracs)[:-1]*len(c)).astype(int))):
            client_idcs[i] += [idcs]
    client_idcs = [np.concatenate(idcs) for idcs in client_idcs]
    draw_dataset(classes,train_labels,client_idcs, n_clients)
    
    return client_idcs

代码调用

train_dataset = datasets.CIFAR10(data_dir, train=True, download=True, transform=trans_cifar10_train)
train_client_idcs = dirichlet_split_noniid(train_dataset.classes,np.array(train_dataset.targets),alpha=100.0,n_clients=5)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/677857.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python中的循环控制语句break与continue

学习这两个语句之前,我们要先了解这两个语句是什么意思: break:中断、打破的意思。所以它的跳出循环的意思 continue:继续的意思,意思是跳过当前条件,继续循环 新需求来了!我们不仅要告诉 Py…

运营干货:用户运营体系

1、用户生命周期 2、用户引入阶段 3、用户留存阶段 4、用户回流阶段

Camunda BPM架构

Camunda BPM既可以单独作为流程引擎服务存在,也能嵌入到其他java应用中。Camunda BPM的核心流程引擎是一个轻量级的模块,可以被Spring管理或者加入到自定义的编程模型中,并且支持线程模型。 1,流程引擎架构 流程引擎由多个组件构成,如下所示: API服务 API服务,允许ja…

创意KMS知识图谱ui设计合集来了

创意KMS知识图谱ui设计合集来了

Redis的一致性

一、产生的原因 使用缓存,在进行写操作的时候就会出现不一致的问题。 一致性分为三类:强一致性,弱一致性,最终一致性 二、方案 2.1 延时双删 在更新数据库的操作前后分别进行一次删除缓存的操作,并在更新数据库之后…

广工电工与电子技术实验报告-按键键值识别和LED数码管显示

实验代码 Key_LED.v module Key_LED (key, HEX0); input[3:0] key; output[6:0] HEX0; reg[3:0] A; always (key) begin if (key[0] < 0) begin A 4b0001; end else if (key[1] < 0) begin A 4b0010; end else if (key[2] < 0) begin A 4b0011; end else if (key[…

Java——分支语句

控制结构是管理代码执行流程的基础。主要包括顺序控制、分支控制和循环控制。 一、顺序控制 顺序控制是最基本的控制结构&#xff0c;程序按照代码的书写顺序逐行执行。 public class SequentialControl {public static void main(String[] args) {int a 5;int b 10;int s…

jupyter notebook使用conda环境

pycharm中安装过可以使用的库在jupyter notebook中导入不进来 1 检查pycharm中安装的库的位置 2 检查jupyter notebook中安装的库的位置 3 查看jupyter notebook内核名字 可以看到jupyter notebook中内核名字叫ipykernel 4 安装ipykernel 在pycharm的terminal中 pip instal…

微服务:Rabbitmq利用jackson序列化消息为Json发送并接收

消息序列化 Spring默认会把你发送的消息通过JDK序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;再把字节反序列化为Java对象。 我们可以配置JSON方式来序列化&#xff0c;这样体积更小&#xff0c;可读性更高。 引入依赖&#xff1a; <dependency><g…

CV每日论文---2024.6.3

1、Video-MME: The First-Ever Comprehensive Evaluation Benchmark of Multi-modal LLMs in Video Analysis 中文标题&#xff1a;Video-MME&#xff1a;视频分析领域首个多模态法学硕士综合评估基准 简介&#xff1a;Video-MME 是一个全面评估多模态大语言模型&#xff08;M…

18、Go Gin框架中的binding验证器使用

一、binding功能介绍 Gin的binding包提供了一组功能&#xff0c;用于将请求的数据自动绑定到结构体&#xff0c;并根据结构体标签进行数据验证。常用的标签有binding和validate&#xff0c;通过这些标签可以指定数据的类型和验证规则。 常见标签 binding:"required"…

今日好料推荐(运维服务管理流程+互联网运维)

今日好料推荐&#xff08;运维服务管理流程互联网运维&#xff09; 本文内容是运维服务管理的梳理 参考资料内容&#xff1a;运维服务管理流程设计&互联网运维理论与实践 参考资料在文末获取&#xff0c;关注我&#xff0c;分享优质前沿资料&#xff08;IT、运维、编码、…

斜拉桥智慧施工数字孪生

基于图扑自主研发的 HT for Web 产品&#xff0c;利用现场照片及 CAD 图纸&#xff0c;结合 PBR 材质&#xff0c;搭建了具有赛博朋克风格的智慧斜拉桥可视化解决方案&#xff0c;精准复现斜拉桥建造规划过程&#xff0c;辅助运维人员对桥梁基建过程的网格化管理。提高桥梁的建…

【Spring Cloud Alibaba】Nacos统一配置管理

目录 回顾问题 统一配置管理配置中心的解决方案&#xff1a;Nacos的关键特性动态配置服务小结 Nacos的架构 Spring Cloud Alibaba Nacos Config1.创建项目2.添加依赖3.添加启动注解4.添加配置信息5.使用控制器类动态读取配置信息6.Nacos Server添加配置信息7.测试 Nacos Namesp…

大疆、西圣、枫笛领夹麦哪个好?大疆、西圣领夹麦克风测评对比

不知道大家有没有想过一个问题&#xff0c;为什么有些视频或直播的声音听起来那么清晰&#xff0c;仿佛身临其境&#xff1f;其实最主要的就是麦克风的原因&#xff0c;我们以前用的麦克风或多或少都会存在一些小毛病例如&#xff1a;音质不清晰、传输不稳定容易断断续续、声音…

国内PLM系统厂商,国内PLM系统哪个公司最受欢迎

国内PLM系统厂商,国内PLM系统哪个公司最受欢迎 国内PLM系统厂商中&#xff0c;要确定哪个公司的产品最受欢迎&#xff0c;需要考虑多个因素&#xff0c;包括市场份额、客户评价、技术实力、产品线完整性以及服务支持等。虽然无法直接给出一个具体的“最受欢迎”的排名&#xff…

centos7安装kubernetes v1.28.2

centos7安装kubernetes v1.28.2 一&#xff0e;环境部署 1.1基础环境配置 主机IP 主机名规划 172.17.48.15 master 172.17.48.3 node1 1.2修改机器名称 #永久修改主机名 hostnamectl set-hostname master && bash #在master上操作 hostnamectl set-hostname …

分层存储的图片的3d显示

分层存储的图片叠层成为3d&#xff0c;并显示。 文件夹D:\mask内的分层存储的图像文件&#xff1a; 1、显示为3d点云&#xff1a; import open3d as o3d import numpy as np from PIL import Imagedef convert_images_to_point_cloud(image_paths):points []for i, image_pa…

windows中安装zookeeper

https://zhuanlan.zhihu.com/p/692451839 【zookeeper】在Windows上启动zookeeper_windows启动zk-CSDN博客 Index of /apache/zookeeper/zookeeper-3.9.2 Index of /apache/zookeeper/zookeeper-3.9.2 Zookeeper的应用场景 1、配置管理 2、服务注册中心 3、主从协调 4、…

【OpenHarmony】ArkTS 语法基础 ③ ( @Component 自定义组件生命周期回调函数 | @Entry 页面生命周期回调函数 )

文章目录 一、ArkTS Component 自定义组件生命周期1、自定义组件生命周期2、aboutToAppear 函数执行时机和作用3、aboutToDisappear 函数执行时机和作用4、代码示例 二、ArkTS Entry 页面生命周期1、Entry 页面生命周期2、onBackPress 和 onPageHide 回调函数无关联 三、代码示…