Зачем переопределять набор данных вместо прямой передачи ввода и меток, pytorch - PullRequest
0 голосов
/ 30 марта 2020

Извините, если то, что я говорю здесь, неправильно - плохо знакомо с pytorch.

Из того, что я могу сказать, есть два основных способа получения обучающих данных и прохождения через сеть. Одним из них является переопределение набора данных, а другим - просто правильно подготовить данные и затем выполнить итерацию по ним, как показано в следующем примере: Пример классификации Pytorch

, который выполняет что-то вроде

rnn(input, hidden, output)
for i in range(input.size()[0]):
    output, hidden = rnn(input[i], hidden)

Другим способом было бы сделать что-то вроде

for epoch in range(epochs):
    for data, target in trainloader:
        computer model etc

, где в этом методе trainloader выполняет что-то вроде

trainloader = DataLoader(my_data)

после переопределения getitem и len

Мой вопрос здесь, каковы различия между этими методами и почему вы используете один над другим? Кроме того, мне кажется, что переопределение набора данных не работает для чего-то, что имеет, скажем, входной слой размером 100 узлов с выходом из 10 узлов, поскольку, когда вы возвращаете getitem , ему нужна пара ( данные, метка). Это похоже на случай, когда я, вероятно, не понимаю, как использовать набор данных очень хорошо, но именно поэтому я спрашиваю в первую очередь. Я думаю, что прочитал кое-что о функции сортировки, которая может помочь в этом сценарии?

1 Ответ

4 голосов
/ 01 апреля 2020
Класс

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...