我刚从dask
开始,因为它具有强大的并行处理能力。我的磁盘上大约有40000
个图像,这些图像将用于使用某些Keras
或TF
这样的DL库构建分类器。我在熊猫数据框中收集了此元信息(图像路径和相应的标签),如下所示:
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)
,如何提高批处理的效率?