淺入淺出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 中執行。