В то время как я нашел множество ответов на вопросы, похожие на мои, я не верю, что это прямо адресовано здесь, - и у меня есть несколько дополнительных вопросов. Мотивация совместного использования непрерывных массивов numpy заключается в следующем:
- Я использую сверточную нейронную сеть, запущенную на Caffe, для выполнения регрессии на изображениях на серии меток непрерывной ценности.
- Для изображений требуется специальная предварительная обработка и расширение данных.
- Ограничения (1) непрерывного характера меток (они являются поплавками) и (2) увеличение данных означает, что я предварительно обрабатываю данные в python, а затем обслуживаю его как непрерывные массивы numpy, используя -memory в слое Caffe.
- Загрузка обучающих данных в память происходит сравнительно медленно. Я хотел бы распараллелить его так, чтобы:
(1) Питон, который я пишу, создает класс "обработчик данных", который создает два непрерывных массива numpy. (2) Рабочий процесс чередуется между этими массивами numpy, загружает данные с диска, выполняет предварительную обработку и вставляет данные в массив numpy. (3) Между тем, python Caffe wrappers отправляют данные из другого массива на GPU для запуска через сеть.
У меня есть несколько вопросов:
-
Можно ли выделить память в непрерывном массиве numpy, а затем обернуть его в объект общей памяти (я не уверен, что здесь "правильный" термин), используя что-то вроде класса Array из многопроцессорности python?
-
У массивов Numpy есть атрибут .ctypes, я полагаю, что это полезно для создания массивов разделяемой памяти из массива Array(), но не может точно определить, как их использовать.
-
Если совместно используемая память создается без массива numpy, она остается непрерывной? Если нет, есть ли способ обеспечить его непрерывность?
Можно ли сделать что-то вроде:
import numpy as np
from multiprocessing import Array
contArr = np.ascontiguousarray(np.zeros((n_images, n_channels, img_height, img_width)), dtype=np.float32)
sm_contArr = Array(contArr.ctypes.?, contArr?)
Затем создайте экземпляр рабочего с помощью
p.append(Process(target=some_worker_function, args=(data_to_load, sm_contArr)))
p.start()
Спасибо!
Изменить: я знаю, что есть несколько библиотек, которые имеют аналогичные функции в разных состояниях обслуживания. Я предпочел бы ограничивать это чистым питоном и numpy, но если это не возможно, я, конечно, захочу его использовать.