Das Problem, das ich versuche zu lösen, ist wie folgt:
Ich habe eine Liste trainimgs
der Dateinamen. Ich habe ein
tf.RandomShuffleQueue
mit seinem capacity=len(trainimgs)
und min_after_dequeue=0
. tf.RandomShuffleQueue
wird voraussichtlich von trainimgs
für eine angegebene epochlimit
Anzahl gefüllt. tf.RandomShuffleQueue
und führt einige Operationen für dieses Element durch und reiht es in eine andere Warteschlange ein. Ich habe diesen Teil richtig gemacht. 1 epoch
von trainimgs
verarbeitet wurde und tf.RandomShuffleQueue
leer ist, vorausgesetzt, dass die aktuelle Epoche e < epochlimit
ist, muss die Warteschlange erneut gefüllt werden und die Threads müssen wieder funktionieren. Die gute Nachricht ist: Ich habe es in einem bestimmten Fall funktioniert (siehe PS am Ende !!)
Die schlechte Nachricht ist: Ich denke, dass es einen besseren Weg dafür gibt.
Die Methode, die ich dazu verwende, ist wie folgt (Ich habe die Funktionen vereinfacht und die e-Bildverarbeitungs-basierte Vorverarbeitung und das anschließende Einreihen entfernt, aber das Herz der Verarbeitung bleibt gleich !!):
%Vor%Die Arbeitsfunktion ist wie folgt:
%Vor%Obwohl das funktioniert, habe ich das Gefühl, dass es einen besseren und saubereren Weg gibt, dies zu erreichen. Kurz gesagt sind meine Fragen:
PS: Es scheint, dass dieser Code doch nicht perfekt ist. Als ich mit 1,2 Millionen Bildern und 200 Threads lief, lief es. Wenn ich es jedoch für 10 Bilder und 20 Threads ausführen, gibt es den folgenden Fehler:
%Vor% Ich dachte, ich hätte das von except tf.errors.CancelledError
. Was zum Teufel geht hier vor?
Ich empfehle, einen einzelnen Thread zu verwenden, der enqueue_viele Epochen aufruft, um die richtige Anzahl von Bildern in die Warteschlange zu stellen. Es kann dann die Warteschlange schließen. Dadurch können Sie Ihre Arbeitsfunktion und andere Threads vereinfachen.
Ich denke, die GIL wird verhindern, dass in diesen Threads tatsächlich Parallelität stattfindet.
Um Leistung mit Tensorflow zu erhalten, müssen Sie Ihre Daten in Tensorflow halten.
Tensor Flow Handbuch zum Lesen von Daten erklärt, wie man ein sehr ähnliches Problem anspricht.
Genauer gesagt scheinen Sie einen beträchtlichen Teil von string_input_producer
neu geschrieben zu haben.
Tags und Links tensorflow python-multithreading