Самый эффективный способ использовать большой набор данных для PyTorch? - PullRequest
0 голосов
/ 02 декабря 2018

Возможно, этот вопрос уже задавался ранее, но у меня проблемы с поиском соответствующей информации для моей ситуации.

Я использую PyTorch для создания CNN для регрессии с данными изображения.У меня нет формального академического опыта программирования, поэтому многие из моих подходов являются специальными и просто ужасно неэффективными.Иногда я могу вернуться к своему коду и почистить вещи позже, потому что неэффективность не настолько существенна, что значительно влияет на производительность.Однако в этом случае мой метод использования данных изображения занимает много времени, использует много памяти и выполняется каждый раз, когда я хочу проверить изменение в модели.

Что я имеюГотово - это, по сути, загрузка данных изображения в массивные массивы, сохранение этих массивов в файле .npy, а затем, когда я хочу использовать указанные данные для модели, я импортирую все данные в этом файле.Я не думаю, что набор данных действительно такой большой, так как он состоит из 5000 изображений с 3 цветными каналами размером 64x64.Тем не менее, моя загрузка памяти увеличивается до 70-80% (из 16 ГБ), когда она загружается, и загрузка занимает каждый раз 20-30 секунд.

Я предполагаю, что я нахожусьтупо о том, как я загружаю его, но, честно говоря, я не уверен, что стандарт.Должен ли я каким-то образом поместить данные изображения куда-нибудь, прежде чем они мне понадобятся, или данные должны быть загружены непосредственно из файлов изображений?И в любом случае, какой самый лучший и самый эффективный способ сделать это, независимо от структуры файла?

Я был бы очень признателен за любую помощь в этом.

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Для скорости я бы посоветовал использовать HDF5 или LMDB :

Причины использования LMDB:

LMDB использует память-сопоставленные файлы, обеспечивая гораздо лучшую производительность ввода-вывода.Хорошо работает с действительно большими наборами данных.Файлы HDF5 всегда полностью считываются в память, поэтому вы не можете, чтобы файл HDF5 превышал объем памяти.Вы можете легко разделить ваши данные на несколько файлов HDF5 (просто укажите несколько путей к файлам h5 в вашем текстовом файле).Опять же, по сравнению с кэшированием страниц LMDB производительность ввода-вывода будет не такой хорошей.[http://deepdish.io/2015/04/28/creating-lmdb-in-python/]

Если вы решили использовать LMDB :

ml-pyxis - это инструмент для создания и чтения глубокого обучениянаборы данных с использованием LMDB.

Позволяет создавать двоичные двоичные объекты (LMDB), и они могут быть прочитаны довольно быстро.Ссылка выше содержит несколько простых примеров того, как создавать и читать данные.Включая генераторы Python / iteratos.

Этот блокнот содержит пример того, как создать набор данных и читать его параллельно, используя pytorch.

Если вы решили использовать HDF5 :

PyTables - это пакет для управления иерархическими наборами данных, предназначенный для эффективного и простого управления чрезвычайно большими объемами данных.

https://www.pytables.org/

0 голосов
/ 03 декабря 2018

Вот конкретный пример, чтобы продемонстрировать, что я имел в виду.Это предполагает, что вы уже выгрузили изображения в файл hdf5 (train_images.hdf5), используя h5py.

import h5py
hf = h5py.File('train_images.hdf5', 'r')

group_key = list(hf.keys())[0]
ds = hf[group_key]

# load only one example
x = ds[0]

# load a subset, slice (n examples) 
arr = ds[:n]

# should load the whole dataset into memory.
# this should be avoided
arr = ds[:]

Проще говоря, ds теперь можно использовать как итератор, который дает изображенияна лету (то есть он ничего не загружает в память).Это должно привести к быстрому разгоранию всего времени бега.

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