打乱划分自己的数据集,并加载到数据加载器中(1)

这里以MNIST数据集的训练样本为例,将其划分为两个新的数据集:详细代码见下一节:

https://blog.csdn.net/qq_40379132/article/details/124846508?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124846508%22%2C%22source%22%3A%22qq_40379132%22%7D&ctrtid=0JuG9

1、np.floor 是向下取整函数

np.floor 返回不大于输入参数的最大整数。 即对于输入值 x ,将返回最大的整数 i ,使得 i <= x。 除此之外,NumPy常见运算四舍五入、取整、条件选取np.around、np.floor、np.ceil、np.where的详细用法如下:

【NumPy】 之常见运算四舍五入、取整、条件选取(np.around、np.floor、np.ceil、np.where)_tz_zs的博客-CSDN博客_numpy 四舍五入

import numpy as np
n = np.array([-1.7, -2.5, -0.2, 0.6, 1.2, 2.7, 11])
floor = np.floor(n)
print(floor)  # [ -2.  -3.  -1.   0.   1.   2.  11.]

2、np.random.shuffle(x) :在原数组上进行,改变自身序列,无返回值 。      np.random.permutation(x) :不在原数组上进行,返回新的数组,不改变自身数组

对于一个一维输入来说,对数据的顺序做了随机的排序。对于一个多维的输入,只是在第一维上进行了随机排序。例如一个二维矩阵矩阵来说,只是对行进行随机排序。np.random.shuffle(x)改变自身数组,np.random.permutation(x)不改变自身数组。

arr = np.arange(9).reshape((3, 3))
arr2 = np.arange(10)
print(arr)
print(arr2)
np.random.shuffle(arr)  
np.random.shuffle(arr2)  
arr3=np.random.permutation(arr2)
print('一维shuffle\n',arr)
print('二维shuffle',arr2)
print('一维permutation',arr3)

输出结果:

[[0 1 2]
 [3 4 5]
 [6 7 8]]
[0 1 2 3 4 5 6 7 8 9]
一维shuffle
 [[6 7 8]
 [3 4 5]
 [0 1 2]]
二维shuffle [6 7 9 2 5 0 8 3 1 4]
一维permutation [4 0 5 6 8 9 2 1 3 7]

 3、np.random.seed()随机数种子

随机数种子是按一定顺序生成随机数的,并不是一次给了一批数,这些数有固定顺序,可以简单认为随机种子给了我们很多数据,当需要生成随机数时,就从这一批数中依次取值。

这是因为开始设置了一个随机种子 “1”,接下来生成的8个数是有固定顺序的,可以把随机种子看成一个很长的 list ,接下来的取随机数操作 np.random.rand(4) ,就是从这个 list 中依次取4个随机数,然后 np.random.rand(4) ,再取4个随机数。之后在生成这7个 ‘随机’ 数之前,又重新定义了一个随机数种子np.random.seed(1) 。定义随机数种子就是定义了一个很长的 list ,这个 list 和之前的 list 是一样的!所以取的7个 ‘随机’ 数,就是这个 list 中的前7个。

import numpy as np
np.random.seed(1)  # 先定义一个随机数种子,()中的参数值后下个小节说
print(np.random.rand(4))  # "随机"生成5个数
print(np.random.rand(4))  # 再"随机"生成5个数
np.random.seed(1)
for i in range(7):
    print(np.random.random())  # "随机"生成7个数

输出结果:

[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01]
[0.14675589 0.09233859 0.18626021 0.34556073]
0.417022004702574
0.7203244934421581
0.00011437481734488664
0.30233257263183977
0.14675589081711304
0.0923385947687978
0.1862602113776709

 (1)随机数种子相当于给我们一个初值,之后按照固定顺序生成随机数。
 (2)随机数种子对后面的结果一直有影响,在一个随机数种子后生成的随机数都受这个随机数种子的影响,即生成的随机数都是由这个随机数种子给的初值,按照固定顺序生成的(生成的随机数受离它最近的随机数种子影响,即它之前的随机数种子)。

4、SubsetRandomSampler()方法

(1)SubsetRandomSampler 可以设置子集的随机采样,多用于将数据集分成多个集合,比如训练集和验证集的时候使用,会根据给的列表从数据集中按照下标取元素,无放回地按照给定的索引列表采样样本元素。

from torch.utils.data import SubsetRandomSampler
pseudo_dataset = list(range(10))
subRandomSampler1 = SubsetRandomSampler(pseudo_dataset[:7])
subRandomSampler2 = SubsetRandomSampler(pseudo_dataset[7:])
print("for subset random sampler #1: ")
for data in subRandomSampler1:
    print(data, end=" ")
print("\n\nfor subset random sampler #2: ")
for data in subRandomSampler2:
    print(data, end=" ")

 输出结果:

for subset random sampler #1: 
2 1 0 3 4 6 5 

for subset random sampler #2: 
8 9 7 

(2)SequentialSampler就是一个按照顺序进行采样的采样器,接收一个数据集做参数(实际上任何可迭代对象都可),按照顺序对其进行采样:

pseudo_dataset = list(range(10))
for data in SequentialSampler(pseudo_dataset):
    print(data, end=" ")

(3)RandomSampler 即一个随机采样器,返回随机采样的值,第一个参数依然是一个数据集(或可迭代对象)。replacement:bool值,默认是False,设置为True时表示可以重复采样。num_samples:只有在replacement设置为True的时候才能设置此参数,表示要采出样本的个数,默认为数据集的总长度。有时候重复数据被采样,导致有些采不到,所以会设置一个较大的值。

randomSampler2 = RandomSampler(pseudo_dataset, replacement=True, num_samples=20)

(4)WeightedRandomSampler和RandomSampler的参数一致,第一个参数变成了weights,只接收一个一定长度的list作为 weights 参数,表示采样的权重,采样时会根据权重随机从 list(range(len(weights))) 中采样,并不需要传入样本集,而是只在一个根据weights长度创建的数组中采样。weights的所有元素之和不需要为1。

weightedRandomSampler = WeightedRandomSampler(weights, replacement=True, num_samples=20)

(5)以上的四个Sampler在每次迭代都只返回一个索引,而BatchSampler的作用是对上述这类返回一个索引的采样器进行包装,按照设定的batch size返回一组索引,参数有些不同:

batchSampler2 = BatchSampler(pseudo_dataset, batch_size=3, drop_last=True)

    sampler:一个Sampler对象(或者一个可迭代对象)
    batch_size:batch的大小
    drop_last:是否丢弃最后一个可能不足batch size大小的数据

 更多的采样规则可参考如下内容:

PyTorch教程-5:详解PyTorch中加载数据的方法--Dataset、Dataloader、Sampler、collate_fn等_超级超级小天才的博客-CSDN博客

5、np.random.choice

从 一维数组 或 int 数字中 ,以概率p随机选取大小为size的数据,replace表示是否重用元素,随机抽取元素,

import numpy as np
print(np.random.choice(5))#从[0, 5)中随机输出一个随机数
print(np.random.choice(5, 3))#在[0, 5)内输出3个数字并组成一维数组(ndarray)
L = [1, 2, 3, 4, 5]  # list列表
print(np.random.choice(L, 5, replace=False, p=[0.2, 0.2, 0.2, 0.2,0.2]))#在l列表内输出5个不相同的数字并组成一维数组(ndarray),每个概率一样
A = np.array([[1,2],[3,4],[5,6],[7,2],[4,9]])#从二维数组中抽取
print(A[np.random.choice(A.shape[0],2),:])

 输出结果:

4
[3 3 4]
[5 2 3 1 4]
[[4 9]
 [1 2]]

numpy.random.choice(a, size=None, replace=True, p=None)
* a中随机抽取数字,并组成指定大小(size)的数组。本例用于打乱数据集中的样本。

* replace:True表示可以取相同数字,False表示不可以取相同数字。

* 数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。

关于参数的详细用法参见一下链接:

python,numpy中np.random.choice()的用法详解及其参考代码_ImwaterP的博客-CSDN博客_np.random.choice

6、DataLoader介绍

DataLoader : 批量加载数据用于后续的训练和测试 。对Dataset(和Sampler等)打包,完成最后对数据的读取的执行工作。这个接口的目的是:将自定义的数据读取接口的输出或者PyTorch已有的数据读取接口的输入,按照batch size封装成Tensor,后续只需要再包装成Variable即可作为模型的输入。本例中使用的如下代码部分:

train_data  = trainset()  #数据集
trainloader = DataLoader(train_data, batch_size=4,shuffle=True) #加载数据集,设定参数
valid_loader = Data.DataLoader(
    dataset = train_dataset,   #DataSet : 根据 Sampler 提供的索引来检索数据
    batch_size = 32,
    sampler = valid_sampler,  #Sampler : 提供数据集中元素的索引

 1、dataset,定义要加载的数据集。 这个就是 PyTorch 已有的数据读取接口或者自定义的数据接口的输出,该输出要么是torch.utils.data.Dataset类的对象,要么是继承自torch.utils.data.Dataset类的自定义类的对象。也可以根据 Sampler 提供的索引来检索数据 。

2、batch_size,定义batch_size大小,也就是一次加载样本的数量,默认是1。

3、shuffle,在每个epoch开始的时候,是否进行数据重排序,默认False.

4、collate_fn,是用来处理不同情况下的输入dataset的封装。

5、batch_sampler,与参数sampler相似,但是一次只返回一个batch索引(indices),其和batch_size、shuffle等参数是互斥的。

6、sampler,定义从数据集中取样本元素的索引 ,如果进行了指定,那么shuffle必须是False。

7、num_workers,定义加载数据使用的进程数,0的话表示数据导入在主进程中进行,其他大于0的数表示通过多个进程来导入数据,可以加快数据导入速度。

8、pin_memory,如果设定为True,那么data loader将会在返回之前,将tensors拷贝到CUDA中的固定内存。

9、timeout,是用来设置数据读取的超时时间的,但超过这个时间还没读取到数据的话就会报错。

10、drop_last , 这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,如果设置为True,那么训练的时候后面的36个就被扔掉了。如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。

 深度的理解可以查看:

PyTorch中的Data.DataLoader_interesting233333的博客-CSDN博客

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答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在数据和预处理方面提供了非常强大的工具,只需要实现一些简单的代码,就能轻松地完成数据和预处理,从而为模型的训练和测试提供了坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小的土拨鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值