1. 程式人生 > >【免費教學】Tensorflow Lite極簡入門

【免費教學】Tensorflow Lite極簡入門

邊緣計算時代離我們越來越近,當前嵌入式裝置的智慧框架還是 TensorFlow Lite比較成熟,這裡我準備用一系列免費課程和大家一起討論下 TensorFlow Lite在移動裝置上的應用,讓我們的裝置智慧起來。

我們先來看下 YouTube 上開通的TensorFlow 視訊頻道的一段視訊:

TensorFlow Lite 介紹

TensorFlow Lite 的目標是移動和嵌入式裝置,它賦予了這些裝置在終端本地執行機器學習模型的能力,從而不再需要向雲端伺服器傳送資料。這樣一來,不但節省了網路流量、減少了時間開銷,而且還充分幫助使用者保護自己的隱私和敏感資訊。TensorFlow Lite 目前仍處於“積極開發”狀態,目前僅有少量預訓練AI模型面世,比如MobileNet、用於計算機視覺物體識別的Inception v3、用於自然語言處理的Smart Reply,當然,TensorFlow Lite上也可以部署用自己的資料集定製化訓練的模型。

TensorFlow Lite可以與Android 8.1中釋出的神經網路API完美配合,即便在沒有硬體加速時也能呼叫CPU處理,確保模型在不同裝置上的執行。

640?wx_fmt=jpeg

模型相關的檔案

模型相關的檔案有很多型別,比如:Graph Definition, Checkpoints 以及 Frozen Graph。各種型別的資料都需要使用 Protocol Buffers(簡稱 ProtoBuff)來定義資料結構,有了這些 ProtoBuff 程式碼,你就可以使用工具來生成對應的 C 和 Python 或者其它語言的程式碼,方便裝載、儲存和使用資料。

ProtoBuff 的相關內容,可以從這個網址得到:

https://developers.google.cn/protocol-buffers/

Graph Def

關於 Graph Def(Graph Definition)檔案,有兩種格式。拓展名為 .pb 的是二進位制 binary 檔案;而 .pbtxt 格式的則是更具可讀性的文字檔案。但是,實際使用中,二進位制檔案有著相當高的執行效率和記憶體優勢。

Graph Def 是你訓練的模型的核心,它定義了 node 的關係結構,方便由其他的程序來讀取。比如下面這個 Graph Def 就定義了“矩陣 A 與矩陣 B 相乘得到矩陣 C”的描述。

node {
 name: "a"
 op: "matmul"
}

node {
 name: "b"
 op: "matmul"
 input: "a:0"
}

node {
 name: "c"
 op: "matmul"
 input: "a:0"
 output: "b:0"
}

Checkpoint

Checkpoint 檔案是來自 TensorFlow 圖的序列化變數。這個檔案當中沒有圖的結構,所以不會被解釋。在訓練學習的過程中,Checkpoint 檔案記錄了不同的 Iteration 中變數的取值。

Frozen Graph

用 Graph Def 和 Checkpoint 生成 Frozen Graph 的過程叫做“冷凍”。為什麼稱之為冷凍呢?我們知道,生成 Frozen Graph 所需要的量都是從 Checkpoint 當中得到的,那麼這個變數轉為常量的過程就被形象地稱之為“冷凍”了。

TensorFlow Lite 模型

TensorFlow Lite 所用的模型是使用 TOCO 工具從 TensorFlow 模型轉化而來的,來源就是經過冷凍生成的 Frozen Graph。假如你已經得到了一個“夠用”的模型了,而且你也沒有原始碼或者資料來重新進行訓練,那麼就使用當前的模型吧,沒有任何問題。但如果你有原始碼和資料,直接使用 TOCO 工具進行模型轉化將會是最好的選擇。示例程式碼如下:

with tf.Session() as sess:
 tflite_model = tf.contrib.lite.toco_convert(sess.graph_def, [img], [out])
 open("converted_model.tflite","wb").write(tflite_model)

TensorFlow Lite 相容的公開模型

視訊中提到的相容性指南的連結為:

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/tf_ops_compatibility.md

在 TensorFlow Lite 中相容的模型是 Inception v3 和 MobileNets,Inception v3 主要用於驗證 ImageNet 資料集,這是一個被學界廣泛認定為圖片驗證指標的資料集。MobileNets 則是轉為移動裝置而設計的模型,具有低能耗的特徵,但相應的缺點就是準確度不如 Inception v3。

  • 第一部分,如何用 MobileNets 對影象分類:

https://codelabs.tensorflowers.cn/codelabs/tensorflow-for-poets/index.html 

第二部分,如何將第一部分生成的模型構建成一個 APK:

https://codelabs.tensorflowers.cn/codelabs/tensorflow-for-poets-2/index.html

現在我們對 TensorFlow Lite 的概念和模型轉化有了認識,接下來講述 TensorFlow Lite 模型檔案格式,並可視化以幫助大家記憶理解,也包含 TensorFlow Lite 的具體載入執行過程,並給出關鍵的資料結構描述,我們先來看段視訊:

看完視訊,我們一起總結回顧一下:

首先,我們需要在PC上設計、訓練出目標模型,並將其轉化成 TensorFlow Lite 的格式。接著,此格式檔案在 TensorFlow Lite 中會被內建了 Neon 指令集的解析器載入到記憶體,並執行相應的計算。由於 TensorFlow Lite 對硬體加速介面良好的支援,開發者可以設計出效能更優的 App 供使用者使用。

我們先來看下關鍵的資料結構描述:

模型檔案格式

Model 結構體:模型的主結構

table Model {
   version: uint;
   operator_codes: [OperatorCode];
   subgraphs: [SubGraph];

   description: string;
   buffers: [Buffer]
}

其中operator_codes定義了整個模型的所有運算元,subgraphs定義了所有的子圖。子圖當中,第一個元素是主圖。buffers屬性則是資料儲存區域,主要儲存的是模型的權重資訊。

SubGraph 結構體:Model 中最重要的部分

table SubGraph {
   tensors: [Tensor];
   inputs: [int];
   outputs: [int];
   operators: [Operator];

   name: string;
}

tensors 定義了子圖的各個 Tensor,inputs  outputs 用索引的維護著子圖中 Tensor 與輸入輸出之間的對應關係。operators 定義了子圖當中的運算元。

Tensor 結構體:包含維度、資料型別、Buffer 位置等資訊

table Tensor {
   shape: [int];
   type: TensorType;
   buffer: uint;

   name: string;
}

buffer 以索引量的形式,給出了這個 Tensor 需要用到子圖的哪一個 buffer。

Operator 結構體:SubGraph 中最重要的結構體

table Operator {
   opcode_index: uint;
   inputs: [int];
   outputs: [int];

   ...
}

opcode_index 用索引方式指明該 Operator 對應了哪個運算元。 inputs  outputs 則是 Tensor 的索引值,指明該 Operator 的輸入輸出資訊。

解析器概況

那麼 TensorFlow Lite 的解析器又是如何工作的呢?

一開始,終端裝置會通過 mmap 以記憶體對映的形式將模型檔案載入客戶端記憶體中,其中包含了所有的 Tensor,Operator 和 Buffer 等資訊。出於資料使用的需要,TensorFlow Lite 會同時建立 Buffer 的只讀區域和分配可寫 Buffer 區域。

由於解析器中包含了集體執行計算的程式碼,這一部分被稱為 Kernel。模型中的各個 Tensor 會被載入為 TfLiteTensor 的格式並集中存放在 TfLiteContext 中。

每個 Tensor 的指標都指向了記憶體中的只讀 Buffer 區域或是一開始新分配的可寫入 Buffer 區域。

模型中的 Operator 被重新載入為 TfLiteNode,它包含輸入輸出的 Tensor 索引值。這些 Node 對應的操作符儲存於 TfLiteRegistration 中,它包含了指向 Kernel 的函式指標。OpResolver 負責維護函式指標的對應關係。

TensorFlow Lite 載入模型的過程中會確定執行 Node 的順序,然後依次執行。

大家如果想要更好掌握 TensorFlow Lite 的技術細節,一定要閱讀以下檔案:

  • lite/context.h

  • lite/model.h

  • lite/interpreter.h

  • lite/kernels/register.h

其他

TensorFlow Lite 的程式碼位置

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite

模型的模式檔案位於:

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/schema/schema.fbs

輕輕一掃  歡迎關注~

640?wx_fmt=jpeg

640?wx_fmt=gif