TensorFlow中的會話(Session)擁有并管理TensorFlow程式運作時的所有資源,當所有計算完成之後需要關閉會話來幫助系統回收資源,否則就可能出現資源洩露問題。
TensorFlow中使用會話的模式有以下兩種:
- 第一種模式,需要明确調用會話生成函數和關閉會話函數,這個模式的代碼流程如下:
使用這種模式時,在所有計算完成之後,需要明确調用close()函數來關閉會話并釋放資源,但是當程式因為異常而退出時,關閉會話的函數可能就不會被執行進而導緻資源洩露。#建立一個會話 sess = tf.Session() #使用這個建立好的會話來得到關心的運算的結果 sess.run(……) #關閉會話使得本次運作中使用到的資源可以被釋放 sess.close()
- 第二種模式,通過Python的上下文管理器來使用會話,可以有效解決資源洩露這個問題,代碼流程如下:
通過Python的上下文管理器機制,隻要将所有的計算放在“with”内部,當上下文管理器退出時就會自動釋放所有資源。#建立一個會話,并通過Python的上下文管理器來管理這個會話 with tf.Session() as sess: #使用這個建立好的會話來得到關心的運算的結果 sess.run(……)
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()函數有以下兩個參數:
- allow_soft_placement參數為True:代表某些計算無法被目前GPU支援時,可以自動調整到CPU上,而不是報錯,可以提高代碼的可移植性(預設為False)。
- log_device_placement參數為True:代表日志中會記錄每個節點被安排在了哪個裝置上以友善調試(參數被設定為False可以減少日志量)。