2015-11-10 255 views
131

我一直在使用TensorFlow中矩陣乘法的例子。如何在TensorFlow中打印張量對象的值?

matrix1 = tf.constant([[3., 3.]]) 
matrix2 = tf.constant([[2.],[2.]]) 
product = tf.matmul(matrix1, matrix2) 

當我打印的產品,它會顯示它作爲一個Tensor對象:

<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0> 

但是我怎麼知道的product價值?

以下沒有幫助:

print product 
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32) 

我知道,圖表上Sessions運行,但是是不是有什麼辦法可以檢查Tensor對象的輸出,而不運行在session圖?

回答

134

,最簡單的方式*來評估Tensor對象的實際值是將它傳遞給Session.run()方法,或撥打Tensor.eval()當你有一個默認會話(即,在一個with tf.Session():塊,或見下文)。一般來說,**你不能在會話中運行一些代碼的情況下打印張量的值。

如果您正在使用的編程模型試驗,並希望有一個簡單的方法來評價張量,該tf.InteractiveSession可以讓你在你的程序開始打開會話,然後用所有Tensor.eval()(和Operation.run())這屆會議呼叫。在一個交互式設置中,例如shell或IPython筆記本,當在任何地方傳遞一個對象時都很麻煩。

這似乎是愚蠢的,這樣一個小的表達,但在Tensorflow的主要觀點之一是延遲執行:這是非常廉價的構建一個龐大而複雜的表情,當你要評估它的背結尾(與Session連接時)可以更高效地安排其執行(例如,並行執行獨立部分並使用GPU)。


*  要打印張量的值,而無需將其返回到你的Python程序,你可以使用tf.Print()運算符,如Andrzej suggests in another answer。請注意,您仍需要運行部分圖表來查看此op的輸出,該輸出將打印到標準輸出。如果您正在運行分佈式TensorFlow,則tf.Print()將將其輸出打印到運行該任務的任務的標準輸出。

**  您可能能夠使用實驗tf.contrib.util.constant_value()函數來獲得恆定的張量的值,但它不適用於一般用途,並且不爲許多運營商定義的。

+8

可以在不調用Session.run()的情況下得到張量的某些屬性。例如,您可以調用tensor.get_shape()。在很多情況下,這給調試提供了足夠的信息。 –

+3

另請參見以下關於tf.Print的答案。我一直在尋找這個stackoverflow的答案,同時搜索「tensorflow打印」,這個最重要的答案聽起來像沒有tf.Print操作。 –

+1

我在回答中增加了一些注意事項,所以現在應該更清楚了。 (我不認爲最初的提問者有興趣獲得張量的形狀,只是價值。) – mrry

15

不,您不能在沒有運行圖形的情況下(做session.run())看到張量的內容。你可以看到的唯一的事情是:

  • 張量的維度(但我相信它是不是很難計算它爲TF具有list of the operations
  • 類型將用於生成操作的張量(transpose_1:0random_uniform:0)在張量
  • 類型的元素(float32

我沒有在文檔中發現這一點,但我相信變量的值(和一些常量在分配時不計算)。


看看這個例子:

import tensorflow as tf 
from datetime import datetime 
dim = 7000 

第一個例子,我剛開始的隨機數不變張量運行大約在同一時間irrespectibly的暗淡(0:00:00.003261

startTime = datetime.now() 
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) 
print datetime.now() - startTime 

在第二種情況下,實際獲取常數並分配值時,時間顯然取決於暗(0:00:01.244642

startTime = datetime.now() 
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) 
sess = tf.Session() 
sess.run(m1) 
print datetime.now() - startTime 

而且你可以通過計算的東西(d = tf.matrix_determinant(m1),記住,時間將在O(dim^2.8)運行)

附:它更清晰我發現了它在documentation解釋說:

張量對象是一個象徵性的手柄操作, 的結果,但實際上並沒有存儲操作的輸出值。

101

雖然其他答案是正確的,直到您評估圖表時才能打印該值,但他們不會談論在圖表中實際打印值的簡單方法,只要您對其進行評估即可。

(使用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) 

現在,只要我們評估了整個圖表,例如使用b.eval(),我們得到:

I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3] 
+18

它是非常重要的,你使用從a = tf.print到另一個! tf.print(a,[a])不會做任何其他的事情 –

+1

然後我們可以使用'a.eval()'! –

17

重申別人說什麼,它不是可以檢查值,而不運行圖。

對於任何想要打印值的簡單示例的人來說,簡單的代碼片段如下所示。該代碼可以不加任何修改在IPython的筆記本電腦中執行

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]] 
+2

僅供參考:'警告:tensorflow:從:1:initialize_all_variables(來自tensorflow.python.ops.variables)已棄用,2017-03-02之後將被刪除。 更新說明: 改爲使用'tf.global_variables_initializer'。 –

6

基於以上問題的答案,與您的特定代碼片斷,可以打印產品是這樣的:

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() 
3

試試這個簡單的代碼! (這是自我解釋)

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) 
7

我認爲你需要得到一些基本面的權利。通過上面的示例,您創建了張量(多維數組)。但是爲了使張量流動真正起作用,您必須在會話中啓動「會話」並運行您的「操作」。注意單詞「會話」和「操作」。 你需要知道的4件事與tensorflow工作:

  1. 張量
  2. 操作
  3. 會議
  4. 圖形

現在從你寫出來,你已經給了張量,和該操作,但你沒有會議運行,也沒有圖形。張量(圖的邊)流過圖並由操作(圖的節點)操縱。有默認圖表,但您可以在會話中啓動您的圖表。

當你說打印時,你只能訪問你定義的變量或常量的形狀。

所以,你可以看到你錯過了什麼:

with tf.Session() as sess:  
      print(sess.run(product)) 
      print (product.eval()) 

希望它能幫助!

2

請注意,tf.Print()將改變張量名稱。 如果您試圖打印的張量是一個佔位符,向其饋送數據將失敗,因爲在餵食過程中不會找到原始名稱。 例如:

import tensorflow as tf 
tens = tf.placeholder(tf.float32,[None,2],name="placeholder") 
print(eval("tens")) 
tens = tf.Print(tens,[tens, tf.shape(tens)],summarize=10,message="tens:") 
print(eval("tens")) 
res = tens + tens 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

print(sess.run(res)) 

輸出是:

python test.py 
Tensor("placeholder:0", shape=(?, 2), dtype=float32) 
Tensor("Print:0", shape=(?, 2), dtype=float32) 
Traceback (most recent call last): 
[...] 
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'placeholder' with dtype float 
4

你應該想到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])) 
2

可以檢查TensorObject的輸出,通過啓用eager execution。之後你import tensorflow import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

只需添加以下代碼兩行。

print product在你的例子現在輸出將是: tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

需要注意的是,截至目前(2017年11月),你必須安裝一個Tensorflow夜間生成,使急於執行。預製輪可以在here找到。