стиль карты набора данных pytorch против итеративного стиля

#pytorch

#pytorch

Вопрос:

Набор данных в стиле карты в Pytorch имеет __&etitem__() и __len__() , а наборы данных в стиле итерации имеют __iter__() протокол. Если мы используем map-style, мы можем получить доступ к данным с помощью dataset[idx] , что замечательно, однако с помощью iterable dataset мы не можем.

Мой вопрос в том, почему это различие было необходимо? Что делает случайное чтение данных таким дорогим или даже невероятным?

Ответ №1:

Я написал короткий пост о том, как использовать наборы данных PyTorch, и о разнице между набором данных в стиле карты и в стиле итерации.

По сути, вы должны использовать наборы данных в стиле карты, когда это возможно. Наборы данных в стиле карты сообщают вам свой размер заранее, их легче перетасовывать и они обеспечивают легкую параллельную загрузку.

Распространенное заблуждение заключается в том, что если ваши данные не помещаются в память, вы должны использовать набор данных в стиле iterable. Это неверно. Вы можете реализовать набор данных в стиле карты таким образом, чтобы он повторно загружал данные по мере необходимости.

Ознакомьтесь с полным сообщением здесь.

Ответ №2:

Вполне возможно, что полный набор данных не помещается в памяти (может быть на диске или доступен только по сети). Поток информации не обязательно сохранять, если вы не собираетесь обращаться к произвольным смещениям. Если вы собираетесь запрашивать данные [0], затем данные [1], затем данные [2] по сети, вы отправляете много запросов, что приводит к задержке.

Объекты, подобные Iterable (ResultSet), типичны при пошаговом чтении строк в результатах запроса к базе данных. Также возможно, что набор данных по своей сути может представлять собой поток информации, такой как данные журнала, или транзакции, или постепенно обнаруживаемые страницы, найденные веб-сканером.