2017-06-17 37 views
0

絕對張量流初學者在這裏。我試圖構造兩個隨機張量並將它們減去一個賦值。不過,我似乎在理解減法過程如何工作方面存在一些問題。張量減法返回錯誤值

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

的可能的複製[操作不Tensorflow正常工作(https://stackoverflow.com /問題/ 44129480 /操作 - 不工作正常功能於tensorflow) – user1735003

回答

0

當您多次執行x - y時會出現此問題,因爲每次都會爲xy分配一個不同的值。這是因爲當你編寫像x=tf.random_normal([5],seed=123456) 這樣的東西時,確實沒有任何實際的計算。 TensorFlow只是在靜態計算圖中構造一個操作節點。這是當你做sess.run()真正的計算髮生。

因此,考慮將x=tf.random_norm([5], seed=123456)作爲隨機數發生器。您第一次撥打sess.run(),x的初始種子值爲123456。但第二次您撥打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) 

輸出將是

[ 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)之前沒有使用種子重新初始化隨機生成器,因此會得到不同的結果。