Session
1.session運行過程
在python中運行如下腳本,
運行到下面這句時
with tf.variable_scope(mm): a1 = tf.get_variable(aa,[3,4],initializer = tf.truncated_normal_initializer(stddev = 0.1)) a2 = tf.get_variable(bb,[4,4],initializer = tf.truncated_normal_initializer(stddev = 0.1)) y = tf.matmul(a1,a2)
系統將所有節點布置到某設備上(如CPU或GPU),在此設備上就會存在名為aa, bb, matmul的變數及節點的數據產生方法或節點間的依賴信息,也就是計算圖,這些變數不會返回到python內存空間上,所以在python變數名上是看不到這些變數的,計算時是直接在設備上計算,而不是複製回python的內存空間再計算,這樣可以節省資源。但我們可以使用賦值將其值複製到a1,a2,y上。
運行到tf.Session()時,表示可以開始進行初始化數據和其它運算操作,並會保存節點上的數值
運行到tf.global_variables_initializer().run()會初始化所有數據生成節點如aa, bb,這時這個節點上才保存有數值。
運行到sess.run(y),設備會根據計算圖上的節點依賴關係,自動找到計算出y的所有依賴點,此時節點aa, bb的值以數組形式複製到a1,a2上,並計算出y的值,此時matmul這個運算節點才保存有數值。
最後程序運行完畢with ...上下文管理器自動關掉tf.Session(),此時在設備上的計算圖的所有保存的數值均消失,但計算圖還存在。包括迭代的參數值均刪除,所以tf.Session()中應該把訓練的參數保存下來。
import tensorflow as tfimport numpy as npwith tf.variable_scope(mm): a1 = tf.get_variable(aa,[3,4],initializer = tf.truncated_normal_initializer(stddev = 0.1)) a2 = tf.get_variable(bb,[4,4],initializer = tf.truncated_normal_initializer(stddev = 0.1)) y = tf.matmul(a1,a2)with tf.Session() as sess: tf.global_variables_initializer().run() print(sess.run(y))
重複運行with...上下文管理器,每次得到的y的結果都不一樣,是因為每次結束session時,a1,a2,y保存在設備上的值均被刪除,然後又重新初始化,於是得到不一樣的結果。
2.兩種session
通過會話啟動圖。兩種主要方法。
在上下文管理器中啟動圖with tf.Session() as sess:sess.run(...)使用互動式圖sess=tf.InteractiveSession()
推薦閱讀:
※各種空間
※矩陣分解及其意義
※優化問題
※證明Weierstrass逼近定理的三種途徑(一)
※概率論如何實現抽象
TAG:概率論 |