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()函數有以下兩個參數:
-
allow_soft_placement參數爲True:代表某些計算無法被當前GPU支持時,可以自動調整到CPU上,而不是報錯,可以提高代碼的可移植性(默認爲False)。
-
log_device_placement參數爲True:代表日誌中會記錄每個節點被安排在了哪個設備上以方便調試(參數被設置爲False可以減少日誌量)。