轉載自:http://blog.csdn.net/john_xyz/article/details/69053626
Tensorflow是一個通過計算圖的形式來表述計算的編程系統,計算圖也叫數據流圖,可以把計算圖看做是一種有向圖,Tensorflow中的每一個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關系。
計算圖的使用
在tensorflow程序中,系統會維護一個默認的計算圖,通過tf.get_default_graph()函數可以獲取當前默認的計算圖,為了向默認的計算圖中添加一個操作,我們只需要簡單的調用一個函數:
c = tf.constant(3.0) assert c.graph == tf.get_default_graph()
除了使用默認的計算圖,Tensorflow支持通過tf.Graph()函數來生成新的計算圖,不同計算圖的張量和運算都不會共享,使用tf.Graph.as_default()覆蓋當前的默認圖。
g = tf.Graph() with g.as_default(): c = tf.constant(3.0) assert c.graph is g
#coding:utf-8 import tensorflow as tf g1 = tf.Graph() with g1.as_default(): # 在圖g1中定義初始變量c, 並設置初始值為0 v = tf.get_variable("v", shape=[1], initializer = tf.zeros_initializer(dtype=tf.float32)) g2 = tf.Graph() with g2.as_default(): # 在圖g1中定義初始變量c, 並設置初始值為1 v = tf.get_variable("v", shape=[1], initializer = tf.ones_initializer(dtype=tf.float32)) with tf.Session(graph=g1) as sess: sess.run(tf.global_variables_initializer()) with tf.variable_scope('', reuse=True): # 輸出值為0 print sess.run(tf.get_variable("v")) with tf.Session(graph=g2) as sess: sess.run(tf.global_variables_initializer()) with tf.variable_scope('', reuse=True): # 輸出值為1 print sess.run(tf.get_variable('v'))
上面的代碼產生了兩個計算圖,當運行不同的計算圖時,變量v的值是不一樣的。同時,計算圖Graph通過tf.Graph.device()函數來制定運行計算圖的設備, 下圖定義的程序可以將加法計算跑在GPU上
g = tf.Graph() # 指定計算運行的設備 with g.device('/gpu:0'): result = a + b
在一個計算圖中,可以通過集合(collection)來管理不同類別的資源,一個計算圖Graph實例支持任意數量的 name定義的collection, 當構建一個計算圖時,collections可以存儲一組相關的對象。
例如:tf.Variables使用一個collection (named tf.GraphKeys.GLOBAL_VARIABLES)存儲所有的變量,當構建計算圖的時候。可以通過tf.add_to_collection()函數將資源加入一個collection中,然后通過tf.get_collection獲取一個集合里面的所有資源。
tensorflow中自動管理了一些常用的集合,如下表:
集合名稱 |
集合內容 |
使用場景 |
tf.GraphKeys.VARIABLES |
所有變量 |
持久化tensorflow模型 |
tf.GraphKeys.TRAINABLE_VARIABLES |
可學習的變量(一般指神經網絡中的參數) |
模型訓練、生成模型可視化內容 |
tf.GraphKeys.SUMMARIES |
日志生成相關的張量 |
tensorflow計算可視化 |
tf.GraphKeys.QUEUE_RUNNERS |
處理輸入的QueueRunner |
輸入處理 |
tf.GraphKeys.MOVING_AVERAGE_VARIABLES |
所有計算了滑動平均值的變量 |
計算變量的滑動平均值 |