- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解决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 Datafrom tqdm import tqdmclass 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 datatrain_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数据.
补充:Pytorch加载自己的数据集(使用DataLoader读取Dataset) 。
很多时候我们需要加载自己的数据集,这时候我们需要使用Dataset和DataLoader 。
Dataset:是被封装进DataLoader里,实现该方法封装自己的数据和标签.
DataLoader:被封装入DataLoaderIter里,实现该方法达到数据的划分.
阅读源码后,我们可以指导,继承该方法必须实现两个方法:
_getitem_() 。
_len_() 。
因此,在实现过程中我们测试如下:
import torchimport numpy as np# 定义GetLoader类,继承Dataset方法,并重写__getitem__()和__len__()方法class GetLoader(torch.utils.data.Dataset): # 初始化函数,得到数据 def __init__(self, data_root, data_label): self.data = data_root self.label = data_label # index是根据batchsize划分数据后得到的索引,最后将data和对应的labels进行一起返回 def __getitem__(self, index): data = self.data[index] labels = self.label[index] return data, labels # 该函数返回数据大小长度,目的是DataLoader方便划分,如果不知道大小,DataLoader会一脸懵逼 def __len__(self): return len(self.data)# 随机生成数据,大小为10 * 20列source_data = np.random.rand(10, 20)# 随机生成标签,大小为10 * 1列source_label = np.random.randint(0,2,(10, 1))# 通过GetLoader将数据进行加载,返回Dataset对象,包含data和labelstorch_data = GetLoader(source_data, source_label)
提供对Dataset的操作,操作如下:
torch.utils.data.DataLoader(dataset,batch_size,shuffle,drop_last,num_workers)
参数含义如下:
dataset: 加载torch.utils.data.Dataset对象数据 。
batch_size: 每个batch的大小 。
shuffle:是否对数据进行打乱 。
drop_last:是否对无法整除的最后一个datasize进行丢弃 。
num_workers:表示加载的时候子进程数 。
因此,在实现过程中我们测试如下(紧跟上述用例):
from torch.utils.data import DataLoader# 读取数据datas = DataLoader(torch_data, batch_size=6, shuffle=True, drop_last=False, num_workers=2)
此时,我们的数据已经加载完毕了,只需要在训练过程中使用即可.
我们可以通过迭代器(enumerate)进行输出数据,测试如下:
for i, data in enumerate(datas): # i表示第几个batch, data表示该batch对应的数据,包含data和对应的labels print("第 {} 个Batch {}".format(i, data))
。
输出结果如下图:
结果说明:由于数据的是10个,batchsize大小为6,且drop_last=False,因此第一个大小为6,第二个为4。每一个batch中包含data和对应的labels.
当我们想取出data和对应的labels时候,只需要用下表就可以啦,测试如下:
# 表示输出数据print(data[0])# 表示输出标签print(data[1])
结果如图:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/u011550545/article/details/87842760 。
最后此篇关于解决pytorch load huge dataset(大数据加载)的文章就讲到这里了,如果你想了解更多关于解决pytorch load huge dataset(大数据加载)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在 div 中加载一个 php 页面,该页面采用发布的变量来显示正确的内容。它的工作原理是这样的: $(".mainArea").load("page.php", {'folder': 'a'})
我是 AWS 新手。我开始学习 ALB 和 NLB。我知道 ALB 在第 7 层协议(protocol)中工作,而 NLB 在第 4 层协议(protocol)中工作。 谁能解释一下ALB和NLB的实
这是来自 this Article . filter(loaded => !loaded) 有什么作用?我没有在任何地方看到该变量的定义。 我明白这个方法的目的是什么,只是不是那一行。 canActi
我应该在 Constructor 还是 FormLoad() 中加载子表单? 我有一些代码调用在控件中嵌入表单的自定义类。我最初是在 Constructor 之外声明我的子窗体,然后在 FormLoa
目录 1、图解 2、json.loads()用法 3、json.load()用法 4、此外还有一种json.dumps 语法
我正在使用 PhoneGap 为 iPad 编写应用程序,我想在不触发 Safari 或使用 ChildBrowser 等内部 Web 浏览器的情况下加载外部 URL。 我正在使用 PhoneGap
人们经常在他们的(与优化和性能相关的)问题和答案中谈论“重载”。 我试图在典型服务器上的常规 Web 应用程序的上下文中量化这一点(以 SO 及其相当小的基础设施为例),假设它们立即返回(以简化和提高
有人可以写这段代码吗: this.Loaded += (s, e) => this.loaded = true; 分成几行代码以便我可以追溯其含义? 在我的代码示例中没有 s 或 e 吗? 最佳答案
我正在使用 jQuery 的 .load()方法和Loading Page Fragments 。以下是我当前的代码: $("#submit").click(function() { $("#
我想实现的是,当单击图像时,在该图像所在的 div 中,加载了一个包含来自另一个 .html 的其他内容的 div,但我无法完成。 如果我这样做,下面的代码将完美运行: $('#windows_lin
我使用 qt 开发了一个 c++ 库。在本文中,我使用 QSqlDatabase 从 SQLite 数据库中查询信息。注意:我的库在 qt 桌面应用程序中运行良好(我在 Linux 上开发)。 现在我
演示:http://jsfiddle.net/FyrRm/1/ 当我们向下滚动时,您会注意到...在滚动到文章标题到 之后我正在展示一个共享小部件。我正在使用 $(window).on("load"
我在 html(PC) 中使用的图像正确加载,我使用了 img 标签。我已将此文件连同图像一起保存并发送到我的手机,但它不会加载到手机上。我对图像大小或任何东西没有任何问题。我认为它与图像位置有关。
我将 .load() 广泛用于 AJAX 内容。很棒,但如果它做得更多一点,我会喜欢它: 如果为了响应用户操作,我多次调用同一个 div 上的 .load(),我可能会在 div 中得到错误的数据。当
我知道很多方法需要调用它的父类(super class)方法,有些方法不需要, 我正在寻找关于方法调配的东西。它在加载方法中初始化,并且在教程中没有[super load]。 我想知道是不是错了,还是
几个月来,我一直在使用pyGame 2.0.1。今天,我升级到最新版本(2.1.2)后,在尝试加载音频文件时开始出现以下错误:。到目前为止我尝试过的东西:。我使用的是Windows 10、Python
我有一个完整的 angular 应用程序,它使用预先加载。 我想将其转换为延迟加载,但是因为我对所有路线都有保护,而且所有路线都是到一条 protected 主路线的子路线,我不知道是否可以做到这一点
我有一个 React 应用程序,它在 useEffect 中调用我的 API,返回一个用作 imy 图像 src 的 URL 列表。 我正在使用 react-loader-spinner 在加载图像时
我正在使用 Slick.js 逐步加载我的图像我注意到有些图像要么部分加载,要么根本没有加载。 例如,在this site上,有两个画廊:建筑和设计(在导航中)。当用户单击任一图像时,他们会看到该图库
我在我的一个项目中收到此警告。这在调用我的后端 api 时会导致问题,因为它调用了 api 两次。我已经尝试过之前在论坛上发布的关于相同查询的解决方案,但我无法解决这个问题。如果有人能帮助我解决这个问
我是一名优秀的程序员,十分优秀!