Класс
Dataset и класс Dataloader в PyTorch помогают нам передавать собственные данные обучения в сеть. Класс набора данных используется для предоставления интерфейса для доступа ко всем обучающим или тестовым образцам в вашем наборе данных. Чтобы достичь этого, вы должны реализовать как минимум два метода, __getitem__
и __len__
, чтобы каждый обучающий образец мог быть доступен по его индексу. В части инициализации класса мы загружаем набор данных (как тип с плавающей запятой) и преобразуем их в тензоры горелки с плавающей запятой. __getitem__
вернет функции и целевое значение.
В чем различия между этими методами?
В PyTorch вы также можете подготовить свои данные так, чтобы PyTorch DataLoader может потреблять его, и вы получите итеративный объект, или вы можете перегрузить DataLoader по умолчанию для выполнения некоторых пользовательских операций, например, если вы хотите выполнить некоторую предварительную обработку текста / изображений, составлять кадры из видеоклипов и т. д. c.
Наш DataLoader ведет себя как итератор, поэтому мы можем l oop поверх него и каждый раз получать разные мини-пакеты.
Basi c Sample
from torch.utils.data import DataLoader
train_loader = DataLoader(dataset=train_data, batch_size=16, shuffle=True)
valid_loader = DataLoader(dataset=valid_data, batch_size=16, shuffle=True)
# To retrieve a sample mini-batch, one can simply run the command below —
# it will return a list containing two tensors:
# one for the features, another one for the labels.
next(iter(train_loader))
next(iter(valid_loader))
Пользовательский образец
import torch
from torch.utils.data import Dataset, Dataloader
class SampleData(Dataset):
def __init__(self, data):
self.data = torch.FloatTensor(data.values.astype('float'))
def __len__(self):
return len(self.data)
def __getitem__(self, index):
target = self.data[index][-1]
data_val = self.data[index] [:-1]
return data_val,target
train_dataset = SampleData(train_data)
valid_dataset = SampleData(valid_data)
device = "cuda" if torch.cuda.is_available() else "cpu"
kwargs = {'num_workers': 1, 'pin_memory': True} if device=='cuda' else {}
train_loader = DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True, **kwargs)
test_loader = DataLoader(valid_dataset, batch_size=test_batch_size, shuffle=False, **kwargs)
Почему вы используете один поверх другого?
Это зависит только от вашего варианта использования и количество контроля вы хотите. PyTorch дал вам всю силу, и именно вы решите, сколько вы хотите. Предположим, вы решаете простую задачу классификации изображений:
Вы можете просто поместить все изображения в папку root, в каждой подпапке которой содержатся образцы, принадлежащие определенному классу, и пометить папку именем класса. , При обучении нам просто нужно указать путь к папке root, и PyTorch DataLoader автоматически выберет изображения из каждой папки и обучит модель.
Но, с другой стороны, если у вас есть классификация видеоклипов или видеопоследовательностей, обычно называемых тегами видео, в большом видеофайле, то вам нужно написать свой собственный DataLoader для загрузки кадров из видео, сложить их в стек и введите данные в DataLoader.
Использование может найти несколько полезных ссылок ниже для дальнейшей справки:
https://pytorch.org/docs/stable/data.html
https://stanford.edu/~shervine/blog/pytorch-how-to-generate-data-parallel
https://pytorch.org/tutorials/beginner/data_loading_tutorial.html