tensorflow中計算圖的概念
tensorflow程序一般分為兩個階段:
1、定義計算圖所有的計算
2、在session中執行計算
在tensorflow程序中,系統會自動維護一個默認的計算圖,可以通過tf.get_default_graph()函數獲取。以下代碼展示了如何獲取
默認計算圖以及如何查看一個運算所屬的計算圖:
import tensorflow as tf
a=tf.constant([1.0,2.0], name='a') # 定義一個常量使用tf.constant方法 b=tf.constant([1.0,2.0], name='b') result = a+b
# 通過a.graph可以查看張量所屬的計算圖,如果沒有特別指定,則屬於當前默認的計算圖 print(a.graph is tf.get_default_graph()) # 輸出為True
tensorflow可以通過tf.Graph函數生成新的計算圖。不同計算圖上的張量和運算都不會共享
g1=tf.Graph() with g1.as_default(): # 在計算圖g1中定義變量'v',並設置初始值為0。 v=tf.get_variable('v',initializer=tf.zeros_initializer()(shape = [1])) g2=tf.Graph() with g2.as_default(): # 在計算圖g2中定義變量'v',並設置初始值微1。 v=tf.get_variable('v',initializer=tf.ones_initializer()(shape = [1])) # 在計算圖g1中讀取變量'v'的取值 with tf.Session(graph=g1) as sess: tf.global_variables_initializer().run() with tf.variable_scope('',reuse=True): # 在計算圖g1中,變量'v'的取值應該為0,下一行代碼會輸出[0.]。 print(sess.run(tf.get_variable('v'))) # 在計算圖g2中讀取變量'v'的取值 with tf.Session(graph=g2) as sess: tf.global_variables_initializer().run() with tf.variable_scope('',reuse=True): # 在計算圖g2中,變量'v'的取值應該為1,下一行代碼會輸出[1.]。 print(sess.run(tf.get_variable('v')))
tensorflow中的計算圖不僅可以用來隔離張量和計算,它還提供了管理張量和計算的機制。計算圖可以通過tf.Graph.device函數來指定運行計算的設備,下面代碼指定在GPU上運行加法計算:
g=tf.Graph() # 指定計算運行的設備。 with g.device('/gpu:0'): result=a+b
在一個計算圖中,可以通過集合(collection)來管理不同類別的資源。比如通過tf.add_to_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 | 所有計算了滑動平均值的變量 | 計算變量的滑動平均值 |
tensorflow中張量的概念
tensorlfow中,所有的數據都為張量。其中,零階張量表示標量(scalar),代表一個數;一階張量表示向量(vector),代表一維數組;n階張量表示一個n維數組。具體示例如下:
# tf.constant是一個計算,這個計算的結果為一個張量,保存在變量a中。 a=tf.constant([1.0,2.0], name='a') b=tf.constant([1.0,2.0], name='b') result = tf.add(a,b,name='add') print(result)
'''
輸出:Tensor("add:0", shape=(2,), dtype=float32)
'''
從上述輸出可以看出一個張量主要保存了三個屬性:名字(name)、維度(shape)和類型(type)。其中,name屬性以“node:src_output”的形式表示,node表示節點的名稱,src_output表示當前張量來自節點的第幾個輸出。還可以通過result.get_shape函數來獲取結果張量的維度信息。
tensorflow中session的講解
創建session的三種方式:
# 1、 創建一個會話 with tf.Session() as sess: print(sess.run(result)) # tensorflow中需要手動指定默認會話,當該會話指定后,可以通過tf.Tensor.eval函數來計算一個張量的取值。 # 2、 創建一個默認的會話 sess=tf.Session() with sess.as_default(): print(result.eval()) # 3、 創建一個會話
sess=tf.Session() # 下面兩個命令等價 print(sess.run(result)) print(result.eval(session=sess))
# 在交互式環境下,使用設置默認會話的方法來獲取張量的取值更加方便,tensorflow提供了一種在交互式環境下直接構建
# 默認會話的函數,tf.InteractiveSession。該函數會自動將生成的會話注冊為默認會話。 sess= tf.InteractiveSession() print(result.eval()) sess.close()
使用tf.ConfigProto函數配置會話,示例如下
config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True) sess1=tf.InteractiveSession(config=config) sess2=tf.Session(config=config)
allow_soft_placement:一個布爾類型的參數。當為True時,在以下條件下,可以將GPU上的運算方法CPU上
1、運算無法在GPU上執行
2、沒有GPU資源(比如本機只有一個GPU,但運算被指定在其他GPU上執行)
3、運算輸入包含對CPU計算結果的應用
為了加強代碼的可移植性,在有GPU的環境下,一般將該參數設置為True
log_device_placement:一個布爾類型的參數。當設置為True時,日志中將會記錄每個節點被安排在了那個設備上方便調試。