會話管理
class tf.session
運行TensorFlow所有操作的會話管理類。
會話管理封裝了所有被執行的操作對象,并且計算所有張量的值,例如:
# 創建一個圖.
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# 在會話里運行圖
sess = tf.Session()
# 計算張量 `c`.
PRint(sess.run(c))
會話有很多自己的資源:比如變量、隊列和訪問器,這些資源當會話不需要時就會釋放這些資源,以便回收相應的資源,所以當調用close()函數,或者在環境管理器的模式下運行,也會自動回收這些資源:
# 使用 `close()`函數.
sess = tf.Session()
sess.run(...)
sess.close()
# 使用環境管理器
with tf.Session() as sess:
sess.run(...)
會話可以通過ConfigProto函數使用protocol buffer協議來獲取所有配置變量,比如創建一個會話時,可以使用軟件限制來代替硬件設備,并打印相應的結果,可以像下面這樣創建會話:
# 創建會話運行圖,打開軟件限制和打印選項
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
log_device_placement=True))
tf.Session.__init__(target='', graph=None, config=None)
創建一個TF的會話,它是一個構造函數。
調用這個函數時如果沒有設置相應的圖,就會使用默認的圖。如果創建了多個圖來表示算法,就需要創建多個會話,以便會話與圖對應。不過每個會話只能使用一個圖,每個圖可以使用在不同的會話里,在這種情況一般在構造時指定相應的圖到會話構造函數。
參數:
target: (可選) ,將要連接引擎,默認是使用進程內的引擎。可以查看分布式的TF例子。
graph: (可選)將要運行的圖集
config: (可選)使用ConfigProto定義 protocol buffer緩沖定義的配置選項。
tf.Session.run(fetches, feed_dict=None, options=None, run_metadata=None)
運行對圖的操作以及對張量求值并返回。
本函數僅對TF的張量流圖運行一步計算,并且它只計算需要運行的部分流圖和需要返回張量值變量或常量的運算操作,也就是對字典參數feed_dict里定義的張量進行計算,如果沒有相關的圖或者張量,它是不作任何的操作和計算。
求值返回的參數fetches可以一個圖參數,或者任意嵌套的列表、元組、命名元組、或包含圖元素的字典對象等等。圖元素的值可以是下面任何一種類型:
操作。 返回值將是None。
張量。返回值是numpy里的ndarray數據表示。
SparseTensor。返回值是SparseTensorValue包含的值。
get_tensor_handle op。返回值是numpy里的ndarray數據表示。
字符串。返回值是張量的名稱或操作過程的名稱。
run()函數返回值形式與參數里設置的值形式是一樣的。
例如:
a = tf.constant([10, 20])
b = tf.constant([1.0, 2.0])
# 獲取返回一個值
v = session.run(a)
# v 是numpy的數組array [10, 20]
# 獲取返回一個列表
v = session.run([a, b])
# v是一個兩個元素的列表:numpy的數組array [10, 20]和1-D數組array [1.0, 2.0]
# 獲取回來的值可以是列表、元組、命名元組、字典:
MyData = collections.namedtuple('MyData', ['a', 'b'])
v = session.run({'k1': MyData(a, b), 'k2': [b, a]})
# v 將是一個字典返回。
可選參數feed_dict允許調用者設置圖里的張量,每個鍵可以下面類型值:
如果鍵是張量,值可以是Python常數、字符串、列表或者numpy的數組ndarray。
如果鍵是未知數的占位符placeholder,值的行列形式要與占位符保持一致。
如果鍵是SparseTensor,值應該是SparseTensorValue。
如果鍵是嵌套元組的張量或SparseTensor,那么值也是對應嵌套元組,并且是同樣的結構排列。
在feed_dict參數里的每個值都應該可以轉換為numpy的數組array表示,數組的類型是鍵中對應的dtype類型。
可選參數options是表示[RunOptions]項的內容。主要用允許控制這一步流圖運行的一些特定功能,比如打開調試輸出信息。
可選參數run_metadata是[RunMetadata]項的內容。在合適的時候,這一步產生的非張量的輸出會寫到這項里。例如,當用戶配置為跟蹤時配置文件的信息就會寫入此項,以便外面可以查看。
參數:
fetches: 圖對象,圖元素的列表,圖元素的字典,或者圖元素的嵌套列表。
feed_dict: 圖元素對應值的字典。
options: [RunOptions]項的protocol buffer協議內容。
run_metadata: [RunMetadata]項的 protocol buffer協議內容。
返回值:
如果獲取圖的一個元素,就返回一個值;如果獲取一個列表的值,就返回一個列表;與上面描述的一樣。
異常:
RuntimeError: 如果會話無效狀態返回此值,比如已經關閉還想使用。
TypeError: 如果fetches或feed_dict類型參數的鍵錯誤返回。
ValueError: 如果fetches 或 feed_dict的鍵的張量變量不存返回。
tf.Session.close()
關閉會話。
調用此函數來釋放所有會話分配的資源。
異常:
如果tf.errors.OpError等于下面任何一個異常將會關閉TF的會話:tf.Session.graph圖已經被設置過。
tf.Session.as_default()
設置會話管理器里默認的任務。當調用此函數之后,可以在Operation.run() 或 Tensor.eval()里使用時,不需要傳送sess參數,并且此默認任務不會隨著環境管理器退出而關閉,必須明確地調用close()函數來關閉這個會話。
比如可以這樣使用:
c = tf.constant(..)
sess = tf.Session()
with sess.as_default():
assert tf.get_default_session() is sess
print(c.eval())
要注意的是,獲取當前默認的函數是使用tf.get_default_session()函數,而不是上面這個函數。
像下面的例子說明要明確地調用close()函數來關閉任務:
c = tf.constant(...)
sess = tf.Session()
with sess.as_default():
print(c.eval())
# ...
with sess.as_default():
print(c.eval())
sess.close()
另外一個種選擇,你可以這樣使用
with tf.Session():
print(c.eval())
形式來創建一個會話,當環境管理器退出或者發生異常退出時,就可以自動關閉會話。另外一點要說明的是,當前線程運行默認的圖是缺省的圖,如果你自己創建一個新線程,又想把任務作為這個線程的缺省會話,就必須在線程里明確地調用下面的語句:with sess.as_default(): 。
返回值:
返回使用這個會話做默認會話的會話管理器。
tf.Session.reset(target, containers=None, config=None)
釋放目標target參數里的所有資源,并且關閉所有連接的任務。本函數主要使用在分布式的會話管理里,當調用本函數之后所有變量都會復位,任何會話以目標為名稱的會話都被關閉。
參數:
target: 執行引擎連接的目標對象。
containers: 資源名稱的字符串列表,或者設置為None時,釋放所有容器的資源。
config: (可選) 配置參數的Protocol buffer協議內容.
異常:
tf.errors.OpError: 當復位子類時異常拋出。
tf.Session.__enter__() 進入函數,使用未明。
tf.Session.__exit__(exec_type, exec_value, exec_tb) 退出函數,使用未明。
class tf.InteractiveSession
創建交互式環境的會話管理器,比如在shell下面。
InteractiveSession創建的會話對象與普通的會話對象在創建時有點不一樣,它在構造函數時把這個會話當作默認會話關聯到這個線程里,以便后面所有使用張量的操作Tensor.eval()和操作符Operation.run()運行,都不需要明顯地調用會話任務對象作為參數傳送給函數。因此這個函數在shell、ipython notebooks等工具下,就非常方便使用。
例如:
sess = tf.InteractiveSession()
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# 在這里直接調用'c.eval()',而不需要傳送'sess'參數。
print(c.eval())
sess.close()
值得注意時普通的會話也可以使用with語句來創建等同作用的功能,比如下面代碼就在非交互式的環境下:
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
with tf.Session():
# 在這里同樣調用 'c.eval()'函數時,不用傳送sess參數。
print(c.eval())
tf.InteractiveSession.__init__(target='', graph=None, config=None)
創建一個交互式的TF會話。
如果在構造時沒有指明graph圖參數,那么它會把當前默認的圖作為會話默認圖集。如果在同一個進程里創建(tf.Graph())了不同的圖,必須使用不同的會話來運行圖,但是每個圖可以使用在多個不同的會話里,在這種情況下,常常需要指定圖參數到會話里。
參數:
target: (可選)執行引擎連接的目標,默認是進程內引擎。
graph: (可選)會話要運行的圖。
config: (可選)ConfigProto定義的內容來配置會話
tf.InteractiveSession.close()
關閉交互式會話。
tf.get_default_session()
獲取當前線程的默認會話。
返回值:
當前線程里默認的會話。
新聞熱點
疑難解答