最初はタイトルが非常に良いかどうかはわかりませんが、状況を理解していれば最高でした。エンキュー時にテンソルを強制的にコピーする
バックグラウンドは、キューがテンソルフローで動作する方法を理解しようとしていて、次の問題に遭遇して困惑しました。
は私はtf.FIFOQueueにエンキュー可変Nを有し、そして、私は、変数をインクリメントします。これは数回繰り返され、0,1,2、...と同様の結果が期待されます。ただし、キューを空にすると、すべての値が同じになります。
次のようにより正確には、コードは次のとおりです。
私は印刷するだろうと期待しており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()))
:
0.0
1.0
2.0
代わりに、私は次のような結果を得る:
3.0
3.0
3.0
をそれはのように思えます私は実際の値の代わりに、キューにnへのポインタをいくつか押しています。これは私が望むものです。しかし、私は実際にテンソルフローの実際の理解を持っていないので、何か他のことが起こっているのでしょうか?
私はHow can I copy a variable in tensorflowとIn TensorFlow, what is tf.identity used for?への回答は私にそれが役立つかもしれないが、それは結果を変更しないという印象を与えますので、
enqueue = q.enqueue(tf.identity(n))
に
enqueue = q.enqueue(n)
を変えてみました。また、tf.control_dependencies()を追加しようとしましたが、デキュー時にもすべての値が同じです。
編集:上の出力は、単一のCPUを搭載したコンピュータ上でコードを実行したものです。異なるバージョンのテンソルフローに違いがあるかどうかを確認するときに、CPUとGPU私は "期待された"結果を得る。確かに、私がCUDA_VISIBLE_DEVICES = "" CUDA_VISIBLE_DEVICES = "0"で上記の結果を得た場合、 "期待される"結果が得られます。
'q.enqueue(n)'ではなく 'q.enqueue_many([[n]])'という別の回避策は、参照ではなく値でエンキューします –