在pytorch中load超大训练数据

本文介绍了在PyTorch中处理大型训练数据集的两种方法:单线程加载和多进程加载,并提供了相关代码示例。通过使用`torch.utils.data.Dataset`,可以实现多进程并行加载数据。当数据过大导致内存溢出时,提出了将数据切分和使用`IterableDataset`的解决方案。
摘要由CSDN通过智能技术生成

在pytorch中load超大训练数据

by joeyqzhou

相关代码地址: https://github.com/joeyqzhou/blog/tree/master/pytorch%E4%B8%ADload%E8%B6%85%E5%A4%A7%E8%AE%AD%E7%BB%83%E6%95%B0%E6%8D%AE

最简单方式:

1 单线程获取数据到内存中

2 train的过程

   for epoch in range(num_epochs):
        for i in range(inst_size): 
        		#截取 batch_x, batch_y
          	#batch_x, batch_y 转换为tensor
            #model.forward()
            #loss.backward()
            #optimizer.step()
                

这种方式代码简单。缺点load数据过慢,数据全部存储在内存当中。

当训练数据过大的时候load很慢,内存会溢出

多进程load数据

如下是一个多进程load数据的例子

from multiprocessing import Pool

def process_line(line):
    return "FOO: %s" % line

if __name__ == "__main__":
    pool = Pool(4)
    file = "train.txt" #你的输入数据
    ret = []
    with open(file) as source_file:
        # chunk the work into batches of 4 lines at a time
        results = pool.map(process_line, source_file, 4)

PyTorch,你可以使用`torch.utils.data.ConcatDataset`来将两个不同的`Dataset`对象合并为一个数据集,然后使用`torch.utils.data.DataLoader`来加载数据。下面是一个示例代码,演示了如何在两个不同的数据分别取数据: ```python import torch from torch.utils.data import DataLoader, ConcatDataset # 定义两个不同的数据集 dataset1 = YourDataset1() # 自定义第一个数据集 dataset2 = YourDataset2() # 自定义第二个数据集 # 合并两个数据集为一个 concat_dataset = ConcatDataset([dataset1, dataset2]) # 定义数据加载器 batch_size = 32 data_loader = DataLoader(concat_dataset, batch_size=batch_size, shuffle=True) # 迭代加载数据 for batch_data in data_loader: # 在这里进行你的训练或测试操作 data1, target1 = batch_data[0] # 第一个数据集的数据和标签 data2, target2 = batch_data[1] # 第二个数据集的数据和标签 # 其他操作... ``` 在这个示例,我们首先定义了两个不同的数据集`dataset1`和`dataset2`,你需要根据实际情况自定义这两个数据集。然后,我们使用`ConcatDataset`将两个数据集合并成一个`concat_dataset`。接下来,我们定义了`DataLoader`,并指定了合适的`batch_size`和其他参数。最后,在迭代加载数据时,我们可以通过索引访问`batch_data`来获取不同数据数据和标签。 请注意,合并的数据数据顺序会根据`shuffle`参数进行随机打乱。如果你希望每个数据集内部的数据顺序保持不变,但是两个数据集之间的顺序随机打乱,你可以将`shuffle=True`设置在`DataLoader`,而不是在`ConcatDataset`。 希望这个示例能帮助你在PyTorch分别取两个数据集的数据。如果有更多的问题,请随时提问!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值