上一篇文章講了TensorFlow中什麼是計算圖,本文簡單介紹下什麼是張量。
在一個TensorFlow程序中,如果將計算圖稱爲TensorFlow的計算模型,那麼張量則可以稱爲TensorFlow的數據模型,因爲張量是TensorFlow管理數據的形式,也就是說,在TensorFlow程序中,所有數據都可以藉助張量的形式來表示。
張量,可以把它簡單理解爲不同維度的數組,其中零階張量的表現形式是標量(Scaler),也就是一個數字;一階張量的表現形式是向量(Vector),也就是一維數組;二階張量的表現形式是二維數組;依次類推,n階張量的表現形式就是n維數組。
我們先來看一個例子:
import tensorflow as tf
a=tf.constant([1.0,2.0],name='a')
b=tf.constant([3.0,4.0],name='b')
result=a+b
print(result)
#輸出Tensor("add:0",shape=(2,),dtype=float32)
我剛第一次看到這個程序的時候,我的第一反應就是輸出[4.0,6.0],可是事實不是這樣,它的輸出是一個Tensor的表示“Tensor(“add:0”,shape=(2,),dtype=float32)”。可以肯定的是result是一個張量,但實際運算中張量只是引用了程序中的運算結果,而不是一個真正的數組,張量保存的是運算結果的屬性,而不是真正的數字。其中,這三個屬性分別爲名字(name),維度(shape)和數據類型(dtype)。
名字:它有時可以被看作是張量的一個名字,一般是要保存的節點的名字。計算圖中的每一個節點都表示一個運算,而張量則將運算結果的屬性保存了下來。這裏操作的命名符合"node:src_output"的形式,其中node就是節點的名稱(如上面的add),src_output表示這個張量是節點的第幾個輸出(編號從0開始)。
維度:它描繪了張量的維度信息,例如上面的那個例子shape=(2,)表示張量是一個1x2維的數組,或者可以理解爲它保存了一個1x2維的運算結果。
數據類型:每一個張量的數據類型是唯一的。Tensorflow會檢查參與某次運算的所有張量的數據類型,當發現類型不匹配時會報錯,如下面例子所示
import tensorflow as tf
a=tf.constant([1,2],name='a')
b=tf.constant([3.0,4.0],name='b')
result=a+b
print(result)
#輸出:TypeError: Input 'y' of 'Add' Op has type float32 that does not match type int32 of argument 'x'.
綜上所述,我們可以這樣理解,對於上面的例子,張量result儲存的是一個名叫add節點的運算結果,它儲存的是節點名爲add的第1次輸出(編號從0開始),運算結果是一個1x2維的數組,數據類型是float32。
如果想要輸出真正的運算結果的話,我們要定義一個會話(Session),在會話中調用run函數將想要得到真正結果的張量傳遞進去,如下面例子所示:
import tensorflow as tf
a=tf.constant([1.0,2.0],name='a')
b=tf.constant([3.0,4.0],name='b')
result=a+b
with tf.Session() as sees:
tf.global_variables_initializer().run()
print(sees.run(result))
#輸出[4. 6.]
參考書籍:《TensorFlow深度學習算法原理與編程實戰》 蔣子陽 著