tensorflow 基礎學習一:計算圖的概念


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時,日志中將會記錄每個節點被安排在了那個設備上方便調試。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM