2016-08-25 1 views
1

Actuellement, je travaille avec des données volumétriques 3D avec Caffe en Python. Au total, j'ai 25 volumes, et à partir de chacun, je dois prendre des sous-volumes, et les nourrir à travers un réseau convolutif. Le problème est qu'il pourrait y avoir des milliers de ces volumes, et actuellement je les sauvegarde dans des fichiers hdf5, ce qui fonctionne bien mais utilise beaucoup de disque dur. Aussi, je prévois de faire une augmentation des données à la volée, donc je pense qu'il est préférable d'utiliser une technique de prélecture afin de charger les données dans un thread séparé sans bloquer l'entraînement. Je veux quelque chose comme ceci:Prefetch données dans un fil séparé dans Caffe

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) 

Donc, fondamentalement, je veux des fils qui maintiennent l'alimentation des données à la file d'attente, mais sans bloquer le thread principal pour faire la formation. Dans les fils de données d'alimentation, je devrais faire l'échantillonnage et l'augmentation du sous-volume si possible. Quelqu'un pourrait-il me guider sur la façon de mettre en œuvre cela. J'ai vérifié cet exemple https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/roi_data_layer/layer.py mais il ne charge qu'une image et la place dans la file d'attente. Merci d'avance.

Répondre

1

Si vous souhaitez effectuer plusieurs sous-volumes à la fois, vous pouvez lancer un thread séparé pour le trianing et un pool multi-usage séparé pour la préchargement et l'augmentation des données. Mon explication pourrait être un peu laconique. Vous pouvez jeter un oeil à LRCN Video Data si vous voulez savoir en détail comment c'est fait.

0

Caffé a un fil de pré-chargement intégré qui prélève des données en parallèle pendant que le fil principal effectue l'entraînement. Il est implémenté dans les fichiers base_data_layer et internal_thread dans include et src. Je pense que cette préchargement fonctionne bien pour la plupart des applications, mais vous pouvez créer plus de threads de prélecture pour différents volumes si vous en avez besoin.