初識TensorFlow,看了幾天教程後有些無聊,決定寫些東西,來夯實一下基礎,提供些前進動力。session
1、Session.run()和Tensor.eval()的區別:
最主要的區別就是可使用sess.run()一步獲取多個Tensor值,而tensor.eval()只能獲取當前tensor值。
好比:
labels = [1,2,3]
x = tf.expand_dims(labels, 0)
y = tf.expand_dims(labels, 1)
z = tf.expand_dims(labels, -1)
print(sess.run([x,y,z]))
注:對於tensor t,在使用t.eval()時,等價於:tf.get_default_session().run(t)。
此外,還有一個用法,operation.run(),等價於:tf.get_default_session().run(op)。operation是什麼呢,就是計算圖中的一個計算節點,定義一個計算的公式。分佈式
好比:
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
train_step.run(feed_dict={x:batch_xs,y_:batch_ys,keep_prob:0.5})
注:調用operation.run()和Tensor.eval()時,其參數是session,但該參數可選,默認是None,標示進程中默認的Session。那麼如何設置默認session呢?兩種方式:
一、with tf.Session():
二、 sess = tf.Session()
with sess.as_default():
print(sess.run([x,y,z]))
sess.close()函數
此外,還能夠設置默認圖
graph = tf.Graph()學習
with graph.as_default():教程
2、graph和session的必要性進程
Python的計算效率比較低,而深度學習須要大量的迭代計算。因此,一般會使用函數庫,如Numpy,把相似矩陣乘法這樣的複雜運算使用其餘外部語言(好比C++)來實現。但計算完成後從外部切換回Python仍然開銷很大。因此,先把全部的計算操做公式定義好(這個用圖描述,只是初級都用默認圖),而後所有一次性在Python外運行計算(這個在定義的會話session中完成)。這是graph和session的由來及用處。get
session有三種定義方式:
一、該方式須要調用sess.close()來關掉sess。
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)深度學習
sess.close()it
二、該方式建立context,當上下文退出時自動釋放,不須要手動關掉session。
with tf.Session() as sess:
init=tf.global_variables_initializer()
sess.run(init)
三、該方式能夠在sess中定義operation。
sess = tf.InteractiveSession()io
session能夠有多個,graph也能夠有多個,具體以下:
Session類的構造函數:tf.Session.__init__(target='',graph=None,config=None)
若是建立Session時沒有指定Graph,則Session會加載默認的Graph。若是在一個進程中建立了多個Graph(這是會的,可能有多層,多個結構,或分佈式處理),則須要建立不一樣的Session來加載每一個Graph,而每一個Graph也能夠加載在多個Session中進行計算。一個session中只能有一個圖,而一個圖能夠放在多個session中。
g1 = tf.Graph()
with g1.as_default():
c1 = tf.constant([1.0,1.0])
with tf.Graph().as_default() as g2:
c2 = tf.constant([2.0,2.0])
with tf.Session(graph=g1) as sess1:
print sess1.run(c1)
with tf.Session(graph=g2) as sess2:
print sess2.run(c2)
Graph中的operation定義好以後,看sess.run()要運行哪一個,運行哪一個就觸發哪一個。