如何使用pytorch同时迭代两个数据加载器?(代码片段)

author author     2022-12-27     662

关键词:

我正在尝试实现一个接收两个图像的Siamese网络。我加载这些图像并创建两个单独的数据加载器。

在我的循环中,我想同时浏览两个数据加载器,以便我可以在两个图像上训练网络。

for i, data in enumerate(zip(dataloaders1, dataloaders2)):

    # get the inputs
    inputs1 = data[0][0].cuda(async=True);
    labels1 = data[0][1].cuda(async=True);

    inputs2 = data[1][0].cuda(async=True);
    labels2 = data[1][1].cuda(async=True);

    labels1 = labels1.view(batchSize,1)
    labels2 = labels2.view(batchSize,1)

    # zero the parameter gradients
    optimizer.zero_grad()

    # forward + backward + optimize
    outputs1 = alexnet(inputs1)
    outputs2 = alexnet(inputs2)

dataloader的返回值是一个元组。但是,当我尝试使用zip迭代它们时,我收到以下错误:

OSError: [Errno 24] Too many open files
Exception NameError: "global name 'FileNotFoundError' is not defined" in <bound method _DataLoaderIter.__del__ of <torch.utils.data.dataloader._DataLoaderIter object at 0x7f2d3c00c190>> ignored                           

不应该对所有可迭代项目进行压缩吗?但似乎在这里我无法在数据加载器上使用它。

还有其他方法来追求这个吗?或者我是否正确地接近了Siamese网络的实施?

答案

我发现你正在努力制作正确的数据库功能。我会做:

class Siamese(Dataset):


def __init__(self, transform=None):

   #init data here

def __len__(self):
    return   #length of the data

def __getitem__(self, idx):
    #get images and labels here 
    #returned images must be tensor
    #labels should be int 
    return img1, img2 , label1, label2 
另一答案

完成@ ManojAcharya的回答:

你得到的错误既不是来自zip()也不是来自DataLoader()。 Python试图告诉你它找不到你要求的数据文件之一(异常跟踪中的c.f.FileNotFoundError),可能在你的Dataset中。

下面是一起使用DataLoaderzip的工作示例。请注意,如果要对数据进行随机播放,则很难保持2个数据集之间的对应关系。这证明了@ ManojAcharya的解决方案。

import torch
from torch.utils.data import DataLoader, Dataset

class DummyDataset(Dataset):
    """
    Dataset of numbers in [a,b] inclusive
    """

    def __init__(self, a=0, b=100):
        super(DummyDataset, self).__init__()
        self.a = a
        self.b = b

    def __len__(self):
        return self.b - self.a + 1

    def __getitem__(self, index):
        return index, "label_".format(index)

dataloaders1 = DataLoader(DummyDataset(0, 9), batch_size=2, shuffle=True)
dataloaders2 = DataLoader(DummyDataset(0, 9), batch_size=2, shuffle=True)

for i, data in enumerate(zip(dataloaders1, dataloaders2)):
    print(data)
# ([tensor([ 4,  7]), ('label_4', 'label_7')], [tensor([ 8,  5]), ('label_8', 'label_5')])
# ([tensor([ 1,  9]), ('label_1', 'label_9')], [tensor([ 6,  9]), ('label_6', 'label_9')])
# ([tensor([ 6,  5]), ('label_6', 'label_5')], [tensor([ 0,  4]), ('label_0', 'label_4')])
# ([tensor([ 8,  2]), ('label_8', 'label_2')], [tensor([ 2,  7]), ('label_2', 'label_7')])
# ([tensor([ 0,  3]), ('label_0', 'label_3')], [tensor([ 3,  1]), ('label_3', 'label_1')])
另一答案

当我们有不同长度的数据集时,添加@ Aldream的解决方案,如果我们想要在同一时期传递它们,那么我们可以使用来自cycle()(一个Python标准库)的itertools。使用@Aldrem的代码片段,更新后的代码如下所示:

from torch.utils.data import DataLoader, Dataset
from itertools import cycle

class DummyDataset(Dataset):
    """
    Dataset of numbers in [a,b] inclusive
    """

    def __init__(self, a=0, b=100):
        super(DummyDataset, self).__init__()
        self.a = a
        self.b = b

    def __len__(self):
        return self.b - self.a + 1

    def __getitem__(self, index):
        return index

dataloaders1 = DataLoader(DummyDataset(0, 100), batch_size=10, shuffle=True)
dataloaders2 = DataLoader(DummyDataset(0, 200), batch_size=10, shuffle=True)
num_epochs = 10

for epoch in num_epochs:
    for i, data in enumerate(zip(cycle(dataloaders1), dataloaders2)):
        print(data)

只有zip(),当长度等于最小数据集(此处为100)的长度时,迭代器将耗尽。但是通过使用cycle(),我们将再次重复最小的数据集,除非我们的迭代器查看来自最大数据集(此处为200)的所有样本。

附:人们总是可以说这种方法可能不需要实现收敛,只要随机抽样,但采用这种方法,评估可能更容易。

如何从 pytorch 数据加载器中获取批迭代的总数?

】如何从pytorch数据加载器中获取批迭代的总数?【英文标题】:Howtogetthetotalnumberofbatchiterationfrompytorchdataloader?【发布时间】:2021-01-0321:49:35【问题描述】:我有一个问题,如何从pytorch数据加载器获取批迭代的总数?以下是训练... 查看详情

pytorch数据加载(代码片段)

Pytorch:数据加载Pytorch中的数据加载1.模型中使用数据加载器的目的2.数据集类2.1Dataset基类介绍2.2数据加载案例3.迭代数据集4.pytorch自带的数据集4.1torchversion.datasets4.2MNIST数据集的介绍Pytorch中的数据加载学习目标知道数据加载... 查看详情

如何将 numpy 数组列表加载到 pytorch 数据集加载器?

】如何将numpy数组列表加载到pytorch数据集加载器?【英文标题】:Howtoloadalistofnumpyarraystopytorchdatasetloader?【发布时间】:2017-11-0918:48:43【问题描述】:我有一个庞大的numpy数组列表,其中每个数组代表一个图像,我想使用torch.utils... 查看详情

如何在 PYTorch 中定义数据加载器

】如何在PYTorch中定义数据加载器【英文标题】:HowtodefinedataloaderinPYTorch【发布时间】:2021-12-2916:34:16【问题描述】:我在张量流中尝试了数据加载器,但是如何在PYtorch中定义数据加载器定义数据加载器。train_loader=tf.data.Dataset.fr... 查看详情

如何从 PyTorch 中的数据加载器获取整个数据集

】如何从PyTorch中的数据加载器获取整个数据集【英文标题】:HowtogetentiredatasetfromdataloaderinPyTorch【发布时间】:2019-12-1415:29:08【问题描述】:如何从DataLoader加载整个数据集?我只得到一批数据集。这是我的代码dataloader=torch.utils.... 查看详情

使用带有概率分布的 Pytorch 数据加载器

】使用带有概率分布的Pytorch数据加载器【英文标题】:UsingPytorchDataloaderwithProbabilityDistribution【发布时间】:2022-01-1901:46:18【问题描述】:TL;DR:我想使用DataLoader对可用行进行加权随机抽样。怎么做?我已经将一些python代码放在... 查看详情

Pytorch 自定义数据加载器

】Pytorch自定义数据加载器【英文标题】:Pytorchcustomizeddataloader【发布时间】:2021-11-0905:29:23【问题描述】:我正在尝试使用pytorch-lightening训练具有MNIST数据集的分类器。importpytorch_lightningasplfromtorchvisionimporttransformsfromtorchvision.data... 查看详情

加载器同时使用关键字过滤数据

...来加载状态,默认情况下它是真的。如果有人可以帮助我如何在函数中使用setState钩子来更改状态 查看详情

pytorch中的数据加载(dataset基类,以及pytorch自带数据集)(代码片段)

目录pytorch中的数据加载模型中使用数据加载器的目的数据集类Dataset基类介绍数据加载案例数据加载器类pytorch自带的数据集torchvision.datasetsMINIST数据集的介绍pytorch中的数据加载模型中使用数据加载器的目的在前面的线性回归模型... 查看详情

pytorch-dataloader(数据迭代器)

在没有用pytorch之前,读取数据一般时写一个load_data的函数,在里面导入数据,做一些数据预处理,这一部分就显得很烦索。对于深度学习来说,还得考虑batch的读取、GPU的使用、数据增强、数据乱序读取等等&#... 查看详情

pytorch-dataloader(数据迭代器)

在没有用pytorch之前,读取数据一般时写一个load_data的函数,在里面导入数据,做一些数据预处理,这一部分就显得很烦索。对于深度学习来说,还得考虑batch的读取、GPU的使用、数据增强、数据乱序读取等等&#... 查看详情

如何复制只有两个迭代器的数据?

】如何复制只有两个迭代器的数据?【英文标题】:Howtocopydatahavingonlytwoiterators?【发布时间】:2019-10-2009:51:32【问题描述】:我正在创建一个合并排序算法,该算法的步骤之一涉及创建子数组,这些子数组是执行排序的序列的一... 查看详情

pytorch学习笔记3.数据集和数据加载器(代码片段)

PyTorch学习笔记3.数据集和数据加载器一、说明二、使用PyTorch预置数据集1.预置数据集FashionMNIST介绍2.加载数据集3.对数据集处理和可视化三、自定义数据集1.要实现的方法2.定义3.`__init__`4.`__len`5.`__getitem__`6.准备... 查看详情

pytorch中如何使用dataloader对数据集进行批训练

...,就涉及到每一批应该选择什么数据的问题,而pytorch的dataloader就能够帮助我们包装数据,还能够有效的进行数据迭代,以达到批训练的目的。如何使用pytorch数据加载到模型Pytorch的数据加载到模型是有一个操作顺... 查看详情

pytorch中如何使用dataloader对数据集进行批训练

...,就涉及到每一批应该选择什么数据的问题,而pytorch的dataloader就能够帮助我们包装数据,还能够有效的进行数据迭代,以达到批训练的目的。如何使用pytorch数据加载到模型Pytorch的数据加载到模型是有一个操作顺... 查看详情

如何加载数据以及如何使用 pytorch 进行数据扩充

】如何加载数据以及如何使用pytorch进行数据扩充【英文标题】:howtoloadthedataandhowtododataaugmentationusingpytorch【发布时间】:2020-06-1804:07:26【问题描述】:我是Pytorch的新手,我正在做图像分类问题,但是我不明白如何从加载目录加... 查看详情

PyTorch 数据加载器中的“工人数量”参数实际上是如何工作的?

】PyTorch数据加载器中的“工人数量”参数实际上是如何工作的?【英文标题】:Howdoesthe"numberofworkers"parameterinPyTorchdataloaderactuallywork?【发布时间】:2019-05-2815:00:46【问题描述】:如果num_workers为2,这是否意味着它会将2个... 查看详情

加载器的无效数据类型 - Pytorch Lightning DataModule

】加载器的无效数据类型-PytorchLightningDataModule【英文标题】:InvalidDatatypeforloaders-PytorchLightningDataModule【发布时间】:2022-01-2102:30:03【问题描述】:我正在尝试进行文本摘要练习,并且我已经训练和测试了包含两列文本和摘要(... 查看详情