天天看點

TensorFlow運作模型——會話

TensorFlow中的會話(Session)擁有并管理TensorFlow程式運作時的所有資源,當所有計算完成之後需要關閉會話來幫助系統回收資源,否則就可能出現資源洩露問題。

TensorFlow中使用會話的模式有以下兩種:

  • 第一種模式,需要明确調用會話生成函數和關閉會話函數,這個模式的代碼流程如下:
    #建立一個會話
    sess = tf.Session()
    
    #使用這個建立好的會話來得到關心的運算的結果
    sess.run(……)
    
    #關閉會話使得本次運作中使用到的資源可以被釋放
    sess.close()
               
    使用這種模式時,在所有計算完成之後,需要明确調用close()函數來關閉會話并釋放資源,但是當程式因為異常而退出時,關閉會話的函數可能就不會被執行進而導緻資源洩露。
  • 第二種模式,通過Python的上下文管理器來使用會話,可以有效解決資源洩露這個問題,代碼流程如下:
    #建立一個會話,并通過Python的上下文管理器來管理這個會話
    with tf.Session() as sess:
    
    	#使用這個建立好的會話來得到關心的運算的結果
    	sess.run(……)
               
    通過Python的上下文管理器機制,隻要将所有的計算放在“with”内部,當上下文管理器退出時就會自動釋放所有資源。

TensorFlow會自動生成一個預設的計算圖,如果沒有特殊指定,計算會自動加到這個計算圖當中,但TensorFlow不會自動生成預設的會話,而是需要手動指定,當預設的會話被指定後可以通過eval()函數來計算一個張量的取值,代碼示例如下:

import tensorflow as tf

a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = a + b

sess = tf.Session()

with sess.as_default():
    print(result.eval())    
print(sess.run(result))
print(result.eval(session=sess))

sess.close()
           

執行以上代碼,會發現三個輸出結果相同:

[3. 5.]
[3. 5.]
[3. 5.]
           

在互動環境下(如Python腳本或Jupyter編輯器),TensorFlow還提供了一種直接構造預設會話的函數——tf.InteractiveSession()函數,省去了将生成的會話注冊為預設會話的過程,如下:

import tensorflow as tf

a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
result = a + b

#自動将生成的會話注冊為預設會話
sess = tf.InteractiveSession()
print(result.eval())

sess.close()
           

TensorFlow還支援在生成會話時通過tf.ConfigProto()函數配置相應參數,代碼如下:

config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)
           

tf.ConfigProto()函數有以下兩個參數:

  1. allow_soft_placement參數為True:代表某些計算無法被目前GPU支援時,可以自動調整到CPU上,而不是報錯,可以提高代碼的可移植性(預設為False)。
  2. log_device_placement參數為True:代表日志中會記錄每個節點被安排在了哪個裝置上以友善調試(參數被設定為False可以減少日志量)。

繼續閱讀