#pytorch #iterator #dataset #dataloader
Вопрос:
У меня есть pytorch, dataset
который поддерживается коллекцией deque
. deque
Имеет начальный размер 0
. По мере прохождения обучения я буду постепенно добавлять элементы в deque
. Для контекста я тренирую DQN, и набор данных используется для хранения воспроизведения опыта.
class MyDataset(Dataset):
def __init__(self):
self.dat = deque()
def __len__(self):
return len(self.exp)
def __getitem__(self, item):
return self.dat[item]
На данный момент я инициализирую dataset
и dataloader
то, и другое вместе. Однако я получил следующую ошибку:
File "...torchutilsdatasampler.py", line 102, in __init__
raise ValueError("num_samples should be a positive integer "
ValueError: num_samples should be a positive integer value, but got num_samples=0
Q1: Очевидное решение состоит в том, чтобы, вероятно, инициализировать отдельное dataloader
обучение каждый раз, когда происходит обучение. Поскольку я отбираю только одну партию на каждом тренинге, насколько дороже
dataset = MyDataset()
dataloader = MyDataloader(dataset, ...)
for _ in epoch:
next(iter(dataloder))
по сравнению с
dataset = MyDataset()
for _ in epoch:
dataloader = MyDataloader(dataset, ...)
next(iter(dataloder))
Потому что я читал , что вызов iter
/ enumerate
и т. Д. сбрасывает dataloader
, но что именно происходит за сценой?
Вопрос 2: Законно ли вообще изменять dataset
, когда dataloader
присутствует a? Потому C
что , если у вас есть iterator
, вы не должны изменять исходное объявление. Например, следующее является незаконным:
std::vector<int>::iterator it = vec.begin()
vec.insert(0, 1)
// iterator error
Следует ли это за dataloader
?
Комментарии:
1. Вы сказали: «Я отбираю только одну партию на каждом тренинге». Вы уверены, что вам вообще нужно использовать
Dataset
иDataLoader
? Мне кажется, что было бы гораздо проще получить партию непосредственно из дека.