Tensorflow學習筆記2:About Session, Graph, Operation and Tensor

簡介

上一篇筆記:Tensorflow學習筆記1:Get Started 咱們談到Tensorflow是基於圖(Graph)的計算系統。而圖的節點則是由操做(Operation)來構成的,而圖的各個節點之間則是由張量(Tensor)做爲邊來鏈接在一塊兒的。因此Tensorflow的計算過程就是一個Tensor流圖。Tensorflow的圖則是必須在一個Session中來計算。這篇筆記來大體介紹一下Session、Graph、Operation和Tensor。html

Session

Session提供了Operation執行和Tensor求值的環境。以下面所示,python

import tensorflow as tf

# Build a graph.
a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])
c = a * b

# Launch the graph in a session.
sess = tf.Session()

# Evaluate the tensor 'c'.
print sess.run(c)
sess.close()

# result: [3., 8.]

一個Session可能會擁有一些資源,例如Variable或者Queue。當咱們再也不須要該session的時候,須要將這些資源進行釋放。有兩種方式,git

  1. 調用session.close()方法;
  2. 使用with tf.Session()建立上下文(Context)來執行,當上下文退出時自動釋放。

上面的例子能夠寫成,github

import tensorflow as tf

# Build a graph.
a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])
c = a * b

with tf.Session() as sess:
    print sess.run(c)

Session類的構造函數以下所示:api

tf.Session.__init__(target='', graph=None, config=None)session

若是在建立Session時沒有指定Graph,則該Session會加載默認Graph。若是在一個進程中建立了多個Graph,則須要建立不一樣的Session來加載每一個Graph,而每一個Graph則能夠加載在多個Session中進行計算。函數

執行Operation或者求值Tensor有兩種方式:post

  1. 調用Session.run()方法: 該方法的定義以下所示,參數fetches即是一個或者多個Operation或者Tensor。學習

    tf.Session.run(fetches, feed_dict=None)fetch

  2. 調用Operation.run()或則Tensor.eval()方法: 這兩個方法都接收參數session,用於指定在哪一個session中計算。但該參數是可選的,默認爲None,此時表示在進程默認session中計算。

那如何設置一個Session爲默認的Session呢?有兩種方式:

1. 在with語句中定義的Session,在該上下文中便成爲默認session;上面的例子能夠修改爲:

import tensorflow as tf

# Build a graph.
a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])
c = a * b

with tf.Session():
   print c.eval()

2. 在with語句中調用Session.as_default()方法。 上面的例子能夠修改爲:

import tensorflow as tf

# Build a graph.
a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])
c = a * b
sess = tf.Session()
with sess.as_default():
    print c.eval()
sess.close()

Graph

Tensorflow中使用tf.Graph類表示可計算的圖。圖是由操做Operation和張量Tensor來構成,其中Operation表示圖的節點(即計算單元),而Tensor則表示圖的邊(即Operation之間流動的數據單元)。

tf.Graph.__init__()

建立一個新的空Graph

在Tensorflow中,始終存在一個默認的Graph。若是要將Operation添加到默認Graph中,只須要調用定義Operation的函數(例如tf.add())。若是咱們須要定義多個Graph,則須要在with語句中調用Graph.as_default()方法將某個graph設置成默認Graph,因而with語句塊中調用的Operation或Tensor將會添加到該Graph中。

例如,

import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
    c1 = tf.constant([1.0])
with tf.Graph().as_default() as g2:
    c2 = tf.constant([2.0])

with tf.Session(graph=g1) as sess1:
    print sess1.run(c1)
with tf.Session(graph=g2) as sess2:
    print sess2.run(c2)

# result:
# [ 1.0 ]
# [ 2.0 ]

若是將上面例子的sess1.run(c1)和sess2.run(c2)中的c1和c2交換一下位置,運行會報錯。由於sess1加載的g1中沒有c2這個Tensor,一樣地,sess2加載的g2中也沒有c1這個Tensor。

Operation

一個Operation就是Tensorflow Graph中的一個計算節點。其接收零個或者多個Tensor對象做爲輸入,而後產生零個或者多個Tensor對象做爲輸出。Operation對象的建立是經過直接調用Python operation方法(例如tf.matmul())或者Graph.create_op()。

例如c = tf.matmul(a, b)表示建立了一個類型爲MatMul的Operation,該Operation接收Tensor a和Tensor b做爲輸入,而產生Tensor c做爲輸出。

當一個Graph加載到一個Session中,則能夠調用Session.run(op)來執行op,或者調用op.run()來執行(op.run()是tf.get_default_session().run()的縮寫)。

Tensor

Tensor表示的是Operation的輸出結果。不過,Tensor只是一個符號句柄,其並無保存Operation輸出結果的值。經過調用Session.run(tensor)或者tensor.eval()方可獲取該Tensor的值。

關於Tensorflow的圖計算過程

咱們經過下面的代碼來看一下Tensorflow的圖計算過程:

import tensorflow as tf
a = tf.constant(1)
b = tf.constant(2)
c = tf.constant(3)
d = tf.constant(4)
add1 = tf.add(a, b)
mul1 = tf.mul(b, c)
add2 = tf.add(c, d)
output = tf.add(add1, mul1)
with tf.Session() as sess:
    print sess.run(output)

#
result: 9

上面的代碼構成的Graph以下圖所示,

 graph_compute_flow

當Session加載Graph的時候,Graph裏面的計算節點都不會被觸發執行。當運行sess.run(output)的時候,會沿着指定的Tensor output來進圖路徑往回觸發相對應的節點進行計算(圖中紅色線表示的那部分)。當咱們須要output的值時,觸發Operation tf.add(add1, mul1)被執行,而該節點則須要Tensor add1和Tensor mul1的值,則往回觸發Operation tf.add(a, b)和Operation tf.mul(b, c)。以此類推。

因此在計算Graph時,並不必定是Graph中的全部節點都被計算了,而是指定的計算節點或者該節點的輸出結果被須要時。

(done)

相關文章
相關標籤/搜索