在TensorFlow中,如何打印Tensor對象的值?對於下麵這個TensorFlow矩陣乘法的例子:
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
當我打印product
時,顯示為一個TensorObject
。
<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0>
怎麽知道product
的實際值呢?
以下方法不起作用:
print product
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32)
Tensorflow編程指南中提到, 要在Sessions
上運行的計算圖,之後才能獲取值。那麽為了方便起見,有沒有什麽方法可以直接查看TensorObject的輸出,而無需在session
中運行計算圖?
1.常用的解決思路
要獲取Tensor
對象的實際值,最簡單的方法:將其傳遞給Session.run()
方法,或者啟用默認會話時(即在with tf.Session():
塊中,或參見下文)調用Tensor.eval()
。一般來說,如果不在會話中運行代碼,無法打印Tensor(張量)的值。
如果您正在試驗模型編程,並且想要簡單的方法來評估張量,則tf.InteractiveSession
允許您在程序開始時打開一個會話,然後將該會話用於所有Tensor.eval()
(和Operation.run()
)調用。交互式環境可以是shell或IPython Notebook(或jupyter)。
對於這樣一個小表達式來說,這看起來相當麻煩,但是Tensorflow中的一個關鍵思想是推遲執行:構建一個龐大而複雜的表達式是非常容易的,而且當你想要執行計算時,後端(你連接到的Session
)能夠更有效地優化執行過程。
另外,在能夠運行計算圖的情況,要輸出張量的值,可以使用tf.Print()
運算符(如Andrzej suggests in another answer)。在分布式TensorFlow上,tf.Print()
會將其輸出打印到運行該任務的標準輸出。
還可以使用實驗性的tf.contrib.util.constant_value()
函數來獲得const張量的值。
2.輸出張量值的完整例子
確實,如果不執行計算圖,沒法輸出Tensor(張量)的實際值,這裏給出比較簡單的示例。
無論何時評估計算圖(使用run
或eval
),查看張量值的最簡單方法是使用Print
操作,如下例所示:
# Initialize session
import tensorflow as tf
sess = tf.InteractiveSession()
# Some tensor we want to print the value of
a = tf.constant([1.0, 3.0])
# Add print operation
a = tf.Print(a, [a], message="This is a: ")
# Add more elements of the graph using a
b = tf.add(a, a).eval()
現在,每當我們評估整個計算圖時,例如使用b.eval()
,我們得到:
I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3]
3.另外一個示例
再次強調,不可能在沒有運行圖的情況下檢查值。
任何尋找打印值的簡單示例的代碼如下所示。代碼可以在ipython notebook中不做任何修改的情況下執行
import tensorflow as tf
#define a variable to hold normal random values
normal_rv = tf.Variable( tf.truncated_normal([2,3],stddev = 0.1))
#initialize the variable
init_op = tf.initialize_all_variables()
#run the graph
with tf.Session() as sess:
sess.run(init_op) #execute init_op
#print the random values that we sample
print (sess.run(normal_rv))
輸出:
[[-0.16702934 0.07173464 -0.04512421]
[-0.02265321 0.06509651 -0.01419079]]
4.上述問題的可用完整代碼
根據上麵的分析,用文章開頭特定的代碼片段,你可以輸出張量的值:
import tensorflow as tf
#Initialize the session
sess = tf.InteractiveSession()
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
#print the product
print(product.eval())
#close the session to release resources
sess.close()
5.另外一個極簡的示例
試試這個簡單的代碼! (這是自我解釋)
import tensorflow as tf
sess = tf.InteractiveSession() # see the answers above :)
x = [[1.,2.,1.],[1.,1.,1.]] # a 2D matrix as input to softmax
y = tf.nn.softmax(x) # this is the softmax function
# you can have anything you like here
u = y.eval()
print(u)
6.針對上麵問題的分析及相應代碼
應該將TensorFlow核心程序看作由兩個不連續的部分組成:
- 構建計算圖。
- 運行計算圖。
所以對於下麵的代碼,隻是構建計算圖。
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)
為了初始化TensorFlow程序中的所有變量,必須顯式調用一個特殊的操作,如下所示:
init = tf.global_variables_initializer()
現在構建圖並初始化了所有變量,下一步是評估節點,您必須在會話中運行計算圖。會話封裝了TensorFlow運行時的控製和狀態。
下麵的代碼創建一個Session對象,然後調用它的run方法來運行計算圖來評估product
:
sess = tf.Session()
// run variables initializer
sess.run(init)
print(sess.run([product]))
參考文獻