pytorch对数据集进行重新采样

背景
当不同类型数据的数量差别巨大的时候,比如猫有200张训练图片,而狗有2000张,很容易出现模型只能学到狗的特征,导致准确率无法提升的情况。

这时候,一种可行的方法就是对原始数据集进行采样,从而生成猫、狗图片数量接近的新数据集。这个新数据集中可能猫、狗图片都各有500张,其中猫的图片有一部分重复的,而狗的2000张图片中有一部分没有被采样到,但是这时候新数据集的数据分布是均衡的,就可以比较好的训练了。

操作方法
我们知道pytorch训练一般都是用的DataLoader加载数据的,我们可以通过给Dataloader传入一个sampler的采样器进行采样操作。

train_loader = DataLoader( train_dataset, batch_size=256, num_workers=2, sampler=sampler)

采样器sampler有多种,大家可以根据自己需要研究一下,这里我们使用一个按权重采样的WeightedRandomSampler。其作用是:我们可以人为的给每张图片定一个被抽取到的概率,一般每一类的所有图片的概率可以一样,然后就按每个图片的这个概率对整个数据集进行重新采样。

比如:猫只有200张图片,我们设置取到每张猫的图片的概率为1/200,而狗有2000张图片,我们设置取到每张狗的概率为1/2000。这样虽然狗的图片比较多,但我们取到猫和狗的概率是一样的,只是猫会有一些重复,而狗有一些不会取到,最终形成的新数据集就平衡了。

参考 https://blog.csdn.net/tyfwin/article/details/108435756

在这里插入图片描述
注意
注意上图的replacement参数,为True表示有放回的采样,也就是我们上边说的那种采样,有部分数据重复,有部分数据没有出现;为False表示不放回的采样,即采样后的数据集跟原来一样,只是内部数据的顺序有些变化,概率大的可能会在前边,这主要作用于有序的数据。num_samples定义采样的次数,也即采样后的数据集数目,一般设为跟原来一样。

代码

参考 https://www.cnblogs.com/king-lps/p/11004653.html

# 定义每个类别采样的权重,这个只做参考,可以根据自己需要随便定义
target = train_dataset.targets
class_sample_count = np.array([len(np.where(target == t)[0]) for t in np.unique(target)])
weight = 1. / class_sample_count
samples_weight = np.array([weight[t] for t in target])
samples_weight = torch.from_numpy(samples_weight)
samples_weight = samples_weight.double()
sampler = WeightedRandomSampler(samples_weight, len(samples_weight))
# 读取原始数据为datasets对象                                                                              
dataset_train = datasets.ImageFolder(traindir)                                                                                                         

# 在DataLoader的时候传入采样器即可                                                                                
train_loader = torch.utils.data.DataLoader(dataset_train, batch_size=args.batch_size, sampler = sampler) 
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: PyTorch是一个开源的机器学习库,内置丰富的函数和工具包用于数据集加载、数据预处理、模型构建、训练和评估。数据集是机器学习模型的重要组成部分,PyTorch提供了多种方法用于加载数据集,包括内置的函数和可定制的方法,让用户可以根据自己的需求和数据集特性来选择适合的方式。 内置函数 PyTorch提供了内置的函数用于加载常见的数据集,如MNIST、CIFAR-10、ImageNet等。这些函数通常包括下载数据集、转换为Tensor格式、划分为训练集和测试集等步骤,使用简单方便,适合快速上手使用。 可定制方法 如果内置函数不能满足需求,PyTorch也提供了许多可定制的方法。最常用的是Dataset和DataLoader类。Dataset类是抽象类,用户需要继承这个类并实现getitem和len方法来定义自己的数据集。DataLoader类用于生成一个迭代器,用户可以设置批量大小、并行加载、随机采样等参数。 除此之外,PyTorch还提供了其它一些用于数据集处理的工具,如transforms模块、Sampler类、collate_fn函数等,可以用于数据增强、数据集分块和数据集拼接等场景。 总结 PyTorch提供了内置函数和可定制方法用于加载数据集,用户可以根据自己的需求和数据集特性来选择适合的方式。使用内置函数可以快速上手,使用可定制方法可以更加灵活和高效。对于多样化的数据集PyTorch还提供了多个处理工具,可以用于数据增强、数据集分块和数据集拼接等场景。 ### 回答2: PyTorch是一种基于Python的开源机器学习库,它可以用于构建各种机器学习模型。在PyTorch中,数据集加载是一个非常重要的部分,因为机器学习模型需要大量的数据来进行训练。 在PyTorch中,数据集加载可以通过DataLoader类来实现。DataLoader是一个Python迭代器,它可以加载大量的数据集,并将其分成小批量进行训练。这样可以避免一次性将整个数据集加载到内存中,从而节省内存空间。 首先,我们需要将数据集加载到内存或磁盘中,并将其转换为PyTorch数据集类的对象。PyTorch提供了两种数据集类:Dataset和IterableDataset。其中,Dataset类是一种基于索引的数据集类,它可以通过索引来访问数据集中的每个数据样本;而IterableDataset是一种基于迭代器的数据集类,它可以像Python中的迭代器一样使用。 然后,我们可以使用DataLoader类来加载数据集。DataLoader类有很多参数,包括batch_size(表示每个小批量包含的样本数)、shuffle(表示是否随机打乱数据集顺序)、num_workers(表示使用多少个工作线程来加载数据集)等。 在使用DataLoader类加载数据集时,我们可以通过for循环来迭代数据集中的每个小批量,并将其传递给机器学习模型进行训练。 总之,PyTorch数据集加载是非常灵活和易于使用的。通过使用DataLoader类和PyTorch提供的数据集类,我们可以轻松地加载和处理大量的数据集,并将其用于训练各种机器学习模型。 ### 回答3: Pytorch是一个使用Python作为开发语言的深度学习框架,提供了非常强大的数据加载和预处理工具。在Pytorch中,数据集加载主要通过两个类来实现,分别是Dataset和DataLoader。Dataset类负责加载和处理数据集,而DataLoader类则负责将处理后的数据安装指定的batch_size分批加载到内存中,避免了内存不足的问题。 Dataset类是一个抽象类,需要根据具体的数据集来实现其中的方法。一般而言,Dataset类中需要实现__len__()方法和__getitem__()方法,分别用来获取数据集的长度和获取具体的数据样本。 DataLoader类则负责对数据集进行batch处理,这样可以充分利用系统的存储和计算资源,提高了模型的训练速度。在使用DataLoader时,需要指定batch_size、shuffle和num_workers等参数,其中num_workers可以指定使用多少个进程来装载数据,从而进一步提高了数据装载的效率。 在数据集加载过程中,可以使用Pytorch提供的transforms模块来进行数据的预处理,如改变图像尺寸、随机翻转、归一化等操作,从而增加模型的泛化能力和准确性。 总之,Pytorch数据集加载和预处理方面提供了非常强大的工具,只需要实现一些简单的代码,就能轻松地完成数据的加载和预处理,从而为模型的训练和测试提供了坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值