淺入淺出TensorFlow 9 - 代碼框架解析

一. TensorFlow 源碼

       截止到目前爲止,TensorFlow 在 【Github】 的 Contributors 已經接近900人,Fork 30000次。

       學習這麼龐大的開源項目,首先必須要搞清楚其代碼組織形式,我們先來看目錄結構:

    

       Project 目錄分爲4個:

1)tensorflow

     核心代碼目錄,圖中可以看到其子目錄結構,後面我們會展開講解。

2)third_party

     第三方庫,包括:eigen3,fft2d,hadoop,mkl,probuf 等。

3)tools

     只有兩個文件 bazel.rc 和 tf_env_collect.sh。

4)util/python

     存放用到的 python 工具。

另外一個比較重要的文件是 configure,用於配置 tensorflow 的安裝環境。

        

       對於 tensorflow 核心目錄,裏面比較關鍵的幾個模塊:

1.1)core

        這是 tensorflow 的核心代碼模塊.

1.2)tensorboard

        不用解釋,應該都清楚,這是可視化工具 tensorboard 的代碼目錄。

1.3)stream_executor

        tensorflow 流圖的並行計算執行,核心代碼。

1.4)go,java,python

        主要的第三方 API。

1.5)contrib

        存放有其他項目貢獻者添加的相關貢獻代碼,非核心官方代碼,有具體方向的應用可以參考這裏面的模塊。

        

二. 核心代碼目錄 Core

       Core 目錄是代碼最核心的部分,包含 框架、圖、會話、runtime 最核心的部分,主要模塊包括:

● common_runtime:公共運行庫,包含 會話(session)、線程(thread),內存管理(memory), 設備調度(device)等基本運行庫。

● distributed_runtime:分佈式運行庫,與上面類似,作爲分佈式情況下的運行庫,提供運行支撐。

● framework:框架基礎模塊定義,主要是通用組件的結構格式定義;

● graph:計算流圖相關基礎操作(類結構),包括 拆分、合併、執行 等操作,被外面的 executor 調用;

● kernels:核心操作定義,像常用的運算 matmul,sigmoid 等操作;

● lib:基礎庫用於內部調用,包括 hash、io、jpeg、math 等;

● ops:對 kernel 下的op進行註冊和對外聲明;

● protobuf:Google 的傳輸交換模塊,用於傳輸時的數據序列化;


三. Graph 與 Session

       關於 Graph 和 Session 前面已經有篇幅講過,概念上可能大家並沒有完全理解,本篇再講一下。

● Graph

       首先搞清一個概念,Graph 是 Tensorflow 必須要存在的,是靈魂核心,你所看到的任何一個 圖都是通過 Graph來組織的。

        

       再來看一段你已經很熟悉的代碼:

   >>> import tensorflow as tf  
   >>> str = tf.constant("Hello World!")  
   >>> se = tf.Session()  
   >>> print se.run(str)

     沒看到 Graph 的創建對不對? 實際上在你創建 Session 的時候,系統自動爲你創建了一個 默認Graph,用於接下來所有 OP 的組織和存放。

     某些情況下,你可以同時維護兩個以上的 Graph,比如我們經常會遇到這樣一句,  tf.Graph.as_default()

   curr_graph = tf.Graph()
   with curr_graph.as_default(): 
       c_val = tf.constant(1.0)
       assert c_val.graph is curr_graph
     在定義 OP 操作的時候可以選擇Graph 作爲 default,那麼你所創建的 OP 就建立在對應 Graph 下面了。

● Session

       TensorFlow 的 Session 用法你可能比較熟了,來回顧一下:

   # method 1
   sess = tf.Session()
   print sess.run(…)
   sess.close()

   # method 2
   with tf.Session() as sess:
      print sess.run(…)

   # method 3 - 僅用於交互式環境
   sess = tf.InteractiveSession()
   a = tf.constant(1.0)
   b = tf.constant(2.0)
   c = a + b
   # 我們直接使用'c.eval()' 而不是'sess.run'
   print(c.eval())
   sess.close()

       對於 Graph 和 Session 的關係,需要記住,Graph 可以在對應多個 Session 中執行。

發佈了176 篇原創文章 · 獲贊 810 · 訪問量 90萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章