一. 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 中執行。