pytorch load huge dataset(大数据加载)

问题

最近用pytorch做实验时,遇到加载大量数据的问题。实验数据大小在400Gb,而本身机器的memory只有256Gb,显然无法将数据一次全部load到memory。

解决方法

首先自定义一个MyDataset继承torch.utils.data.Dataset,然后将MyDataset的对象feed in torch.utils.data.DataLoader()即可。MyDataset在__init__中声明一个文件对象,然后在__getitem__中缓慢读取数据,这样就不会一次把所有数据加载到内存中了。训练数据存放在train.txt中,每一行是一条数据记录。

import torch.utils.data as Data
from tqdm import tqdm
class MyDataset(Data.Dataset):
	def __init__(self,filepath):
		number = 0
		with open(filepath,"r") as f:
			# 获得训练数据的总行数
			for _ in tqdm(f,desc="load training dataset"):
				number+=1
		self.number = number
		self.fopen = open(filepath,'r')
	def __len__(self):
		return self.number
	def __getitem__(self,index):
		line = self.fopen.__next__()
		# 自定义transform()对训练数据进行预处理
		data = transform(line)
		return data

train_dataset = MyDataset(filepath = "train.txt")
training_data = Data.DataLoader(dataset=train_dataset, batch_size=32,num_workers=1)

注意

  1. num_workers只能设置为1。因为MyDataset初始化时只有一个文件对象,在dataloader时num_workers=1只用一个线程去操作文件对象读取数据。如果num_workers>1, 会出错,多个线程同时操作同一个文件对象,得到的数据并不是你想要的。
  2. 每一个epoch结束以后,需要重新声明train_dataset和training_data。因为一个epoch结束以后,文件对象已经指向文件末尾,下一个epoch取数据时,什么也得不到。
  3. 因为这里__getitem__()只是顺序的从文件中取出一行,而与index无关,那么在DataLoader时,即使参数shuffle指定为True,得到的数据依然是顺序的,即该方法无法shuffle数据。
  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PyTorch中将Dataset数据循环加载到模型中,可以通过使用DataLoader类来实现。 首先,需要定义自定义的Dataset类,继承自torch.utils.data.Dataset,并实现以下两个方法: 1. __len__(self): 返回Dataset中样本的总数。 2. __getitem__(self, index): 根据index返回对应的样本数据。 接下来,可以创建一个DataLoader对象,它接收这个自定义的Dataset对象作为输入,并提供一些参数来配置数据加载过程。其中,一些常用的参数有: 1. batch_size:每次返回的样本数量。 2. shuffle:是否对数据进行随机打乱。 3. num_workers:用于并行加载数据的进程数量。 然后,可以使用for循环来迭代这个DataLoader对象,即可获得每个batch的数据。在每个循环中,可以将数据送入模型进行训练或推理。 下面是一个简单的示例代码: ``` import torch from torch.utils.data import Dataset, DataLoader class MyDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, index): return self.data[index] # 创建自定义的Dataset对象 my_data = [1, 2, 3, 4, 5] dataset = MyDataset(my_data) # 创建DataLoader对象 dataloader = DataLoader(dataset, batch_size=2, shuffle=True, num_workers=2) # 循环加载数据并送入模型 for inputs in dataloader: # 将inputs送入模型进行训练或推理 pass ``` 上述代码中,MyDataset类表示一个简单的自定义Dataset,返回的数据为[1, 2, 3, 4, 5]。通过设置batch_size=2,shuffle=True和num_workers=2,我们创建了一个DataLoader对象dataloader。然后,在循环中,我们可以通过dataloader来迭代每个batch的数据,并将其送入模型进行训练或推理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值