在Caffe

时间:2016-08-25 16:38:06

标签: python multithreading caffe prefetch pycaffe

目前我正在使用Python中的Caffe处理3d体积数据。我总共有25卷,每一卷,我必须采用子卷,并通过卷积网络提供它们。问题是这些卷可能有数千个,目前我将它们保存在hdf5文件中,这样可以正常工作但使用了大量硬盘。此外,我计划在运行中进行一些数据扩充,所以我认为最好使用预取技术,以便在不阻止训练的情况下将数据加载到单独的线程中。我想要这样的东西:

dataqueue=Queue
pool = Pool(processes=3)

#here I want to do this in groups of say 3 because each volume is very big

for idx,namepatient in enumerate(patients):
    pool.apply_async(workerv1,args=(idx,namepatient,path_patients,volsz,destres,samplesperpatient,dirname))

for i in xrange(iterations):
  net.blobs['data'].data[0:sizebatch,...] =dataqueue.get()
  solver.step(1)

所以基本上我想要一些线程继续向队列提供数据,但是没有阻塞主线程来进行训练。在馈送数据线程中,如果可能,我应该进行子卷采样和扩充。任何人都可以指导我如何实现这一点。 我已经检查过这个例子https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/roi_data_layer/layer.py,但它只加载一个图像并将其放入队列中。提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果您希望同时对多个子卷执行操作,则可以启动单独的线程进行分区,并使用单独的多用途池进行数据预取和扩充。我的解释可能有点简洁。如果您想详细了解其完成情况,您可能需要查看LRCN Video Data

答案 1 :(得分:0)

Caffe有内置的预取线程,可以在主线程进行训练时并行预取数据。它在include和src中的base_data_layer和internal_thread文件中实现。我认为这种预取适用于大多数应用程序,但如果需要,可以为不同的卷创建更多的预取线程。