python
。我的想法
让多个CPU线程预处理图像并将它们放在随机的随机队列中。
让batchsize
个图像从队列中出列并用于CNN。
我的问题
a)以上方式是最佳的解决方法吗?
b)任何人都可以提供code example
作为参考资料吗?
答案 0 :(得分:0)
这是几乎符合您要求的my implementation。在train.py中使用很简单。
dataset_train = Dataset("path/to/list.train.txt", subtract_mean=True, is_train=True, name='train')
dataset_val = Dataset("path/to/list.val.txt", subtract_mean=True, is_train=False, name='val')
dataset_train.shuffle()
for batch_x, batch_y in dataset_train.batches(batch_size):
# batch_x: (batch_size, H, W, 3), batch_y: (batch_size)
...
# for samling for validation
for val_step, (val_batch_x, val_batch_y) in \
enumerate(dataset_val.sample_batches(batch_size, 256)):
由于带有GIL of CPython的threading python线程无法在多个CPU内核上同时运行。使用多核的另一种方法是multiprocessing(mp)。
带有mp.Process和mp.Queue的I used to implement the function,但mp.Queue 非常慢用于在进程之间传输像图像这样的大数据,因为它的实现受到{{3的限制(在Linux上)。在快速工作站上批量处理100张256x256图像的开销约为0.5秒,其中一批64张图像的AlexNet培训只需0.6秒。
我尝试了线程和队列,发现由于瓶颈是I / O而不是CPU计算,而Queue.Queue很快就会传输100张图像,即使没有多CPU,加载速度也会快得多。