Tensor + Flow = TensorFlow
本章介紹TensorFlow的基礎。特別地,你將學習如何用TensorFlow進行基礎計算。在開始使用 TensorFlow之前,你必須理解它背后的哲學。 這個庫基于計算圖的概念,如果你不理解計算圖是如何工作的,你就不能理解如何使用這個庫。我將快速的介紹計算圖并告訴你如何用? TensorFlow進行簡單的計算。你將明白這個庫是如何工作的,并明白如何使用它。
本章的大部分介紹tensors的概念,并討論tensors在TensorFlow里是如何表示和操作的。這些討論有必要簡單的回顧一下作為張量計算基礎的數學概念。 特別地,我們簡單的回顧線性代數并說明如何用TensorFlow進行基礎的線性代數計算。接著我們討論聲明式和命令式編程風格的不同。不像許多編程語言, TensorFlow大部分是聲明式的。調用TensorFlow的計算添加計算描述到 TensorFlow的“計算圖”。特別地, TensorFlow代碼 “描述”計算但并不進行實際計算。 在TensorFlow v1里要運行計算,我們需要創建 tf.Session對像。雖然TensorFlow v2不用sessions對象,但是也有必要介紹sessions的概念并描述如何在TensorFlow里用它們進行計算。我們將簡單的比較TensorFlow v1和TensorFlow v2的區別。我們還討論變量的標記。TensorFlow里的Variables存貯張量并允許有狀態的計算以修改變量。我們說明如何創建變量并通過TensorFlow更新變量。
1.理解計算圖
要理解TensorFlow如何工作,你必須理解什么是計算圖。計算圖是個圖,里面的節點相當于一個操作或變量。 變量可以將值輸入到操作,一個操作可以將結果輸入到另一個操作。通常,節點是圓 (或橢圓),里面是變量的名或操作, 當一個節點值輸入到另一個節點時,用箭頭從一個節點連到另一個節點。最簡單的圖是里面只有一個變量的圖 (記住節點可以是變量或操作)。圖 2-1 簡單的計算變量 x的值。
???????????????????????????
圖 2-1. 我們可以構建的最簡單的圖,顯示為一個簡單的變量
這不是很有趣!我們考慮一下略為復雜一點的情況,例如一個變量x 和 y的和: z = x + y。可以用下面的圖表示 (圖2-2):
圖2-2. 兩個變量之和的基本的計算圖
圖2-2左邊是變量 (節點里是 x和 y),而更大的節點表示兩個變量的和。箭頭表示兩個變量輸入到第三個節點。圖應按拓撲順序讀取,意味著你要按箭頭的順序計算節點。箭頭也告訴你節點的依賴關系。要評估z, 你首先必須評估 x和 y。我們也可以說進行求和的節點依賴于輸入節點。
要理解的一個重要方面是這種圖只定義一個操作 (本例是求和)從兩個輸入 (本例是 x 和y) 得到結果 (本例是 z)。這基本上定義為 “求和”。你必須給輸入x和 y賦值然后才能求和得到z。只有你評估了所有的節點圖才會給你結果。
注意,定義每一個節點稱為圖的“構建”,而評估相關操作的真實值稱為 “evaluation”。
這是要理解的很重要的方面。注意輸入變量不一定是實數,它們可以是矩陣,向量,等。 (在神經網絡的相關計算里幾乎都是使用矩陣。)略為復雜的情況見圖 2-3它用圖來計算量 ?A(x + y), 有三個圖入量: x, ?y, 和A。
??????????????????????
圖 2-3. 計算量 A(x + y)的計算圖, 給出三個輸入量: x, y, A
我們可以通過給輸入節點(本例是 x, y,和 A)賦值來評估這個圖。例如,如果你考慮圖2-3中的圖并賦值 x = 1, y = 3, 和A = 5, 我們得到結果 b = 20
(繪制為圖2-4).
??????????????????????
圖2-4. 要評估圖2-3中的圖,我們必須給輸入節點 x, y,和 A 賦值然后通過圖評估節點
神經網絡本質上是非常復雜的計算圖,每一個神經元包含多個節點將它的輸出輸入到另外的神經元,直到得到一定的輸出。后面我們將構建最簡單的神經網絡:只有一個神經元。即便是這么簡單的神經網絡,我們也要很多的工作。
通過將構建與評估分開,TensorFlow允許你輕松的構建非常復雜的計算圖。 (記住,要計算結果,你必須賦值并評估所有的節點)。后面我告訴你這是如何工作的:如何構建計算圖,如何評估它們。
注意 ?? 記住tensorflow首先構建計算圖(稱為構建階段)但是不會評估它。這個庫保持兩步分開,所以你可以用不同的輸入進行多次計算。