在TensorFlow中涡拘,有兩種用于運(yùn)行計(jì)算圖(graph)的會(huì)話(session)
tf.Session( )
tf.InteractivesSession( )
1. tf.Session( )
要使用tf赁咙,我們必須先構(gòu)建(定義)graph净嘀,之后才能運(yùn)行g(shù)raph甲馋。
1.1 非交互式會(huì)話中的例子
import tensorflow as tf
# 構(gòu)建graph
a = tf.add(3, 5)
# 運(yùn)行g(shù)raph
sess = tf.Session() # 創(chuàng)建tf.Session的一個(gè)對(duì)象sess
print(sess.run(a))
sess.close() # 關(guān)閉sess對(duì)象
一個(gè)session可能會(huì)占用一些資源闲孤,比如變量搏色、隊(duì)列和讀取器(reader)夺英。我們使用sess.close()關(guān)閉會(huì)話或者使用上下文管理器釋放這些不再使用的資源缭召。
1.2 建議的tf.Session( )寫(xiě)法
import tensorflow as tf
# 構(gòu)建graph
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.], [2.]])
product = tf.matmul(matrix1, matrix2)
# 運(yùn)行g(shù)raph
with tf.Session() as sess: # 使用"with"語(yǔ)句,自動(dòng)關(guān)閉會(huì)話
print(sess.run(product))
1.3 Fetch(取回)
在使用sess.run( )運(yùn)行圖時(shí)盒粮,我們可以傳入fetches鸵鸥,用于取回某些操作或tensor的輸出內(nèi)容。fetches可以是list丹皱,tuple妒穴,namedtuple,dict中的任意一個(gè)摊崭。fetches可以是一個(gè)列表讼油,在op的一次運(yùn)行中一起獲得(而不是逐個(gè)去獲取 tensor)多個(gè)tensor值。
import tensoflow as tf
from collections import namedtuple
a = tf.constant([10, 20])
b = tf.constant([1.0, 2.0])
MyData = namedtuple('MyData', ['a', 'b'])
with tf.Session() as sess:
c = sess.run(a) # fetches可以為單個(gè)數(shù)a
d = sess.run([a, b]) # fetches可以為一個(gè)列表[a, b]
v = sess.run({'k1': MyData(a, b), 'k2': [b, a]})
print(c)
print(d)
print(d[0])
print(v)
'''
v is a dict and v['k1'] is a MyData namedtuple with the numpy array [10, 20] and the numpy array [1.0, 2.0]. v['k2'] is a list with the numpy array [1.0, 2.0] and the numpy array [10, 20].
'''
1.4 Feed(注入)
TensorFlow提供了feed注入機(jī)制, 它可以臨時(shí)替代graph中任意op操作的輸入tensor爽室,可以對(duì)graph中任何操作提交補(bǔ)吨稀(直接插入一個(gè)tensor)。
feed機(jī)制只在調(diào)用它的方法內(nèi)有效阔墩,方法結(jié)束嘿架,feed就會(huì)消失。最常見(jiàn)的用例是把某些特殊操作為feed注入的對(duì)象啸箫。你可以提供數(shù)據(jù)feed_dict耸彪,作為sess.run( )調(diào)用的參數(shù)。使用tf.placeholder( )忘苛,為某些操作的輸入創(chuàng)建占位符蝉娜。
import tensorflow as tf
import numpy as np
x = np.ones((2, 3))
y = np.ones((3, 2))
input1 = tf.placeholder(tf.int32)
input2 = tf.placeholder(tf.int32)
output = tf.matmul(input1, input2)
with tf.Session() as sess:
print(sess.run(output, feed_dict = {input1:x, input2:y}))
如果沒(méi)有正確提供tf.placeholder( )唱较,feed操作將產(chǎn)生錯(cuò)誤。注意召川,feed注入的值不能是tf的tensor對(duì)象南缓,應(yīng)該是Python常量、字符串荧呐、列表汉形、numpy ndarrays,或者TensorHandles倍阐。
1.5 分布式訓(xùn)練
從version 0.8之后概疆,TensorFlow開(kāi)始支持分布式計(jì)算的機(jī)器學(xué)習(xí),而且TensorFlow會(huì)充分利用CPU峰搪、GPU等計(jì)算資源岔冀。如果檢測(cè)到GPU,TensorFlow會(huì)優(yōu)先使用GPU運(yùn)行程序概耻。用字符串標(biāo)識(shí)設(shè)備使套,目前支持的設(shè)備包括:
“/cpu:0”:機(jī)器的第一個(gè)CPU。
“/gpu:0”:機(jī)器的第一個(gè)GPU, 如果有的話
“/gpu:1”:機(jī)器的第二個(gè)GPU, 以此類推
當(dāng)計(jì)算機(jī)有多個(gè)GPU時(shí)鞠柄,通過(guò)tf.device( )童漩,我們可以指定用哪個(gè)GPU來(lái)執(zhí)行。代碼示例如下:
# 在with tf.device()下春锋,構(gòu)建graph
with tf.device("/gpu:0"):
a = tf.constant([[3., 3.]])
b = tf.constant([[2.], [2.]])
product = tf.matmul(a, b)
# 運(yùn)行g(shù)raph
with tf.Session() as sess:
print(sess.run(product))
2. tf.InteractivesSession( )
當(dāng)python編輯環(huán)境是shell、IPython等交互式環(huán)境時(shí)差凹,我們使用類tf.InteractiveSession代替類tf.Session期奔,用方法tensor.eval( ),operation.run( ) 代替sess.run( )危尿,這樣可避免用一個(gè)變量sess來(lái)持有會(huì)話呐萌。其中更多地使用 tensor.eval(),所有的表達(dá)式都可以看作是tensor谊娇。
// 進(jìn)入python3交互式環(huán)境
# python3
>>> import tensorflow as tf
// 進(jìn)入一個(gè)交互式會(huì)話
>>> sess = tf.InteractiveSession()
>>> a = tf.constant(5.0)
>>> b = tf.constant(6.0)
>>> c = a * b
// We can just use 'c.eval()' without passing 'sess'
>>> print(c.eval())
>>> sess.close() // 關(guān)閉交互式會(huì)話
>>> exit() // 退出python3交互式環(huán)境