TensorFlow编程结构
TensorFlow編程結構
TensorFlow 與其他編程語言非常不同。
首先通過將程序分為兩個獨立的部分,構建任何擬創建神經網絡的藍圖,包括計算圖的定義及其執行。起初這對于傳統程序員來說看起來很麻煩,但是正是圖定義和執行的分開設計讓 TensorFlow 能夠多平臺工作以及并行執行,TensorFlow 也因此更加強大。
計算圖:是包含節點和邊的網絡。本節定義所有要使用的數據,也就是張量(tensor)對象(常量、變量和占位符),同時定義要執行的所有計算,即算子操作對象(Operation Object,簡稱 OP)。
每個節點可以有零個或多個輸入,但只有一個輸出。網絡中的節點表示對象(張量和算子操作),邊表示算子操作之間流動的張量。計算圖定義神經網絡的藍圖,但其中的張量還沒有相關的數值。
為了構建計算圖,需要定義所有要執行的常量、變量和算子操作。常量、變量和占位符將數學算子操作將在矩陣算子章節中詳細討論。
用一個簡單的例子描述程序結構——通過定義并執行計算圖來實現兩個向量相加。
計算圖的執行:使用會話對象來實現計算圖的執行。會話對象封裝了評估張量和操作對象的環境。這里真正實現了算子操作并將信息從網絡的一層傳遞到另外一層。不同張量對象的值僅在會話對象中被初始化、訪問和保存。在此之前張量對象只被抽象定義,在會話中才被賦予實際的意義。
具體做法
通過以下步驟定義一個計算圖:
-
在此以兩個向量相加為例給出計算圖。假設有兩個向量 v_1 和 v_2 將作為輸入提供給 Add 操作。建立的計算圖如下:
-
定義該圖的相應代碼如下所示:
-
然后在會話中執行這個圖:
-
以上兩行相當于下面的代碼。上面的代碼的優點是不必顯式寫出關閉會話的命令:
-
運行結果是顯示兩個向量的和:
{3 3 8 7}
請記住,每個會話都需要使用 close() 來明確關閉,而 with 格式可以在運行結束時隱式關閉會話。
解讀分析
計算圖的構建非常簡單。添加變量和操作,并按照逐層建立神經網絡的順序傳遞它們(讓張量流動)。TensorFlow 還允許使用 with tf.device() 命令來使用具有不同計算圖形對象的特定設備(CPU/GPU)。在例子中,計算圖由三個節點組成, v_1 和 v_2 表示這兩個向量,Add 是要對它們執行的操作。
接下來,為了使這個圖生效,首先需要使用 tf.Session() 定義一個會話對象 sess。然后使用 Session 類中定義的 run 方法運行它,如下所示:
run(fetches,feed_dict=None,options=None,run_metadata)
算子結果的值在 fetches 中提取;在示例中,提取的張量為 v_add。run 方法將導致在每次執行該計算圖的時候,都將對與 v_add 相關的張量和操作進行賦值。如果抽取的不是 v_add 而是 v_1,那么最后給出的是向量 v_1 的運行結果:
{1,2,3,4}
此外,一次可以提取一個或多個張量或操作對象,例如,如果結果抽取的是 [v_1…v_add],那么輸出如下:
{array([1,2,3,4]),array([2,1,5,3]),array([3,3,8,7])}
在同一段代碼中,可以有多個會話對象。
拓展閱讀
為什么必須編寫這么多行的代碼來完成一個簡單的向量加,或者顯示一條簡單的消息。其實你可以利用下面這一行代碼非常方便地完成這個工作:
print(tf.Session().run(tf.add(tf.constant([1,2,3,4]),tf.constant([2,1,5,3]))))
編寫這種類型的代碼不僅影響計算圖的表達,而且當在 for 循環中重復執行相同的操作(OP)時,可能會導致占用大量內存。養成顯式定義所有張量和操作對象的習慣,不僅可使代碼更具可讀性,還可以幫助你以更清晰的方式可視化計算圖。
注意,使用 TensorBoard 可視化圖形是 TensorFlow 最有用的功能之一,特別是在構建復雜的神經網絡時。構建的計算圖可以在圖形對象的幫助菜單下進行查看。
使用 Jupyter Notebook 或者 Python shell 進行編程,使用 tf.InteractiveSession 將比 tf.Session 更方便。InteractiveSession 使自己成為默認會話,因此你可以使用 eval() 直接調用運行張量對象而不用顯式調用會話。下面給出一個例子
總結
以上是生活随笔為你收集整理的TensorFlow编程结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对端边缘云网络计算模式:透明计算、移动边
- 下一篇: TensorFlow解析常量、变量和占位