2017-06-17 8 views
0

絶対テンソルフロー初心者はここにあります。私は2つのランダムなテンソルを構築し、代入のためにそれらを減算しようとしています。しかし、私は減算プロセスがどのくらい正確に機能するかを理解することにいくつかの問題があるようです。Tensorflow減算が間違った値を返します

x=tf.random_normal([5],seed=123456) 
y=tf.random_normal([5],seed=987654) 
print(sess.run(x),sess.run(y)) 

私は、次の出力を得る:

[ 0.38614973 2.97522092 -0.85282576 -0.57114178 -0.43243945] 
[-0.43865281 0.08617876 -2.17495966 -0.24574816 -1.94319296] 

しかし、私は

print(sess.run(x-y)) 

をしようとしたとき、私は私が実行している場合今

[-1.88653958 -0.03917438 0.87480474 0.40511152 0.52793759] 

を取得

print(sess.run(tf.subtract(x,y))) 

他の値も間違っています。

[-1.97681355 1.10086703 1.41172433 1.55840468 0.04344697] 

誰かが私を助けてくれることを願っています。前もって感謝します!

+2

可能な重複になります(https://stackoverflow.com/questions/44129480/operation-not-work-in-tensorflow) – user1735003

答えて

0

この問題はxyに異なる値が割り当てられるたびにx - yを複数回実行すると発生します。これは、x=tf.random_normal([5],seed=123456) のようなものを書くとき実際には実際には計算されないためです。 TensorFlowは静的計算グラフ内に操作ノードを構築するだけです。あなたがするときはsess.run()実際の計算が行われます。

したがって、乱数ジェネレータとしてx=tf.random_norm([5], seed=123456)と考えてください。最初にsess.run()と呼ぶと、xには初期シード値123456があります。しかし、2回目にsess.run()と呼ぶと、乱数ジェネレータの状態はすでに変更されているので、値は異なります。

次のコードを実行することでこれを確認することができます

import tensorflow as tf 
x = tf.random_normal([5], seed=123456) 

with tf.Session() as sess: 
    sess.run(x) 
    sess.run(x) 
    sess.run(x) 

出力は、[操作Tensorflowでは正常に動作しない]の

[ 0.38614973, 2.97522092, -0.85282576, -0.57114178, -0.43243945] 
[-1.41140664, -0.50017339, 1.59816611, 0.07829454, -0.36143178] 
[-1.10523391, -0.15264226, 1.79153454, 0.42320547, 0.26876169] 
0

この動作は、通常の動作のシードとセッションがノードをどのように評価するかと実際に関係しています。それはそれらを作成するときに

Tensorflowはあなたのランダム通常のノードのシードを使用します - ない、それは彼ら実行したとき:

>>> sess = tf.InteractiveSession() 
>>> x = tf.random_normal([5], seed=123456) 
>>> sess.run(x) 
array([ 0.38614976, 2.97522116, -0.85282576, -0.57114178, -0.43243945], dtype=float32) 
>>> sess.run(x) 
array([-1.41140664, -0.50017333, 1.59816611, 0.07829454, -0.36143178], dtype=float32) 

あなたはx二回目の実行時に値が変化していることがわかります。 sess.run(x-y)を実行すると、実際にはx(すなわち乱数を生成する)、y(つまり他の乱数を生成する)、x-yが実行されます。 tf.subtract(x,y)を実行する前に、ランダムジェネレータをシードで再初期化しないので、異なる結果になります。

関連する問題