TensorFlow數據模型——張量

TensorFlow最重要的概念就是Tensor和Flow,Tensor就是張量Flow就是流,它們合在一起直觀地表達了張量之間通過計算相互轉化的過程。

在TensorFlow程序中,所有的數據都通過張量的形式來表示,張量是TensorFlow管理數據的工具。張量可以被簡單地理解爲多維數組,零階張量表示標量即一個數,一階張量表示向量即一維數組,n階張量表示一個n維數組。

注意,張量在TensorFlow中的實現並不是直接採用數組的形式,而是對TensorFlow中計算結果的引用,在張量中並沒有真正保存數字,它保存的是如何得到這些數字的計算過程,有以下示例代碼:

import tensorflow as tf

#tf.constant是一個計算,這個計算的結果是張量,保存在變量a中
a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = tf.add(a, b, name="add")
print(result)

輸出結果爲:

Tensor("add:0", shape=(2,), dtype=float32)

從上述代碼的運行結果可以看出,一個張量中主要保存了三個屬性——名字、維度和類型:

  • 名字(name)不僅是一個張量的唯一標識符,還描述了這個張量是如何計算出來的。張量的命名可以通過“node:src_output“的形式給出來,其中node爲節點的名稱,src_output表示當前張量來自節點的第幾個輸出(編號從0開始)。在計算圖上每一個節點代表一個計算,計算的結果就保存在張量中,關於計算圖的詳細內容請參照:TensorFlow計算模型——計算圖

  • 維度(shape)描述了張量的維度數以及各個維度的大小。

  • 類型(type)描述了張量在計算圖中的類型,每一個張量會有一個唯一的類型,TensorFlow會對參與計算的所有張量進行類型的檢查,當發現類型不匹配時會報錯,如以下代碼:

    import tensorflow as tf
    a = tf.constant([1,2], name="a")
    b = tf.constant([2.0,3.0], name="b")
    result = a + b
    

    運行程序會報類型不匹配的錯誤:

    ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("b:0", shape=(2,), dtype=float32)'
    

    如果將第一個張量指定爲實數類型,那麼計算就不會報錯了:

    a = tf.constant([1,2], name="a", dtype=tf.float32)
    

    如果不指定類型,TensorFlow會給出默認的類型,使用默認類型有可能導致潛在的類型不匹配問題,因此一般通過指定dtype來明確指出張量的類型。

    TensorFlow支持14種不同的類型,主要包括:

    1. 實數類型:tf.float32,tf.float64;

    2. 整數類型:tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8;

    3. 布爾型:tf.bool;

    4. 複數類型: tf.complex64,tf.complex128。

張量主要有以下兩種用途:

  • 第一種用途是對中間計算結果進行引用,當一個計算包含很多中間結果時,使用張量可以大大提高代碼的可讀性,通常在構建深層神經網絡時就不可避免地要用張量來引用中間結果,同時通過張量來存儲中間結果可以方便獲取中間結果,比如在卷積神經網絡中,卷積層或者池化層有可能改變張量的維度,通過張量的get_shape()函數來獲取張量的維度信息可以免去人工計算的麻煩。

  • 第二種用途是當計算圖構造完成之後,張量可以用來獲得計算結果,也就是真實的數字,雖然張量本身不存儲真實的數字,但在會話中通過run()函數或eval()可以得到計算結果,關於會話的詳細內容請參照:TensorFlow運行模型——會話

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章