标签: pytorch-dataloader

AttributeError:“_MultiProcessingDataLoaderIter”对象没有属性“next”

我尝试使用 加载数据集Torch Dataset and DataLoader,但出现以下错误:

AttributeError: '_MultiProcessingDataLoaderIter' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)

我使用的代码是:

class WineDataset(Dataset):

    def __init__(self):
        # Initialize data, download, etc.
        # read with numpy or pandas
        xy = np.loadtxt('./data/wine.csv', delimiter=',', dtype=np.float32, skiprows=1)
        self.n_samples = xy.shape[0]

        # here the first column is the class label, the rest are the features
        self.x_data = torch.from_numpy(xy[:, 1:]) # size [n_samples, n_features]
        self.y_data = torch.from_numpy(xy[:, [0]]) # size [n_samples, 1]

    # support indexing such that dataset[i] can be used to get …
Run Code Online (Sandbox Code Playgroud)

python torch pytorch pytorch-dataloader

26
推荐指数
2
解决办法
5万
查看次数

PyTorch:使用Dataloader加载批量数据时,如何将数据自动传输到GPU

Dataset如果我们使用和类的组合Dataloader(如下所示),我必须使用或显式地将数据加载到GPU上。有没有办法指示数据加载器自动/隐式执行此操作?.to().cuda()

理解/重现场景的代码:

from torch.utils.data import Dataset, DataLoader
import numpy as np

class DemoData(Dataset):
    def __init__(self, limit):
        super(DemoData, self).__init__()
        self.data = np.arange(limit)

    def __len__(self):
        return self.data.shape[0]

    def __getitem__(self, idx):
        return (self.data[idx], self.data[idx]*100)

demo = DemoData(100)

loader = DataLoader(demo, batch_size=50, shuffle=True)

for i, (i1, i2) in enumerate(loader):
    print('Batch Index: {}'.format(i))
    print('Shape of data item 1: {}; shape of data item 2: {}'.format(i1.shape, i2.shape))
    # i1, i2 = i1.to('cuda:0'), i2.to('cuda:0')
    print('Device of data item 1: {}; …
Run Code Online (Sandbox Code Playgroud)

gpu python-3.x pytorch pytorch-dataloader

13
推荐指数
1
解决办法
3万
查看次数

PyTorch DataLoader 如何与 PyTorch 数据集交互以转换批次?

我正在为 NLP 相关任务创建自定义数据集。

在 PyTorch自定义 datast 教程中,我们看到该__getitem__()方法在返回样本之前为转换留出了空间:

def __getitem__(self, idx):
        if torch.is_tensor(idx):
            idx = idx.tolist()

        img_name = os.path.join(self.root_dir,
                                self.landmarks_frame.iloc[idx, 0])
        image = io.imread(img_name)
       
        ### SOME DATA MANIPULATION HERE ###

        sample = {'image': image, 'landmarks': landmarks}
        if self.transform:
            sample = self.transform(sample)

        return sample
Run Code Online (Sandbox Code Playgroud)

然而,这里的代码:

        if torch.is_tensor(idx):
            idx = idx.tolist()
Run Code Online (Sandbox Code Playgroud)

意味着应该能够一次检索多个项目,这让我想知道:

  1. 这种转换如何作用于多个项目?以教程中的自定义转换为例。它们看起来无法在一次调用中应用于一批样本。

  2. 相关的是,如果转换只能应用于单个样本,DataLoader 如何并行检索一批多个样本并应用所述转换?

python pytorch pytorch-dataloader

9
推荐指数
1
解决办法
8400
查看次数

加权随机采样器 - 过采样还是欠采样?

问题

我正在 PyTorch 中训练一个用于二元分类的深度学习模型,并且我有一个包含不平衡类比例的数据集。10%我的少数派课程由给定的观察结果组成。为了避免模型学习只预测多数类,我想WeightedRandomSamplertorch.utils.data我的DataLoader.

假设我有1000观察结果(900在类中0100在类中1),并且我的数据加载器的批量大小100为。

如果没有加权随机抽样,我预计每个训练周期将包含 10 个批次。

问题

  • 使用此采样器时,每个时期只会对 10 个批次进行采样 - 因此,由于少数类别现在在训练批次中所占比例过高,模型是否会在每个时期“错过”大部分类别的大部分?
  • 使用采样器是否会导致每个 epoch 采样超过 10 个批次(这意味着相同的少数类观察结果可能会出现多次,并且训练速度也会减慢)?

pytorch oversampling pytorch-dataloader

9
推荐指数
1
解决办法
1万
查看次数

pytorch torchvision.datasets.ImageFolder FileNotFoundError:找不到类 .ipynb_checkpoints 的有效文件

尝试在 Colab 中使用 pytorch torch.datasets.ImageFolder 加载训练数据。

transform = transforms.Compose([transforms.Resize(400),
                                transforms.ToTensor()])
dataset_path = 'ss/'
dataset = datasets.ImageFolder(root=dataset_path, transform=transform)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=20)
Run Code Online (Sandbox Code Playgroud)

我遇到了以下错误:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-27-7abcc1f434b1> in <module>()
      2                                 transforms.ToTensor()])
      3 dataset_path = 'ss/'
----> 4 dataset = datasets.ImageFolder(root=dataset_path, transform=transform)
      5 dataloader = torch.utils.data.DataLoader(dataset, batch_size=20)

3 frames
/usr/local/lib/python3.7/dist-packages/torchvision/datasets/folder.py in make_dataset(directory, class_to_idx, extensions, is_valid_file)
    100         if extensions is not None:
    101             msg += f"Supported extensions are: {', '.join(extensions)}"
--> 102         raise FileNotFoundError(msg)
    103 
    104     return instances

FileNotFoundError: …
Run Code Online (Sandbox Code Playgroud)

machine-learning computer-vision pytorch torchvision pytorch-dataloader

9
推荐指数
1
解决办法
2万
查看次数

是否有 PyTorch 转换可以将 1 通道数据转换为 3 通道数据?

我通过 PyTorch 数据集使用 emnist 数据集以及需要 3 通道输入的神经网络。

我想使用 PyTorch 变换将 1D 灰度复制为 3D,这样我就可以对 1D 和 3D 数据使用相同的网络。

我可以使用哪种变换?或者我将如何按照此处的建议扩展 PyTorch 转换:/sf/answers/3537164641/

pytorch pytorch-lightning pytorch-dataloader

8
推荐指数
2
解决办法
1万
查看次数

自定义采样器在 Pytorch 中的正确使用

我有一个地图类型数据集,用于实例分割任务。该数据集非常不平衡,有些图像只有 10 个对象,而其他图像则多达 1200 个。

如何限制每批次的对象数量?

一个最小的可重现示例是:

import math
import torch
import random
import numpy as np
import pandas as pd
from torch.utils.data import Dataset
from torch.utils.data.sampler import BatchSampler


np.random.seed(0)
random.seed(0)
torch.manual_seed(0)


W = 700
H = 1000

def collate_fn(batch) -> tuple:
    return tuple(zip(*batch))

class SyntheticDataset(Dataset):
    def __init__(self, image_ids):
        self.image_ids = torch.tensor(image_ids, dtype=torch.int64)
        self.num_classes = 9

    def __len__(self):
        return len(self.image_ids)

    def __getitem__(self, idx: int):
        """
            returns single sample
        """
        # print("idx: ", idx)

        # deliberately left dangling
        # id = …
Run Code Online (Sandbox Code Playgroud)

dataset pytorch torchvision pytorch-lightning pytorch-dataloader

7
推荐指数
1
解决办法
7655
查看次数

Pytorch DataLoader 中的 num_worker 和 prefetch_factor 无法扩展

与 python 的多处理相关的序列化和反序列化似乎限制了并行处理数据的好处。

在下面的示例中,我创建一个返回 numpy 数组的自定义迭代。随着numpy数组大小的增加,数据获取过程成为瓶颈。这是预料之中的。然而,我预计会增加num_workerprefetch_factor通过提前准备批次来减少这一瓶颈。但我在下面的示例中没有看到这种行为。

我测试了两种MyIterable返回的情况

  1. 小物体np.array((10, 150))
  2. 大物体np.array((1000, 150))

两种情况下处理一个批次的平均时间如下:

# small np object
avg time per batch for num workers=0: 0.47068126868714444
avg time per batch for num workers=2: 0.20982365206225495
avg time per batch for num workers=4: 0.10560789656221914
avg time per batch for num workers=6: 0.07202646931250456
avg time per batch for num workers=8: 0.05311137337469063
Run Code Online (Sandbox Code Playgroud)
# large np object
avg time per batch for num workers=0: 0.6090951558124971
avg time per batch …
Run Code Online (Sandbox Code Playgroud)

python-multiprocessing pytorch pytorch-dataloader

7
推荐指数
0
解决办法
1964
查看次数

如何使用 torch Vision 在 Google Colab 上加载 CelebA 数据集,而不会耗尽内存?

我正在关注DCGAN教程。每当我尝试加载 CelebA 数据集时,torchvision 都会耗尽我所有的运行时内存(12GB)并且运行时崩溃。我正在寻找如何在不占用运行时资源的情况下加载数据集并将转换应用于数据集的方法。

重现

这是导致问题的代码部分。

# Root directory for the dataset
data_root = 'data/celeba'
# Spatial size of training images, images are resized to this size.
image_size = 64

celeba_data = datasets.CelebA(data_root,
                              download=True,
                              transform=transforms.Compose([
                                  transforms.Resize(image_size),
                                  transforms.CenterCrop(image_size),
                                  transforms.ToTensor(),
                                  transforms.Normalize(mean=[0.5, 0.5, 0.5],
                                                       std=[0.5, 0.5, 0.5])
                              ]))
Run Code Online (Sandbox Code Playgroud)

完整的笔记本可以在这里找到

环境

  • PyTorch版本:1.7.1+cu101

  • 是否调试版本:False

  • 用于构建 PyTorch 的 CUDA:10.1

  • 用于构建 PyTorch 的 ROCM:N/A

  • 操作系统:Ubuntu 18.04.5 LTS (x86_64)

  • GCC版本:(Ubuntu 7.5.0-3ubuntu1~18.04)7.5.0

  • Clang 版本:6.0.0-1ubuntu2 (tags/RELEASE_600/final)

  • CMake版本:版本3.12.0

  • Python版本:3.6(64位运行时)

  • CUDA 是否可用: 是

  • CUDA 运行时版本:10.1.243

  • GPU型号和配置:GPU 0:Tesla T4

  • Nvidia驱动程序版本:418.67

  • cuDNN版本:/usr/lib/x86_64-linux-gnu/libcudnn.so.7.6.5 …

python dataset pytorch torchvision pytorch-dataloader

6
推荐指数
1
解决办法
1万
查看次数

使用特定元素自定义批次

我是 PyTorch 的新手。奇怪的是,我找不到与此相关的任何内容,尽管它看起来很简单。

我想用特定的示例来构建我的批次,例如每批次的所有示例都具有相同的标签,或者只是用仅 2 个类的示例填充批次。

我该怎么做呢?对我来说,这似乎是数据加载器中的正确位置,而不是数据集中的正确位置?由于数据加载器负责批次而不是数据集?

有一个简单的最小示例吗?

pytorch pytorch-dataloader

6
推荐指数
1
解决办法
5681
查看次数