1. 程式人生 > >演算法工程師修仙之路:TensorFlow(二)

演算法工程師修仙之路:TensorFlow(二)

TensorFlow 入門

TensorFlow 資料模型一一張量


張量的概念

  • 張量是 TensorFlow 管理資料的形式,在 TensorFlow程式中,所有的資料都通過張量的形式來表示。

  • 從功能的角度上看,張量可以被簡單理解為多維陣列。

    • 零階張量表示標量(scalar),也就是一個數;
    • 一階張量為向量(vector),也就是一個一維陣列;
    • 第 n 階張量可以理解為一個 n 維陣列。
  • 張量在 TensorFlow 中的實現並不是直接採用陣列的形式,它只是對TensorFlow 中運算結果的引用。在張量中並沒有真正儲存數字,它儲存的是如何得到這些數字的計算過程。

  • TensorFlow中的張量和 NumPy 中的陣列不同,TensorFlow 計算的結果不是一個具體的數字,而且一個張量的結構。一個張量中主要儲存了三個屬性 : 名字(name)、維度(shape)和型別(type)。

    # 以向量加法為例,當執行如下程式碼時,並不會得到加法的結果,而會得到對結果的一個引用。
    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)
    
  • 張量的第一個屬性名字不僅是一個張量的唯一識別符號,它同樣也給出了這個張量是如何計算出來的。

  • TensorFlow 的計算都可以通過計算圖 的模型來建立,而計算圖上的每一個節點代表了 一個計算,計算的結果就儲存在張量之中,所以張量和計算圖上節點所代表的計算結果是對應的。

  • 張量的命名可以通過 “node:src_output”的形式來給出。

    • 其中 node 為節點的名稱,src一output 表示當前張量來自節點的第幾個輸出。
    • 比如“ add:0”就說明了 result 這個張量是計算節點“add” 輸出的第一個結果(編號從0開始)。
  • 張量的第二個屬性是張量的維度(shape)。

    • 這個屬性描述了一個張量的維度資訊。
    • 比如shape=(2,)說明了張量 result 是一個一維陣列,這個陣列的長度為2。
  • 張量的第三個屬性是型別(type)。

    • 每一個張量會有一個唯一的型別。
    • TensorFlow 會對參與運算的所有張量進行型別的檢查,當發現型別不匹配時會報錯。
    • 如果不指定型別,TensorFlow 會給出預設的型別,比如不帶小數點的數會被預設為 int32,帶小數點的會預設為 float32 。
    • 因為使用預設型別有可能會導致潛在的型別不匹配問題,所以一般建議通過指定 dtype 來明確指出變數或者常量的型別。

張量的使用

  • 張量使用主要可以總結為兩大類。
    • 第一類用途是對中間計算結果的引用。
      • 當一個計算包含很多中間結果時,使用張量可以大大提高程式碼的可讀性。
      • 當計算的複雜度增加時(比如在構建深層神經網路時)通過張量來引用計算的中間結果可以使程式碼的可閱讀性大大提升。
      • 通過張量來儲存中間結果可以方便獲取中間結果。比如在卷積神經網路中,卷積層或者池化層有可能改變張量的維度,通過 result.get_shape 函式來獲取結果張量的維度資訊可以免去人工計算的麻煩。
    • 使用張量的第二類情況是當計算圖構造完成之後,張量可以用來獲得計算結果,也就是得到真實的數字。
      • 雖然張量本身沒有儲存具體的數字,但是通過會話,就可以得到這些具體的數字。