Я только начал с dask
, потому что он предлагает большую мощность параллельной обработки. На моем диске около 40000
изображений, которые я собираюсь использовать для построения классификатора с использованием некоторой библиотеки DL, скажем, Keras
или TF
. Я собрал эту мета-информацию (путь к изображению и соответствующую метку) в кадре данных pandas, который выглядит следующим образом:
img_path labels
0 data/1.JPG 1
1 data/2.JPG 1
2 data/3.JPG 5
...
Теперь вот мое простое задание: используйте dask для чтения изображений и соответствующих ярлыков lazy
. Выполните некоторую обработку изображений и передайте партии в классификатор в batch size
из 32.
Определить функции для чтения и предварительной обработки:
def read_data(idx):
img = cv2.imread(data['img_path'].iloc[idx])
label = data['labels'].iloc[idx]
return img, label
def img_resize(img):
return cv2.resize(img, (224,224))
Получите отсроченные массивы dask:
data = [dd.delayed(read_data)(idx) for idx in range(len(df))]
images = [d[0] for d in data]
labels = [d[1] for d in data]
resized_images = [dd.delayed(img_resize)(img) for img in images]
resized_images = [dd.array.from_delayed(x, shape=(224,224, 3),dtype=np.float32) for x in resized_images]
Теперь вот мои вопросы:
Q1. Как мне получить batch
данных с batch_size=32
из этого массива? Это эквивалентно ленивому генератору сейчас? Если нет, можно ли заставить его вести себя как один?
Q2. Как выбрать эффективный chunksize
для лучшей генерации партии? Например, если у меня 4
ядер, размер изображений (224,224,3)
, как я могу повысить эффективность моей пакетной обработки?