Загрузка пользовательского набора данных в pytorch - PullRequest
1 голос
/ 21 мая 2019

Обычно, когда мы загружаем данные в pytorch, мы делаем следующее

for x, y in dataloaders:
    # Do something

Однако в этом наборе данных, называемом MusicNet , они объявляют свой собственный набор данных и загрузчик данных следующим образом

train_set = musicnet.MusicNet(root=root, train=True, download=True, window=window)#, pitch_shift=5, jitter=.1)
test_set = musicnet.MusicNet(root=root, train=False, window=window, epoch_size=50000)

train_loader = torch.utils.data.DataLoader(dataset=train_set,batch_size=batch_size,**kwargs)
test_loader = torch.utils.data.DataLoader(dataset=test_set,batch_size=batch_size,**kwargs)

Затем они загружают данные вот так

with train_set, test_set:
    for i, (x, y) in enumerate(train_loader):
        # Do something

Вопрос 1

Я не понимаю, почему код не работает без строки with train_set, test_set.

Вопрос 2

Кроме того, как мне получить доступ к данным?

Я пытался

train_set.access(2560,0)

и

with train_set, test_set:
    x, y = train_set.access(2560,0)

Они либо выдают мне сообщение об ошибке типа

KeyError Traceback (последний вызов последним) в ----> 1 train_set.access (2560,0)

/ рабочая область / raven_data / AMT / MusicNet / pytorch_musicnet / musicnet.py в доступ (self, rec_id, s, shift, jitter) 106 107, если self.mmap: -> 108 x = np.frombuffer (self.records [rec_id] [0] [ssz_float: int (s + scaleself.window) * sz_float], dtype = np.float32) .copy () 109 остальное: 110 fid, _ = self.records [rec_id]

KeyError: 2560

или давая мне пустое x и y

1 Ответ

1 голос
/ 23 мая 2019

Вопрос 1

Я не понимаю, почему код не работает без строки with train_set, test_set.

Чтобы вы могли использоватьtorch.utils.data.DataLoader с пользовательским дизайном набора данных, вы должны создать класс своего набора данных, подклассы которого torch.utils.data.Dataset (и реализуя определенные функции) и передайте его загрузчику данных, даже если они так говорят:

Все остальные наборы данных должны иметь подклассы.Все подклассы должны переопределять __len__, который обеспечивает размер набора данных, и __getitem__, поддерживающие целочисленную индексацию в диапазоне от 0 до len (self) exclusive.

Это то, что происходит в:

train_set = musicnet.MusicNet(root=root, train=True, download=True, window=window)#, pitch_shift=5, jitter=.1)

test_set = musicnet.MusicNet(root=root, train=False, window=window, epoch_size=50000)

train_loader = torch.utils.data.DataLoader(dataset=train_set,batch_size=batch_size,**kwargs)
test_loader = torch.utils.data.DataLoader(dataset=test_set,batch_size=batch_size,**k

Если вы проверите их musicnet.MusicNet, вы обнаружите, что они делают это.

Вопрос 2

Также,как получить доступ к данным?

Возможны следующие способы:

Чтобы получить только пакет из набора данных, вы можете сделать:

batch = next(iter(train_loader))

Чтобы получить доступ ко всему набору данных (особенно в вашем примере) :

dataset = train_loader.dataset.records

(.records - это часть, которая может варьироваться от набора данных к другому, ясказал .records потому что это то, что я нашел в здесь )

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