1. 程式人生 > >tensorflow 19: tflite 概念理解

tensorflow 19: tflite 概念理解

概述

學術界對精度、自由度的要求和工業界對速度、精簡度的要求形成了反差,這就使得越來越多的框架開始把training和inference分開,各公司都開始針對移動裝置紛紛推出高效能inference庫。

tflite

tflite其實就是谷歌自己的一個輕量級推理庫。主要用於移動端。之前的tensorflow mobile那一套到2019年就不再維護了。

tflite使用的思路主要是從預訓練的模型轉換為tflite模型檔案,拿到移動端部署。

tflite的源模型可以來自tensorflow的saved model或者frozen model,也可以來自keras。
在這裡插入圖片描述

tflite做了哪些優化

  • 用Flatbuffer序列化模型檔案,這種格式磁碟佔用少,載入快
  • 量化。這個特性是可以開關的,可以把float引數量化為uint8型別,模型檔案更小、計算更快。
  • 剪枝、結構合併和蒸餾。我也不是很確定,敢寫在這裡主要來自兩個官方檔案,具體連結在本文最下方參考資料裡。一個是《Model optimization》,這裡提到了優化模型用到了模型優化方法,另一個是《Converter command-line examples》,裡面一張對比優化前後的計算圖顯示tflite在轉換時確實進行了結構調整。但是這個特性沒有很多人講,有可能這方面tflite做的不是很多,只是淺嘗輒止。
  • 對NNAPI的支援。上三個特性都是轉換模型檔案的特性,這個是執行時的特性。也就是呼叫安卓底層的介面,把異構的計算能力利用起來。雖然 TFLite 基於 NNAPI,理論上是可以利用上各種運算晶片的,但目前還沒有很多運算晶片支援 NNAPI。

量化

對量化的理解主要來自《用 TensorFlow 壓縮神經網路》。

tflite的量化並不是全程使用uint8計算。而是儲存每層的最大和最小值,然後把這個區間線性分成 256 個離散值,於是此範圍內的每個浮點數可以用八位 (二進位制) 整數來表示,近似為離得最近的那個離散值。比如,最小值是 -3 而最大值是 6 的情形,0 位元組表示 -3,255 表示 6,而 128 是 1.5。

每個操作都先用整形計算,輸出時重新轉換為浮點型。下圖就是量化Relu的示意圖。
在這裡插入圖片描述 image

如果連續一串操作都有等價的浮點操作,則會有許多相鄰的量化/去量化操作。當發現這種模式之後,轉換程式會把相互抵消的那些操作移除,比如:

![image](90A59FFBA1A94CC3A03B9578D2CA3E8C)。

由於每層最大值最小值不一樣,所以沒法把整形從頭算到尾,中間還是有不少量化/去量化操作。

tfite的缺陷

TFLite 目前僅提供有限的運算元,主要以 CNN 中使用到的運算元為主,如卷積、池化等。
有可能遇到的情況就是,模型的某些運算元tflite不支援(比如反捲積),你可以自定義一個 TFLite 運算元,將其註冊在 TFLite 的 kernels 列表中,這樣編譯得到的 TFLite 庫就可以處理該運算元了。同時,在模型轉換時,還需要加上 --allow_custom_ops 選項,將 TFLite 預設不支援的運算元也保留在模型中。(本段來自《有道雲筆記是如何使用 TensorFlow Lite 的》)

tflite支援的運算元列表在《TensorFlow Lite & TensorFlow Compatibility Guide》這個頁面上。

如何將tensorflow模型檔案轉換為tflite檔案

本節來自《Tensorflow lite for 移動端安卓開發(二)——完整詳細過程訓練自己的模型》

生成float inference模型

cd /home/liuli/tensorflow
bazel build tensorflow/contrib/lite/toco:toco
bazel run --config=opt tensorflow/contrib/lite/toco:toco -- \
  --input_file=/home/liuli/work/Tensorflow/1_frozen.pb \
  --output_file=/home/liuli/work/Tensorflow/7_float.tflite \
  --inference_type=FLOAT \
  --input_shape=1,224,224,3 \
  --input_array=input \
  --output_array=MobilenetV1/Predictions/Reshape_1

生成Quant inference模型

cd /home/liuli/tensorflow
bazel build tensorflow/contrib/lite/toco:toco
bazel run --config=opt tensorflow/contrib/lite/toco:toco -- \
  --input_file=/home/liuli/work/Tensorflow/1_frozen.pb \
  --output_file=/home/liuli/work/Tensorflow/7.tflite \
  --input_format=TENSORFLOW_GRAPHDEF \
  --output_format=TFLITE \
  --inference_type=QUANTIZED_UINT8 \
  --input_shape=1,224,224,3 \
  --input_array=input \
  --output_array=MobilenetV1/Predictions/Reshape_1 \
  --default_ranges_min=0 \
  --default_ranges_max=6 \
  --std_value=127.5 \
  --mean_value=127.5

量化的效果

參考了《tflite現成的模型》,這個頁面是tensorflow的github。

float型別的tflite模型(未量化):
在這裡插入圖片描述

量化的效果:
在這裡插入圖片描述
看來還是要量化,否則呼叫太慢。這裡的結果看來量化的精度損失不大,但是網上有人測試效果差挺遠,所以要具體分析。

檢視輸入輸出節點

編譯:

Bazel build tensorflow/tools/graph_transforms:summarize_graph  (檢視模型結構,找出輸入輸出)

該命令檢視整個Tensorflow模型概況,使用命令如下,執行之後,得到自己整個網路結構,從中可以找到自己模型的輸入輸出,如下圖(模型比較亂。。。)

# “--in_graph=” 後面是模型儲存的位置
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=../mz_graph.pb

本節主要來自:《Tensorflow 模型轉 tflite ,在安卓端使用》

參考資料

官方文件

GEMM-通用矩陣乘法:

相關推薦

tensorflow 19 tflite 概念理解

概述 學術界對精度、自由度的要求和工業界對速度、精簡度的要求形成了反差,這就使得越來越多的框架開始把training和inference分開,各公司都開始針對移動裝置紛紛推出高效能inference庫。 tflite tflite其實就是谷歌自己的一個輕量級推理

Appium Python 二理論概念理解

應該 ams multi isp 結果 post move sessionid action 簡介 Appium 是一個開源的自動化測試工具,支持 iOS 平臺和 Android 平臺上的原生應用,web 應用和混合應用。 “移動原生應用”是指那些用 iOS 或者 Andr

TensorFlow(二)基本概念以及練習

ssi AR oss -a n) counter 全部 enter num 一:基本概念 1、使用圖(graphs)來表示計算任務 2、在被稱之為會話(Session)的上下文(context)中執行圖 3、使用tensor表示數據 4、通過變量(Variable)維護狀

【一起學原始碼-微服務】Ribbon 原始碼一Ribbon概念理解及Demo除錯

前言 前情回顧 前面文章已經梳理清楚了Eureka相關的概念及原始碼,接下來開始研究下Ribbon的實現原理。 我們都知道Ribbon在spring cloud中擔當負載均衡的角色, 當兩個Eureka Client互相呼叫的時候,Ribbon能夠做到呼叫時的負載,保證多節點的客戶端均勻接收請求。(這個有點類

深入理解TensorFlow架構設計與實現原理 3 基礎概念

1、程式設計正規化:資料流圖   宣告式程式設計與指令式程式設計的對比討論   資料流圖: tensorflow 1.2.02、資料載體:張量   張量:Tensor   稀疏張量:SparseTensor類,以鍵值對的形式表示高維稀疏資料,它包含indices、values

JavaEE互聯網輕量級框架整合開發(書籍)閱讀筆記(1)Mybatis和Hibernate概念理解

bat 特定 定義 理解 緩存 面向 ont span 等待 一、關鍵字說明: oop:面向對象 aop:面向切面 ioc:控制反轉 orm:對象關系映射 pojo:數據庫表映射的java實體類 二、常識說明:1.hibernate和mybatis都屬於持久層、orm

JavaEE互聯網輕量級框架整合開發(書籍)閱讀筆記(2)SSM+Redis概念理解

重復 技術 理解 size 從數據 一個 ron bat 互聯網 一、SSM+Redis的結構圖 在Java互聯網中,以Spring+SpringMVC+MyBatis(SSM)作為主流框架,SSM+Redis的結構圖如下: 二、下面介紹它們各自承擔的功能: 1.S

TensorFlow基礎概念

首先祝自己生日快樂!! 趁著大學最後的一點時間學習一點新的東西,希望自己能堅持下去。 這裡記錄一點這幾天學習中記錄下的一些概念以及注意點。 基礎概念 計算圖(graph) 這是TensorFlow中最為重要的概念,整個TensorFlow是一個通過計算圖的形式來

實驗目的 1、理解使用者與模式的概念,掌握oracle中使用者管理的基本方法 2、理解系統許可權、物件許可權的概念,掌握分配許可權的方法 3、理解角色的概念,掌握角色的應用方法 實驗內容 一、使用者

撰寫人——軟體二班——陳喜平 一、使用者管理與應用 1、檢視使用者與模式 show USER; 2、建立使用者 sqlplus sys/[email protected] as sysdba CREATE USER t16436220 IDENTIFIED B

概念理解boost::asio::定時器2

  多執行緒同步回撥#include <cstdio> #include <iostream> #include <boost/asio.hpp> #include <boost/thread.hpp> #include <boost/

TensorFlow 資料驗證能夠大規模理解、驗證和監控資料

文 / Clemens Mewald (產品經理) and Neoklis Polyzotis (研究科學家) 來源 | TensorFlow 公眾號 我們推出了 TensorFlow 資料驗證(TFDV),這是一個可以幫助您大規模地理解、驗證和監控 ML

《程式設計珠璣》程式碼之路19堆的概念和隱式堆實現

堆是用來表示元素集合的一種資料結構,它有兩個性質(大頂堆和小頂堆差異就一個符號,本文不詳細討論): 1:任何節點都小於或等於其子節點的值。 2:最多在最後一層和倒數第二層才有葉節點,而且儘可能靠左側分佈。 以上的性質,使得堆可以實現logn級別的插入和刪除操作,查詢最小值同樣也是logn

DL之Yolo系列深度學習實現目標檢測之Yolo系列的論文簡介、概念理解、思路配圖等詳細攻略

DL之Yolo系列:深度學習實現目標檢測之Yolo系列的論文簡介、概念理解、思路配圖等詳細攻略     Yolo系列的論文簡介 1、Yolo V1簡介   2、Yolo V2簡介   3、Yolo V3簡介   &

TensorFlow學習筆記01基礎概念

首先祝自己生日快樂!! 在這個時間點愉快地開始一個新的學習過程,希望自己能堅持下去。 首先了解一下TensorFlow中的一些基礎概念: 基礎概念 計算圖(graph) 這是TensorFlow中最為重要的概念,整個TensorFlow是一個通過計算圖的形式

tensorflow筆記流程,概念和簡單程式碼註釋

tensorflow是google在2015年開源的深度學習框架,可以很方便的檢驗演算法效果。這兩天看了看官方的tutorial,極客學院的文件,以及綜合tensorflow的原始碼,把自己的心得整理了一下,作為自己的備忘錄。 1.tensorflow

Java基礎(14)IO流—理解I/0概念和掌握相關類的作用(附有操作程式碼)

在Java中如果要進行輸出和輸入操作,就需要使用到IO流,例如第一次寫的語句System.out.println("hello,world")就是一個典型的輸出流。IO流是Java的重點知識,除了要理解輸入與輸出的概念,還需要多次編寫程式碼才能更好的理解。IO體系中涉及到的

tensorflow筆記流程,概念和簡單程式碼註釋【轉】

最近在學習tensorflow,看到寫的較好的部落格,會轉發過來,方便自己日後翻閱。 歡迎掃碼關注我的微信公眾號“人工智慧與影象處理”,本公眾號專注人工智慧與影象處理技術,並定期分享最前沿的專業訊息。 PS:CSDN部落格適合網頁看,公眾號適合手機看。

(教你徹底理解)網路流基本概念與演算法 最大流最小割

一.網路流:流&網路&割 1.網路流問題(NetWork Flow Problem): 給定指定的一個有向圖,其中有兩個特殊的點源S(Sources)和匯T(Sinks),每條邊有指定的容量(Capacity),求滿足條件的從S到T的最大流(Max

angularJS概念理解資料變化的傳播

資料變化的傳播 資料繫結有兩個方向: 資料 → 介面:我們使用scope物件的$watch()方法監聽資料的變化,來更新介面。介面 → 資料:我們在介面的DOM物件上監聽變化事件,來更新資料,並通過$apply()方法傳播變化。 上面的圖中,我們把ez-nameca

HEVC程式碼學習19MV、MVD、MVP概念解析

在程式碼閱讀中,可以看到MV、MVD、MVP三個概念,在開始學習的時候就很糊塗,一直買具體來看下,也找不到具體在哪裡有講解,現在來關注學習一下。 先來逗比一下,名詞解析: MVP——most valuable player,那MVD是什麼呢?most val