TensorFlow 基礎概念

  初識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()要運行哪一個,運行哪一個就觸發哪一個。

相關文章
相關標籤/搜索