tensorflow程式設計結構
tensorflow 與其他程式語言非常不同。
首先通過將程式分為兩個獨立的部分,構建任何擬建立神經網路的藍圖,包括計算圖的定義及其執行。起初這對於傳統程式設計師來說看起來很麻煩,但是正是圖定義和執行的分開設計讓 tensorflow 能夠多平台工作以及並行執行,tensorflow 也因此更加強大。
計算圖:是包含節點和邊的網路。本節定義所有要使用的資料,也就是張量(tensor)物件(常量、變數和佔位符),同時定義要執行的所有計算,即運算元操作物件(operation object,簡稱 op)。
每個節點可以有零個或多個輸入,但只有乙個輸出。網路中的節點表示物件(張量和運算元操作),邊表示運算元操作之間流動的張量。計算圖定義神經網路的藍圖,但其中的張量還沒有相關的數值。
為了構建計算圖,需要定義所有要執行的常量、變數和運算元操作。常量、變數和佔位符將數學運算元操作將在矩陣運算元章節中詳細討論。
用乙個簡單的例子描述程式結構——通過定義並執行計算圖來實現兩個向量相加。
計算圖的執行:使用會話物件來實現計算圖的執行。會話物件封裝了評估張量和操作物件的環境。這裡真正實現了運算元操作並將資訊從網路的一層傳遞到另外一層。不同張量物件的值僅在會話物件中被初始化、訪問和儲存。在此之前張量物件只被抽象定義,在會話中才被賦予實際的意義。
通過以下步驟定義乙個計算圖:
在此以兩個向量相加為例給出計算圖。假設有兩個向量 v_1 和 v_2 將作為輸入提供給
add 操作。建立的計算圖如下:
2. 定義該圖的相應**如下所示:
3. 然後在會話中執行這個圖:
4. 以上兩行相當於下面的**。上面的**的優點是不必顯式寫出關閉會話的命令:
5. 執行結果是顯示兩個向量的和:
請記住,每個會話都需要使用 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 的執行結果:
此外,一次可以提取乙個或多個張量或操作物件,例如,如果結果抽取的是 [v_1...v_add],那麼輸出如下:
在同一段**中,可以有多個會話物件。
為什麼必須編寫這麼多行的**來完成乙個簡單的向量加,或者顯示一條簡單的訊息。其實你可以利用下面這一行**非常方便地完成這個工作:
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 程式,使用該程式繪製乙個預設圖並建立乙個執行該圖的會話 注意 請仔細閱讀本教程。tensorflow 程式設計模型很可能與您遇到的其他模型不同,因此可能不如您期望的那樣直觀。tensorflow 的名稱源自張量,張量是任意維度的陣列。tensorflo...
TensorFlow程式設計策略
tensorflow程式中的計算過程可以表示為乙個計算圖 computation graph,也可稱為有向圖 directed graph 其作用與外觀都可模擬為程式流程圖。張量是在邊中流動的資料,其資料型別可以在程式設計時事先定義,也可根據計算圖中的上下文來推斷。計算圖的作用可以模擬為程式的流程圖...
TensorFlow與PyTorch程式設計方式不同
參考 pytorch 命令式程式設計 tensorflow 符號式程式設計 與命令式程式設計不同,符號式程式設計通常在計算流程完全定義好後才被執行。多個深度學習框架,如theano和tensorflow,都使用了符號式程式設計。通常,符號式程式設計的程式需要下面3個步驟 定義計算流程 把計算流程編譯...