TensorFlow學習之graph和session

引言:html

         按照個人理解,graph至關於一塊空白的麪包板(電路板,能夠在上面插電路元件設計電路,供電調試),上面搭建了許多子模塊,自頂向下構成一整個功能電路,整個模塊有輸入輸出端口,裏面的子模塊或者部分子模塊node

構成的模塊也有輸入和輸出端口。搭建好的這個電路板就是 'graph',而測試(執行)相應模塊都須要開一個session,上面有不少模塊能夠調試,也就是說一個graph能夠開多個session來執行各自模塊的輸入輸出過程。借網上dao來的圖做個說明:服務器

   

 

 

 

 接下來看一小段代碼:session

參考連接:https://blog.csdn.net/vinceee__/article/details/88075451   https://blog.csdn.net/vinceee__/article/details/88075451函數

注:如下僞代碼僅幫助理解學習

 1 val = tf.variable(initilizer, ...)  #變量定義
 2 const_1 = tf.constant()          #常量定義
 3 data =3 #定義
 4 op = tf.assign(val, const_1) #定義賦值操做
 5 c = tf.placeholder(dtype= ,shape = [])  #placeholder佔位符定義
 6 #使用以前定義的變量, 須要定義一個初始化操做init, sess開始後執行變量初始化
 7 init = tf.global_varibales_initializer()#全局變量初始化操做
 8  with tf.session() as sess:
 9        sess.run(init)   #執行初始化操做
10        sess.run(op)    #執行操做: 將常量const_1賦值給變量val
11        print(sess.run(val))
12        print(sess.run(c, feed_dict = {c:data})#將data值傳遞到c這個佔位符,執行打印 c

以上代碼沒有新建graph,默認使用的是TensorFlow的全局的defaultgraph.若是須要使用本身定義的graph,則使用with tf.graph().as_default()來取代默認的全局計算圖  測試

1、GRAPHfetch

 一、有關graphui

計算圖graph 由許多個node 組成,node又由name(名稱),op(操做),input(輸入),attrs(屬性:dtype,shape, size, value... ...構成),對於tf.constant()函數只會產生一個node,可是對於tf.varibale(initialize, name),其中生成一個initializer初始化器,一共會產生三個node:lua

1)variable:變量維護(不存放實際的值)

2) Varibale/assign: 變量分配

3) variable/read: 變量讀取使用

使用變量時須要進行變量初始化:生成初始化器對象,再在sess中執行init.

二、graph的使用

 1) Tf.get_default_graph():    得到當前默認graph

 2) With  Tf.Graph().as_default():  tf.graph()建立一個新的graph,並經過as_default()設置爲上下文中的默認圖(局部的),即with下面全部的定義都是在這個新建的 (局部的)graph中。

    With以外另外的graph做爲默認,get_default_graph能夠得到當前的圖。

 3) tensorflow 有一個默認的全局graph, 不用定義可直接使用,若須要另外的graph則須要新建(tf.graph()在當前使用with範圍內設置爲default)

2、Session

 一、有關session

       tf.session 是用來運行TensorFlow操做的類,一個session對象封裝了操做執行對象的環境,在這個環境下才能夠對tensor對象進行計算,tensor對象不可直接進行計算操做,同時也會負責分配計算資源和變量存放:

1)步驟: build a graph       #構建一個計算圖(裏面有操做、tensor對象)

               launch the graph in a session  #基於以上建立的graph建立一個session

               evaluate the tensor         #執行計算

2) session: 包括一些資源,例如variables, queues, readers 當咱們再也不須要這些資源時候,咱們須要釋放這些資源,釋放資源能夠經過執行sess.close(),或者將session做爲上下文管理器使用:

with tf.session() as sess:

       .... ....

       sess.run()

執行到with範圍之外,session資源釋放

3) configProto protocol buffer 公開session的各類配置選項。

        ConfigProto詳解:

        

 

            tf.configProto函數用在建立session的時候對session進行參數配置。

            3.1)Tf.ConfigProto(log­_device_placement=True)

                    log­_device_placement=True,能夠獲取到operations 和tensor 被指派到哪一個設備(幾號CPU/GPU)上運行,會在終端打印出各項操做在哪一個設備上面運行。

            3.2) Tf.ConfigProto(allow_soft_placement=True)

                 在tf中,經過「with tf.device('cpu:0'):」來手動設置操做運行的設備。若是手動設置的設備不存在或者不可用,就會致使程序等待或者異常,爲了防止這種狀況,allow_soft_placement=True,能夠容許tf自動選擇一個存在並可用的設備

                 來運行操做。

           3.3) 限制GPU的資源使用:

                    爲了加快運行效率,tf在初始化時候會嘗試分配全部可用GPU顯存資源給本身,若是在多人使用的服務器上工做會致使別人沒法正常使用GPU。

                   tf提供了兩種控制GPU資源使用的方法:

                  3.3.1) 設置動態申請顯存,須要多少就申請多少

                           

sess_config = tf.configProto(log_device_placement=False, allow_soft_placement = True)
sess_config.gpu_options.allow_growth = True
session = tf.session(config = sess_config)

 

                  3.3.2) 限制GPU的使用率,以下兩種方法:

                    

sess_config = tf.configProto(log_device_placement= Fa;se ,allow_soft_placementt= True)
sess_config.gpu_options.per_process_gpu_memory_fraction = 0.4#佔用40%顯存
session = tf.session(config = sess_config)


gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction= 0.4)
sess_config = tf.configProto(gpu_options = gpu_options)

                3.3.3) 設置使用哪塊GPU:

                            os.environ['CUDA_VISIBLE_DEVICES']= '0'

                            os.environ['CUDA_VISIBLE_DEVICES']='0,1'

                            使用上下文管理器,手動指定session在哪塊gpu上執行

                            with tf.device('/gpu:0'):

                                   ... ... ... ...

                                  with tf.session(config = tf.configProto(log_device_placement=True)) as sess:

                                        print sess.run()

                    參考網址:    https://blog.csdn.net/dcrmg/article/details/79091941

                                         https://www.cnblogs.com/ywheunji/p/11390219.html  

4) tf.session.run():       

                    Tf.Session.run(  fetches,  feed_dict=None):

 

                     Fetches:    是個list,裏面包括了咱們想要輸出的一個或者多個graph元素,tensor/ sparse tensor、operation等,見以上文獻例子。

 

                     Feed_dict:   是個dict,裏面包括須要輸入的參數名稱和實際參數傳入的key_value 對。

 

                    這個method運行一步TensorFlow計算,經過運行須要的graph 片斷來執行每一個操做和計算fetches裏的每一個Tensor,用feed_dict裏面的值替換相應的輸入值

5) tf.session() as sess:     和      tf.session().as_default() as sess:     

g = tf.graph()                          #新建graph
session = tf.session(graph = g)  #將新建的graph加載到session
with g.as_default()      #必須爲當前指定default graph(由於可能有多個graph存在)

 

       5.1) with session.as_default() as sess:

g_model =  tf.Graph()
g_session = tf.Session(graph = g_model)

with g_model.as_default() as g:
 with g_session.as_default() as sess:
      c = tf.constant(1)
      print(sess.run(c))
      print(tf.get_default_session())
      print(tf.get_default_graph())
print(tf.get_default_graph())
print(sess.run(c))
sess.close()
print(sess.run(c))

     print results:

 with以外 sess.close 以前 sess.run(c): 1  也就是說sess沒有自動關閉; 手動sess.close以後,sess.run(c)就error了,而get_default_session只能在with內有效,with外是None.

     5.2)  tf.session() as sess:

with g_Model.as_default() as g:
  with g_session as sess:
       c=tf.constant(1)
      print(sess.run(c))
      print(tf.get_default_session())
      print(tf.get_default_graph())
print(tf.get_default_graph())
print(sess.run(c))

 print results:

可見:沒有session.as_default(), with 之外sess自動關閉,sess.run(c)就報錯

 

 

 

 

以上是關於session 和graph的總結,感謝參考文檔的做者,這裏做個學習筆記,小白一枚,歡迎你們指正,叩謝~~

相關文章
相關標籤/搜索