我尝试使用 加载数据集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) 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) 我正在为 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)
意味着应该能够一次检索多个项目,这让我想知道:
这种转换如何作用于多个项目?以教程中的自定义转换为例。它们看起来无法在一次调用中应用于一批样本。
相关的是,如果转换只能应用于单个样本,DataLoader 如何并行检索一批多个样本并应用所述转换?
我正在 PyTorch 中训练一个用于二元分类的深度学习模型,并且我有一个包含不平衡类比例的数据集。10%我的少数派课程由给定的观察结果组成。为了避免模型学习只预测多数类,我想WeightedRandomSampler在torch.utils.data我的DataLoader.
假设我有1000观察结果(900在类中0,100在类中1),并且我的数据加载器的批量大小100为。
如果没有加权随机抽样,我预计每个训练周期将包含 10 个批次。
尝试在 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
我通过 PyTorch 数据集使用 emnist 数据集以及需要 3 通道输入的神经网络。
我想使用 PyTorch 变换将 1D 灰度复制为 3D,这样我就可以对 1D 和 3D 数据使用相同的网络。
我可以使用哪种变换?或者我将如何按照此处的建议扩展 PyTorch 转换:/sf/answers/3537164641/
我有一个地图类型数据集,用于实例分割任务。该数据集非常不平衡,有些图像只有 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
与 python 的多处理相关的序列化和反序列化似乎限制了并行处理数据的好处。
在下面的示例中,我创建一个返回 numpy 数组的自定义迭代。随着numpy数组大小的增加,数据获取过程成为瓶颈。这是预料之中的。然而,我预计会增加num_worker并prefetch_factor通过提前准备批次来减少这一瓶颈。但我在下面的示例中没有看到这种行为。
我测试了两种MyIterable返回的情况
np.array((10, 150))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) 我正在关注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 …
我是 PyTorch 的新手。奇怪的是,我找不到与此相关的任何内容,尽管它看起来很简单。
我想用特定的示例来构建我的批次,例如每批次的所有示例都具有相同的标签,或者只是用仅 2 个类的示例填充批次。
我该怎么做呢?对我来说,这似乎是数据加载器中的正确位置,而不是数据集中的正确位置?由于数据加载器负责批次而不是数据集?
有一个简单的最小示例吗?