摘要:簡介是針對移動設備和嵌入式設備的輕量化解決方案,占用空間小,低延遲。支持浮點運算和量化模型,并已針對移動平臺進行優化,可以用來創建和運行自定義模型。此外,轉換的方式有兩種,的方式和命令行方式。生成為了將模型轉為,模型需要導出。
簡介
Tensorflow Lite是針對移動設備和嵌入式設備的輕量化解決方案,占用空間小,低延遲。Tensorflow Lite在android8.1以上的設備上可以通過ANNA啟用硬件加速。
支持浮點運算和量化模型,并已針對移動平臺進行優化,可以用來創建和運行自定義模型。開發者也可以在模型中添加自定義操作。
FlatBuffer格式
具有在移動設備運行更快的內核解釋器
支持通過Tensorflow訓練好的模型轉換為Tensorflow Lite格式(pd,h5等都可以)
當支持所有優化操作時,模型小于300k,當僅支持inception v3和mobilenet模型優化時,模型小于200k
預訓練模型:
inception v3:用于目標檢測
MobileNets:專門針對移動端的模型,具有低延遲,高速度,低內存,可用于圖像識別,目標檢測,圖像分割,但是精度小于inception v3
量化版本的MobileNets,通過將float-32轉為int-8,在CPU上擁有更快的速度
支持java,c++API
以上談到的預訓練模型基于ImageNet數據集訓練,支持1000種類別。如果此數據集不能滿足你的項目需要,你需要準備自己的數據集和標簽,使用遷移學習重新訓練模型。
模型結構Tensorflow Lite模型的數據格式與Tensorflow桌面端不同,需要使用Tensorflow Lite轉換為.tflite格式,然后應用到移動端。
模型結構:
java-API:包裝C++API,以便在android上使用java調用
C++-API:加載Tensorflow Lite模型和解釋器
解釋器:執行模型一系列核心操作,支持選擇內核加載。全部加載300kb,不加載只有100kb
在android8.1以上設備,可通過相關api進行硬件加速(硬件支持的情況下),否則在CPU執行
轉換模型格式Tensorflow Lite轉換器支持以下格式:
使用python API執行SavedModel保存的模型文件
tf.keras保存的.h5模型文件
轉換后的GraphDef文件
轉換GraphDef文件Tensorflow模型一般保存為.pd或.pdtxt格式的文件,要轉換為Tensorflow Lite支持的文件,首先需要進行frozen操作。此操作處理多個不同格式的文件:
tf.GraphDef(pd,pdtxt):圖文件,包含操作,張量,變量的定義
checkpoint(.ckpt):包含變量,不包含解釋器
tensorflow lite(.tflite):序列化的FlatBuffer文件,包含所有需要的文件
checkpoint文件包含訓練權重,tf.graphdef文件包含圖結構。凍結操作就是將上述文件進行合并操作
使用命令行,執行該操作的示例如下:
freeze_graph --input_graph=/demo/mobilenet_v1_224.pd --input_checkpoint=/demo/checkpoints/mobilenet-1001.ckpt --input_binary=True --output_graph=/demo/frozen_mobilenet_v1_224.pd --output_node_names=/demo/MobileNetV1/Predictions/Reshape_1
input_binary:讀取的文件是否是二進制文件,如:pd和pdtxt文件
android端使用Tensorflow Lite可以使用android studio和源碼編譯兩種方式,此處我們介紹第一種(由于你懂的原因,開vpn會比較順利些)。
安裝android studio
SDK大于26,NDK大于14
導入工程項目,路徑:tensorflow/lite/examples
默認使用mobilenet模型,如要使用inception模型,先下載模型文件并拷貝至asset文件夾,然后修改Camera2BasicFragment文件:
classifier = new ImageClassifierQuantizedMobileNet(getActivity())改為:
classifier = new ImageClassifierFloatInception(getActivity())
上圖是Tensorflow Lite轉換器的工作流程,清晰明了,就不做過多介紹了。此外,轉換的方式有兩種,python api的方式和命令行方式。
從Session中導出GraphDef使用tf.Session將Tensorflow模型轉為Tensorflow Lite模型
import tensorflow as tf img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3)) var = tf.get_variable("weights", dtype=tf.float32, shape=(1, 64, 64, 3)) val = img + var out = tf.identity(val, name="out") with tf.Session() as sess: sess.run(tf.global_variables_initializer()) converter = tf.lite.TFLiteConverter.from_session(sess, [img], [out]) tflite_model = converter.convert() open("converted_model.tflite", "wb").write(tflite_model)從file中導出GraphDef
以下代碼展示怎樣將.pd或.pdtxt文件轉為Tensorflow Lite模型支持的FlateBuffer格式文件。
import tensorflow as tf graph_def_file = "/path/to/Downloads/mobilenet_v1_1.0_224/frozen_graph.pb" input_arrays = ["input"] output_arrays = ["MobilenetV1/Predictions/Softmax"] converter = tf.lite.TFLiteConverter.from_frozen_graph( graph_def_file, input_arrays, output_arrays) tflite_model = converter.convert() open("converted_model.tflite", "wb").write(tflite_model)將SaveModle導出
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) tflite_model = converter.convert() open("converted_model.tflite", "wb").write(tflite_model)tf.keras文件導出
import tensorflow as tf converter = tf.lite.TFLiteConverter.from_keras_model_file("keras_model.h5") tflite_model = converter.convert() open("converted_model.tflite", "wb").write(tflite_model)量化模型
import tensorflow as tf img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3)) const = tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.]) val = img + const out = tf.fake_quant_with_min_max_args(val, min=0., max=1., name="output") with tf.Session() as sess: converter = tf.lite.TFLiteConverter.from_session(sess, [img], [out]) converter.inference_type = tf.lite.constants.QUANTIZED_UINT8 input_arrays = converter.get_input_arrays() converter.quantized_input_stats = {input_arrays[0] : (0., 1.)} # mean, std_dev tflite_model = converter.convert() open("converted_model.tflite", "wb").write(tflite_model)TensorFlow Lite Python解釋器
代碼展示如何使用Tensorflow Lite解釋器讀取.tflite文件。
import numpy as np import tensorflow as tf # 加載模型并分配張量 interpreter = tf.lite.Interpreter(model_path="converted_model.tflite") interpreter.allocate_tensors() # 獲取輸入輸出張量 input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # 隨機生成測試數據,測試模型輸出 input_shape = input_details[0]["shape"] input_data = np.array(np.random.random_sample(input_shape), dtype=np.float32) interpreter.set_tensor(input_details[0]["index"], input_data) interpreter.invoke() output_data = interpreter.get_tensor(output_details[0]["index"]) print(output_data)Tensorflow2.0轉換器使用
如圖所示,Tensorflow2.0與之前相比,少了凍結graph模塊,增加了Concrete Fn。
生成concrete Fn為了將Tensorflow2.0模型轉為Tensorflow Lite,模型需要導出concrete Fn。這是因為Tensorflow2.0中,eager execution是默認設置,雖然調試更加便利,但是它沒有保存圖,因為不能直接應用到移動設備。不過,可以使用tf.function包裝,這樣保存的模型就包含圖,可以轉換為Tensorflow Lite所需要的FlatBuffer格式文件。
class BasicModel(tf.Module): def __init__(self): self.const = None @tf.function def pow(self, x): if self.const is None: self.const = tf.Variable(2.) return x ** self.const
concrete Fn聲明的圖可以被轉換為Tensorflow Lite模型或者使用SaveModel導出。為了導出此方法,需要聲明signature,使用方法如下:
在tf.function中聲明input_signature
將tf.TensorSpec傳值給get_concrete_funtion
將input傳值給get_concrete_funtion
import tensorflow as tf root = tf.Module() # 初始化一次變量值 root.var = None @tf.function def exported_function(x): if root.var is None: root.var = tf.Variable(tf.random.uniform([2, 2])) root.const = tf.constant([[37.0, -23.0], [1.0, 4.0]]) root.mult = tf.matmul(root.const, root.var) return root.mult * x root.func = exported_function concrete_func = root.func.get_concrete_function( tf.TensorSpec([1, 1], tf.float32))Python api執行the TensorFlow Lite converter
Tensorflow2.0中轉換Tensorflow Lite模型使用tf.lite.TFLiteConverter.from_concrete_function(),示例如下:
import tensorflow as tf # 創建模型 root = tf.train.Checkpoint() root.v1 = tf.Variable(3.) root.v2 = tf.Variable(2.) root.f = tf.function(lambda x: root.v1 * root.v2 * x) # 保存模型 export_dir = "/tmp/test_saved_model" input_data = tf.constant(1., shape=[1, 1]) to_save = root.f.get_concrete_function(input_data) tf.saved_model.save(root, export_dir, to_save) # 加載模型并獲取concrete fn. model = tf.saved_model.load(export_dir) concrete_func = model.signatures[ tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY] # 設置input shape concrete_func.inputs[0].set_shape(input_data.shape) # 轉換模型 converter = tf.lite.TFLiteConverter.from_concrete_function(concrete_func) tflite_model = converter.convert()TensorFlow Lite 推斷
TensorFlow Lite推斷一般執行以下步驟:
加載.tflite模型
處理數據以適應模型input
調用API,創建解析器,運行模型
獲取模型輸出結果
如何選擇模型如圖所示,大模型高精度,高延遲;小模型低精度,低延遲,模型的選擇需要根據你的項目需求進行選擇。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19975.html
好的,下面是一篇關于TensorFlow嵌入式編程技術的文章。 TensorFlow是一種流行的機器學習框架,它可以用于訓練和部署深度神經網絡。然而,TensorFlow通常被視為一個大型的、需要高性能計算機的框架,這使得它在嵌入式系統上的應用變得困難。但是,最近的TensorFlow版本已經開始支持嵌入式設備,這使得它可以在諸如智能手機、智能家居設備和嵌入式系統等小型設備上運行。 在本文中,...
好的,下面是一篇關于TensorFlow量化訓練的編程技術類文章。 TensorFlow量化訓練是一種優化模型大小和性能的技術,它通過減少模型中參數的精度來實現這一目標。在這篇文章中,我們將介紹如何使用TensorFlow實現量化訓練,并探討它如何提高模型的性能和效率。 首先,讓我們來了解一下TensorFlow量化訓練的基本概念。量化訓練是一種將模型參數從浮點數轉換為定點數的技術。在這種情況...
摘要:如何進行操作本文將介紹在有道云筆記中用于文檔識別的實踐過程,以及都有些哪些特性,供大家參考。年月發布后,有道技術團隊第一時間跟進框架,并很快將其用在了有道云筆記產品中。微軟雅黑宋體以下是在有道云筆記中用于文檔識別的實踐過程。 這一兩年來,在移動端實現實時的人工智能已經形成了一波潮流。去年,谷歌推出面向移動端和嵌入式的神經網絡計算框架TensorFlowLite,將這股潮流繼續往前推。Tens...
閱讀 2851·2021-09-22 15:43
閱讀 4686·2021-09-06 15:02
閱讀 845·2019-08-29 13:55
閱讀 1679·2019-08-29 12:58
閱讀 3061·2019-08-29 12:38
閱讀 1206·2019-08-26 12:20
閱讀 2264·2019-08-26 12:12
閱讀 3311·2019-08-23 18:35