写点什么

恒源云 (Gpushare)_ 今日炼丹小疑问:如何给数据加权重?

作者:恒源云
  • 2022 年 5 月 06 日
  • 本文字数:1249 字

    阅读完需:约 4 分钟

文章来源 | 恒源云社区


原文地址 | 【炼丹保姆】


原文作者 | 阿洲




时间:2022 年 5 月 6 号

心情:崩溃边缘

原因:居家隔离一月有余……且解封不知何时……


算了,我摊牌了,我开始摆烂了!

因为心情💢不好,所以工作消极!


挑个简短精干的帖子分享,你们爱看不看🙈,就是这么拽🕶️

来吧,展示🀄️:

准备工作:

import numpy as npimport torchfrom torch.utils.data import WeightedRandomSamplerfrom torch.utils.data import DataLoaderfrom torch.utils.data import TensorDataset
复制代码

生成数据

# 假设是一个三分类的问题,每一类的样本数分别为 10,1000,3000class_counts = np.array([10, 1000, 3000])#  样本总数n_samples = class_counts.sum() # 4010# 标签labels = []for i in range(len(class_counts)):    labels.extend([i]*class_counts[i])
Y = torch.from_numpy(np.array(labels, dtype=np.int64))# 随机生成一些数据,不重要X = torch.randn(n_samples)
复制代码

生成权重

# 给每一类一个权重class_weights = [n_samples/class_counts[i] for i in range(len(class_counts))]# [401.0, 4.01, 1.3367]# 对每个样本生成权重weights = [class_weights[i] for i in labels]
复制代码

数据封装

train_dataset = TensorDataset(X, Y)sampler =  WeightedRandomSampler(weights, int(n_samples),replacement=True)
复制代码

实验 A: 加权分配使用 replacement (样本可重复使用)

train_loader = DataLoader(train_dataset, batch_size=1024,sampler=sampler, drop_last=True)
for i, (x,y) in enumerate(train_loader): print(f"batch index {i}, n_0: {(y==0).sum()}, n_1: {(y==1).sum()}, n_2: {(y==3).sum()}")# output:# 第一个batch,每类的数量分别为 349, 344, 331# 第二个batch,每类的数量分别为 344, 360, 320# 第三个batch,每类的数量分别为 339, 348, 337
复制代码

实验 B: 加权分配不使用 replacement (样本不可重复使用)

sampler =  WeightedRandomSampler(weights, int(num_samples),replacement=False)
train_loader = DataLoader(train_dataset, batch_size=1024,sampler=sampler, drop_last=True)
for i, (x,y) in enumerate(train_loader): print(f"batch index {i}, n_0: {(y==0).sum()}, n_1: {(y==1).sum()}, n_2: {(y==3).sum()}")# output:# 第一个batch,每类的数量分别为 10, 466, 548# 第二个batch,每类的数量分别为 0, 333, 691# 第三个batch,每类的数量分别为 0, 173, 851
复制代码

实验 C: 简单随机分配

train_loader = DataLoader(train_dataset, batch_size=20,shuffle=True, drop_last=True)
for i, (x,y) in enumerate(train_loader): print(f"batch index {i}, n_0: {(y==0).sum()}, n_1: {(y==1).sum()}, n_2: {(y==3).sum()}")# output:# 第一个batch,每类的数量分别为 0, 227, 797# 第二个batch,每类的数量分别为 1, 271, 752# 第三个batch,每类的数量分别为 6, 257, 761
复制代码

结论

使用 WeightedRandomSampler 并且允许样本重复使用的话基本可以保证样本的均衡采样。

用户头像

恒源云

关注

专注人工智能云GPU服务器训练平台 2020.12.25 加入

还未添加个人简介

评论

发布
暂无评论
恒源云(Gpushare)_今日炼丹小疑问:如何给数据加权重?_Python_恒源云_InfoQ写作社区