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可以減少日誌量)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章