當前位置: 首頁>>技術問答>>正文


在TensorFlow中怎麽打印Tensor對象的值

在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(張量)的實際值,這裏給出比較簡單的示例。

無論何時評估計算圖(使用runeval),查看張量值的最簡單方法是使用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]))

參考文獻

 

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3675.html,未經允許,請勿轉載。