標籤:

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

推薦閱讀:

TensorFlow on a GTX 1080
在Docker中部署使用Tensorflow && Docker基本用法介紹
知識布局-tensorflow-bp神經網路
TensorFlow應用實戰 | TensorFlow基礎知識
TensorFlow入門(1):求N元一次方程

TAG:TensorFlow |