Le problème que j'essaie de résoudre est le suivant:
J'ai une liste La bonne nouvelle est la suivante: je l'ai travaillé dans un certain cas (voir PS Strong> à la fin !!) P> La mauvaise nouvelle est: i pense qu'il y a une meilleure façon de le faire. P> La méthode que j'utilise pour le faire maintenant est la suivante (j'ai simplifié les fonctions et avoir supprimé le prétraitement basé sur l'image et l'ensemble ultérieur, mais le cœur du traitement reste le même !!): p> La fonction de travail est la suivante: p> donc, bien que Cela fonctionne, j'ai l'impression qu'il existe un moyen meilleur et plus propre d'y parvenir. Donc, en quelques mots, mes questions sont les suivantes: P> P.S: Il semble que ce code ne soit pas parfait après tout. Lorsque j'ai couru avec 1,2 million d'images et 200 threads, il a couru. Cependant, lorsque je l'exécute pour 10 images et 20 threads, il donne l'erreur suivante: p> Je pensais que je l'ai couvert par formiMGS code> de noms de fichiers. J'ai défini un
tf.randomshaufflequeur code> avec son
capacité = len (formadimgs) code> et
min_after_dequeue = 0 code>. li>
tf.randomshaufflequeur code> devrait être rempli par
formidimgs code> pour un
epochlimit spécifié code> Nombre de fois. li>
tf.randomshaufflequeur code> et fait certaines opérations sur elle et en faisait en conclusion à une autre file d'attente. J'ai cette partie droite. Li>
1 époch code> de
drainimgs code> ont été traités et le
tf.randomshauffleueue code> est vide, à condition que l'époque actuelle
e
sauf tf.Errors.cancellederror < / code>. Qu'est-ce qui se passe ici? P> P>
3 Réponses :
Je recommande d'avoir un seul fil appelant Enqueue_many Epochs Times Enqueue le nombre d'images correct. Il peut alors fermer la file d'attente. Cela vous permettrait de simplifier votre fonction de travail et d'autres threads. P>
Merci mais j'aimerais utiliser plusieurs threads pour accélération car il y a des étapes de prétraitement complexes que je dois faire
Vous pouvez utiliser un thread pour en faisez des noms de fichiers dans la file d'attente principale, puis plusieurs threads pour déroger ces noms de fichiers, préprocessez et en faisez-les dans la file d'attente finale.
J'ai enfin découvert la réponse. Le problème était que plusieurs threads s'affrontent ensemble sur divers points de la fonction code>.
La fonction
Work () suivante () code> fonctionne parfaitement.
def work(coord, val, sess, epoch, maxepochs, incrementepoch, supplyimg, q, lock, close_op):
print('I am thread number %s'%(threading.current_thread().name))
print('I can see a queue with size %d'%(sess.run(q)))
while not coord.should_stop():
lock.acquire()
if sess.run(q) > 0:
filename, currepoch = sess.run([val, epoch])
filename = filename.decode(encoding='UTF-8')
tid = threading.current_thread().name
print(filename + ' ' + str(currepoch) + ' thread ' + str(tid))
elif sess.run(epoch) < maxepochs:
print('Thread %s has acquired the lock'%(threading.current_thread().name))
print("The previous epoch = %d"%(sess.run(epoch)))
sess.run([incrementepoch, supplyimg])
sz = sess.run(q)
print("The new epoch = %d"%(sess.run(epoch)))
print("The new queue size = %d"%(sz))
else:
coord.request_stop()
lock.release()
return None
Je pense que le GIL empêchera tout parallélisme réel d'être fait dans ces threads. P>
Pour obtenir des performances avec TENSORFLOW, vous devez conserver vos données dans TENSORFLOW. P>
TENSOR Flow's Guide de lecture de la lecture explique comment aborder un problème de problème très similaire. p>
Plus précisément, vous semblez avoir réécrit une partie importante de string_input_producer code>. p>
J'utilise des données réelles. string_input_producteur () code> ne dit pas que l'époque de données qu'il extrait à tout moment. Cela fait simplement sue que n'importe quel document est extrait de
EPOCH code> nombre de fois. Donc, ma mise en œuvre n'est pas une réécriture de
string_input_producer () code>. Je comprends que la façon dont je le fais est, c'est peut-être pas le meilleur moyen, mais je dois conserver un contrôle direct et très précis sur l'époque et l'itération particulières. Les données proviennent et je ne semblais pas trouver quoi que ce soit dans le Guide de données. à propos de ça. Je vais le lire à nouveau cependant.
Ah, merci de clarifier. Je suppose que je ne comprends pas complètement le problème. Pourquoi ne pas utiliser (chaîne, époque) paires?
Je l'ai utilisé. J'ai utilisé la variable code> epoch code> pour calculer l'époque code>