1. 程式人生 > >TensorFlow0.8原始碼閱讀 -- 程式碼目錄結構講解

TensorFlow0.8原始碼閱讀 -- 程式碼目錄結構講解

轉載自http://www.linuxidc.com/Linux/2016-07/133215.htm

TensorFlow0.8釋出以來受到了大量機器學習領域愛好者的關注,目前其專案在github上的follow人數在同類項目中排名第一。作為google的第一個開源專案,TensorFlow的原始碼結構較為清晰,相關的程式碼註釋覆蓋較全。本文首先從程式碼結構入手,分析TesnsorFlow的各個模組構成。

根目錄結構的相關介紹

以下是TensorFlow專案根目錄下的檔案結構(目前以TensorFlow-0.8為例

以下是對根目錄下的幾個核心檔案和目錄的相關介紹:

  • 目錄tensorflow 該目錄下存放著tensorflow的核心程式碼
  • 目錄google 該目錄下存放著protobuf的相關程式碼,該目錄通過在git clone 命令後新增 --recurse-submodules 可以下載得到。protobuf主要用於tensorflow中的各模組通訊。
  • 目錄third_party/tools/util 目前這三個目錄中的檔案較少,還未看出其相關作用,可能會在接下來的專案發展中變得更加完善。
  • 檔案configure 該檔案用於配置tensorflow的安裝環境,執行該檔案並完成tensorflow的安裝環境配置後,執行bazel build -c opt //tensorflow/cc:tutorials_example_trainer 即可完成程式碼的編譯工作。(
     需要先安裝bazel)

由於目錄google的作用僅為提供protobuf的通訊支援,當前我們主要對目錄tensorflow的相關結構進行分析。

tensorflow目錄結構的相關介紹

以下是目錄tensorflow下的相關目錄和檔案

以下是對該目錄下的幾個重要目錄的簡單介紹:

  • 目錄core 該目錄為tensorflow的C++原始碼的核心存放地點,接下來我們會對該目錄中存放的各個模組進行簡要介紹。
  • 目錄python 該目錄下存放了tensorflow使用python編寫的相關程式碼,個人感覺該部分程式碼主要是使用python封裝了相關的機器學習演算法,但最終的計算操作是通過呼叫目錄core
     中的C++邏輯實現的。這樣做的好處是利用了python較方便的程式設計特性和C++較高效的執行效率。
  • 目錄tensorboard tensorborad是tensorflow中非常有特色的一個模組,該模組可以用於生成模型訓練中實時生成圖表,用於監控模型的訓練程度。
  • 目錄models 該目錄下存放這多個使用pyton實現的模型例項。
  • 目錄contrib 該目錄下存放有其他專案貢獻者新增的相關貢獻程式碼,由於tensorflow受關注程度較高,目前該目錄正急劇膨脹。
  • 其他

目前來看tensorflow中很多模組正處於剛開始起步的階段,很多邏輯還有待完善(如當前支援的模型較少、很多方法還未實現等)本文接下來會對核心目錄core中的檔案結構進行簡要的介紹。

core目錄結構的相關介紹

core目錄是tensorflow原始碼中最核心的一個目錄,其程式碼邏輯主要為C++開發實現。以下為該目錄的程式碼組織結構

以下是對該目錄下的幾個主要模組(目錄)的功能介紹

  • 目錄common_runtime 該目錄下包含了tensorflow中session執行的通用邏輯流程。
  • 目錄distributed_runtime tensorflow 與分散式相關的執行邏輯。
  • 目錄graph tensorflow圖相關操作的邏輯。由於tensorflow中的資料計算本質上是一個圖狀結構的計算流程,該過程中存在將圖進行切分並且並行化執行的可能性。該目錄下的程式碼邏輯即為對圖資料進行結構化定義並進行拆分的相關內容。
  • 目錄framework 該目錄下對tensorflow進行計算過程中的通用元件進行了定義和實現。
  • 目錄kernels 對tensorflow中各個單步操作的具體實現。 該目錄中共有約470個檔案,其中414個檔案和op相關,該目錄下包含了大量的tensorflow中單步操作的實現方式。(如Variable())
  • 目錄ops 對kernel/ 下的op進行註冊和對外宣告。
  • 目錄models 實現了幾個tensorflow支援的計算模型,該部分程式碼由python實現。
  • 目錄client/public tensorflow對外api的定義和實現
  • 目錄util/lib 一些公用的呼叫方法。
  • 目錄protobuf tensorflow下各個模組間進行資料傳輸的資料結構定義,通過proto進行配置實現。
  • 目錄user_ops 使用者可進行編寫自己的op並新增到該目錄。