erstens, ich bin mir nicht sicher, ob der Titel sehr gut ist, aber es war das Beste, was ich mit meinem Verständnis der Situation kommen könnte.Force-Kopie von Tensor beim Einreihen
Der Hintergrund ist, dass ich versuche zu verstehen, wie Warteschlangen in Tensorflow arbeiten und stieß auf das folgende Problem, das mich verwirrt.
Ich habe eine variable n, die ich mit einem tf.FIFOQueue enqueue und dann inkrementieren I die Variable. Dies wird mehrere Male wiederholt, und man würde ein ähnliches Ergebnis wie 0, 1, 2, ... erwarten. Beim Leeren der Warteschlange sind jedoch alle Werte gleich.
Genauer gesagt, ist der Code wie folgt:
from __future__ import print_function
import tensorflow as tf
q = tf.FIFOQueue(10, tf.float32)
n = tf.Variable(0, trainable=False, dtype=tf.float32)
inc = n.assign(n+1)
enqueue = q.enqueue(n)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
sess.run(enqueue)
sess.run(inc)
sess.run(enqueue)
sess.run(inc)
sess.run(enqueue)
sess.run(inc)
print(sess.run(q.dequeue()))
print(sess.run(q.dequeue()))
print(sess.run(q.dequeue()))
Was ich würde drucken erwarten:
0.0
1.0
2.0
Stattdessen erhalte ich folgendes Ergebnis:
3.0
3.0
3.0
Es scheint so, Ich schiebe einen Zeiger auf n in die Warteschlange, anstatt den tatsächlichen Wert, was ich will. Ich habe jedoch kein wirkliches Verständnis für Tensorflow-Interna, also läuft vielleicht noch etwas anderes?
versuchte ich
enqueue = q.enqueue(n)
zu
enqueue = q.enqueue(tf.identity(n))
seit Antworten auf How can I copy a variable in tensorflow und In TensorFlow, what is tf.identity used for? gibt mir den Eindruck zu ändern, dass es helfen könnte, aber es ist nicht das Ergebnis ändern. Ich habe auch versucht, eine tf.control_dependencies() hinzuzufügen, aber wieder sind alle Werte gleich, wenn Sie die Warteschlange entfernen.
Edit: Die obige Ausgabe ist von der Ausführung des Codes auf einem Computer mit einer einzigen CPU, beim Versuch zu sehen, ob es einen Unterschied zwischen verschiedenen Versionen von Tensorflow gab, bemerkte ich, wenn ich den Code auf einem Computer mit CPU und ausführen GPU Ich bekomme das "erwartete" Ergebnis. In der Tat, wenn ich mit CUDA_VISIBLE_DEVICES = "" laufe, bekomme ich das obige Ergebnis, und mit CUDA_VISIBLE_DEVICES = "0" bekomme ich das "erwartete" Ergebnis.
Ein anderes Workaround 'q.enqueue_many ([[n]])' anstelle von 'q.enqueue (n)', das nach Wert und nicht nach Verweis in die Warteschlange einreiht –