在TensorFlow中使用多个线程预处理混洗

时间:2017-03-16 16:32:51

标签: tensorflow

  1. 图片文件名列表python
  2. 重要的是要读取每个图像文件,然后对其应用以下步骤 - 拍摄5个随机作物及其镜像反射。
  3. 为了保持馈送到CNN的图像的顺序的随机性,来自一个图像的预处理的所有图像不应该一起进入CNN也是重要的。
  4. 我的想法

    1. 让多个CPU线程预处理图像并将它们放在随机的随机队列中。

    2. batchsize个图像从队列中出列并用于CNN。

    3. 我的问题

      a)以上方式是最佳的解决方法吗?

      b)任何人都可以提供code example作为参考资料吗?

1 个答案:

答案 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)):
  • 使用“threading”和“concurrent.futures”进行后台加载,使用“Queue”进行固定大小的预取(但这不使用多CPU,如下所述,不会丢失速度)。
  • 每个图像都是随机裁剪的,并在加载进行训练时翻转。 (仅用于测试和验证的中心裁剪)
  • 一批图像被出列以供给CNN。

为什么不使用多CPU

由于带有GIL of CPythonthreading 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,加载速度也会快得多。