набор данных pytorch и загрузчик данных с переменным размером

#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 ? Мне кажется, что было бы гораздо проще получить партию непосредственно из дека.