如何在 TensorFlow 中使用多個 Graph

當我們訓練一個模型時,通常的做法是用一個 Graph 訓練模型,然後用另一個 Graph 來評估模型的訓練情況,因為在許多情況下,訓練和測試的前向推導過程是不一樣的,因為訓練的時候通常包括了dropout和 BN 操作,而測試的時候則不需要或使用不一樣的參數。但是這樣有一個使用起來很不方便的地方,那就是訓練和測試各自需要一個顯卡,對於資源不是那麼充裕的使用者就很不方便了,是否可以在一個進程內運行兩個不同的計算圖呢?

創建新計算圖的優勢

通常情況下,使用 TensorFlow 提供的默認計算圖 Graph 就已經能夠完成所有的工作了,但是,它也提供了方法來操作默認的計算圖 Graph,用以適應更複雜的情況,比如說一個 Graph 定義了它內部所有 OP 的命名空間,所有內部 OP 都會自動命名為不重複的情況,但是還是會使得 OP 的名稱比較複雜,那麼如果顯式的創建一個 Graph 就會給你為 OP 命名帶來更多的控制權。

另外,默認的計算圖 Graph 會存儲所有的 OP 和 tensor 的信息,但是如果你創建的計算圖是多個沒有關聯的子計算圖,那麼還不如創建多個獨立的計算圖,這樣會使得原來的不相干的子圖之間的聲明被系統當做垃圾回收。

使用方法

可以先使用 tf.Graph 建立一個新的計算圖,然後使用 tf.Graph.as_default 來創建一個上下文管理器來指定該計算圖內部的結構;可以看如下代碼:

g_1 = tf.Graph()with g_1.as_default(): # Operations created in this scope will be added to `g_1`. c = tf.constant("Node in g_1") # Sessions created in this scope will run operations from `g_1`. sess_1 = tf.Session()g_2 = tf.Graph()with g_2.as_default(): # Operations created in this scope will be added to `g_2`. d = tf.constant("Node in g_2")# Alternatively, you can pass a graph when constructing a `tf.Session`:# `sess_2` will run operations from `g_2`.sess_2 = tf.Session(graph=g_2)assert c.graph is g_1assert sess_1.graph is g_1assert d.graph is g_2assert sess_2.graph is g_2

這段代碼表明了兩種使用不同的 session 來運行不同的計算圖的方式,一種是直接在該計算圖g_1 Graph 內部調用 session ,一種是在該計算圖的外部將 g_2 傳入 session。

如果要查看當前使用的是哪個計算圖,可以使用如下方法:

# Print all of the operations in the default graph.g = tf.get_default_graph()print(g.get_operations())

這段示例只是初步對在一個進程中如何使用多個計算圖做了說明,下次有機會用代碼實例來示範如何在實際中使用多個計算圖。

參考資料:Graphs and Sessions | TensorFlow


推薦閱讀:

學習tensorflow庫
一文打盡:線性回歸和邏輯斯蒂線性回歸
Ubuntu 16.04 bazel編譯tensorflow-gpu隨記
使用TensorFlow時輸入數據的三個姿勢
學習筆記TF049:TensorFlow 模型存儲載入、隊列線程、載入數據、自定義操作

TAG:TensorFlow | 人工智慧 |