天天看點

Tensorflow |(4)名稱域、圖 和會話圖與會話

Tensorflow |(1)初識Tensorflow

Tensorflow |(2)張量的階和資料類型及張量操作

Tensorflow |(3)變量的的建立、初始化、儲存和加載

Tensorflow |(4)名稱域、圖 和會話

變量作用域

tensorflow提供了變量作用域和共享變量這樣的概念,有幾個重要的作用。

讓模型代碼更加清晰,作用分明

變量作用域域

通過tf.variable_scope()建立指定名字的變量作用域

with tf.variable_scope("itcast") as scope:
  print("----")      

加上with語句就可以在整個itcast變量作用域下就行操作。

嵌套使用

變量作用域可以嵌套使用

with tf.variable_scope("itcast") as itcast:
    with tf.variable_scope("python") as python:
      print("----")      

變量作用域下的變量

在同一個變量作用域下,如果定義了兩個相同名稱的變量(這裡先用tf.Variable())會怎麼樣呢?

with tf.variable_scope("itcast") as scope:
    a = tf.Variable([1.0,2.0],name="a")
    b = tf.Variable([2.0,3.0],name="a")      

我們通過tensoflow提供的計算圖界面觀察

Tensorflow |(4)名稱域、圖 和會話圖與會話

我們發現取了同樣的名字,其實tensorflow并沒有當作同一個,而是另外又增加了一個a_1,來表示b的圖

變量範圍

當每次在一個變量作用域中建立變量的時候,會在變量的name前面加上變量作用域的名稱

with tf.variable_scope("itcast"):
    a = tf.Variable(1.0,name="a")
    b = tf.get_variable("b", [1])
    print(a.name,b.name)      

得道結果

(u'itcast/a:0', u'itcast/b:0')
      

對于嵌套的變量作用域來說

with tf.variable_scope("itcast"):
    with tf.variable_scope("python"):
        python3 = tf.get_variable("python3", [1])
assert python3.name == "itcast/python/python3:0"      
var2 = tf.get_variable("var",[3,4],initializer=tf.constant_initializer(0.0))      

圖與會話

tf.Graph

TensorFlow計算,表示為資料流圖。一個圖包含一組表示 tf.Operation計算機關的對象和tf.Tensor表示操作之間流動的資料單元的對象。預設Graph值始終注冊,并可通過調用通路 tf.get_default_graph。

a = tf.constant(1.0)
assert c.graph is tf.get_default_graph()      

我們可以發現這兩個圖是一樣的。那麼如何建立一個圖呢,通過tf.Graph()

g1= tf.Graph()
g2= tf.Graph()
 
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(g1,g2,tf.get_default_graph())      

圖的其它屬性和方法

作為一個圖的類,自然會有一些圖的屬性和方法。

as_default()

傳回一個上下文管理器,使其成為Graph預設圖形。

如果要在同一過程中建立多個圖形,則應使用此方法。為了友善起見,提供了一個全局預設圖形,如果不明确地建立一個新的圖形,所有操作都将添加到此圖形中。使用該with關鍵字的方法來指定在塊的範圍内建立的操作應添加到此圖形中。

g = tf.Graph()
with g.as_default():
  a = tf.constant(1.0)
  assert c.graph is g      

會話

tf.Session

運作TensorFlow操作圖的類,一個包含ops執行和tensor被評估

a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
 
sess = tf.Session()
 
print(sess.run(c))      

在開啟會話的時候指定圖

with tf.Session(graph=g) as sess:
      

資源釋放

會話可能擁有很多資源,如 tf.Variable,tf.QueueBase和tf.ReaderBase。在不再需要這些資源時,重要的是釋放這些資源。要做到這一點,既可以調用tf.Session.close會話中的方法,也可以使用會話作為上下文管理器。以下兩個例子是等效的:

# 使用close手動關閉
sess = tf.Session()
sess.run(...)
sess.close()
 
# 使用上下文管理器
with tf.Session() as sess:
  sess.run(...)      

run方法介紹

run(fetches, feed_dict=None, options=None, run_metadata=None)

運作ops和計算tensor

fetches 可以是單個圖形元素,或任意嵌套清單,元組,namedtuple,dict或OrderedDict

feed_dict 允許調用者覆寫圖中指定張量的值

如果a,b是其它的類型,比如tensor,同樣可以覆寫原先的值

a = tf.placeholder(tf.float32, shape=[])
b = tf.placeholder(tf.float32, shape=[])
c = tf.constant([1,2,3])
 
with tf.Session() as sess:
    a,b,c = sess.run([a,b,c],feed_dict={a: 1, b: 2,c:[4,5,6]})
    print(a,b,c)      

錯誤

RuntimeError:如果它Session處于無效狀态(例如已關閉)。

TypeError:如果fetches或feed_dict鍵是不合适的類型。

ValueError:如果fetches或feed_dict鍵無效或引用 Tensor不存在。

其它屬性和方法

graph

傳回本次會話中的圖

傳回使此對象成為預設會話的上下文管理器。

擷取目前的預設會話,請使用 tf.get_default_session

c = tf.constant(..)
sess = tf.Session()
 
with sess.as_default():
  assert tf.get_default_session() is sess
  print(c.eval())      

注意: 使用這個上下文管理器并不會在退出的時候關閉會話,還需要手動的去關閉

c = tf.constant(...)
sess = tf.Session()
with sess.as_default():
  print(c.eval())
# ...
with sess.as_default():
  print(c.eval())
 
sess.close()      

繼續閱讀