日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tensorflow2.0(Keras)转换TFlite

發(fā)布時間:2024/4/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tensorflow2.0(Keras)转换TFlite 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Tensorflow 2.0(Keras)轉(zhuǎn)換TFlite

目錄

Tensorflow 2.0(Keras)轉(zhuǎn)換TFlite

1. TensorFlow Lite 指南

(1)TensorFlow Lite 轉(zhuǎn)換器

(2)轉(zhuǎn)換量化模型

(3)兼容的算子:Compatible operations

2. 轉(zhuǎn)換腳本(Python版本)


1. TensorFlow Lite 指南

(1)TensorFlow Lite 轉(zhuǎn)換器

https://tensorflow.google.cn/lite/guide/ops_select

為了能夠轉(zhuǎn)換包含 TensorFlow 運算符的 TensorFlow Lite 模型,可使用位于?TensorFlow Lite 轉(zhuǎn)換器?中的?target_spec.supported_ops?參數(shù)。target_spec.supported_ops?的可選值如下:

  • TFLITE_BUILTINS?- 使用 TensorFlow Lite 內(nèi)置運算符轉(zhuǎn)換模型。
  • SELECT_TF_OPS?- 使用 TensorFlow 運算符轉(zhuǎn)換模型。已經(jīng)支持的 TensorFlow 運算符的完整列表可以在白名單lite/delegates/flex/whitelisted_flex_ops.cc?中查看。

注意:target_spec.supported_ops?是之前 Python API 中的?target_ops。

我們優(yōu)先推薦使用?TFLITE_BUILTINS?轉(zhuǎn)換模型,然后是同時使用?TFLITE_BUILTINS,SELECT_TF_OPS?,最后是只使用?SELECT_TF_OPS。同時使用兩個選項(也就是?TFLITE_BUILTINS,SELECT_TF_OPS)會用 TensorFlow Lite 內(nèi)置的運算符去轉(zhuǎn)換支持的運算符。有些 TensorFlow 運算符 TensorFlow Lite 只支持部分用法,這時可以使用?SELECT_TF_OPS?選項來避免這種局限性。

(2)轉(zhuǎn)換量化模型

訓練后:針對特定 CPU 型號的量化模型

創(chuàng)建小模型的最簡單方法是在推理期間將權(quán)重量化為 8 位并“在運行中”量化輸入/激活。這具有延遲優(yōu)勢,但優(yōu)先考慮減小尺寸。

在轉(zhuǎn)換期間,將 optimizations 標志設(shè)置為針對大小進行優(yōu)化:

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE] tflite_quant_model = converter.convert()

訓練過程中:僅用于整數(shù)執(zhí)行的量化模型

僅用于整數(shù)執(zhí)行的量化模型獲得具有更低延遲,更小尺寸和僅針對整數(shù)加速器兼容模型的模型。目前,這需要訓練具有"假量化"節(jié)點的模型 。

轉(zhuǎn)換圖表:

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) 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()

對于全整數(shù)模型,輸入為 uint8。mean 和 std_dev values 指定在訓練模型時這些 UINT8 的值是如何值映射到輸入的浮點值。

mean 是 0 到 255 之間的整數(shù)值,映射到浮點數(shù) 0.0f。std_dev = 255 /(float_max - float_min)

對于大多數(shù)用戶,我們建議使用訓練后量化。我們正在研究用于后期訓練和訓練量化的新工具,我們希望這將簡化生成量化模型。

(3)兼容的算子:Compatible operations

https://tensorflow.google.cn/lite/guide/ops_compatibility


2. 轉(zhuǎn)換腳本(Python版本)

以下腳本實現(xiàn)將Tensorflow2.0(Keras)保存的模型(建議保存為*.h5的格式),轉(zhuǎn)換TFlite模型

建議版本信息:

tensorboard==2.0.2? ? ? ? ? ? ? ??
tensorflow-estimator==2.0.1? ? ? ? ? ? ? ? ? ?
tensorflow-gpu==2.0.0? ??

# -*- coding: utf-8 -*- """ # -------------------------------------------------------- # @Author : panjq # @E-mail : pan_jinquan@163.com # @Date : 2020-02-05 11:01:49 # -------------------------------------------------------- """ import os import numpy as np import glob import cv2 import argparse import tensorflow as tfprint("TF version:{}".format(tf.__version__)) physical_devices = tf.config.experimental.list_physical_devices('GPU') assert len(physical_devices) > 0, "Not enough GPU hardware devices available" tf.config.experimental.set_memory_growth(physical_devices[0], True)def converer_keras_to_tflite_v1(keras_path, outputs_layer=None, out_tflite=None):""":param keras_path: keras *.h5 files:param outputs_layer:param out_tflite: output *.tflite file:return:"""model_dir = os.path.dirname(keras_path)model_name = os.path.basename(keras_path)[:-len(".h5")]# 加載keras模型, 結(jié)構(gòu)打印model_keras = tf.keras.models.load_model(keras_path)print(model_keras.summary())# 從keras模型中提取fc1層, 需先保存成新keras模型, 再轉(zhuǎn)換成tflitemodel_embedding = tf.keras.models.Model(inputs=model_keras.input,outputs=model_keras.get_layer(outputs_layer).output)print(model_embedding.summary())keras_file = os.path.join(model_dir, "{}_{}.h5".format(model_name, outputs_layer))tf.keras.models.Model.save(model_embedding, keras_file)# converter = tf.lite.TocoConverter.from_keras_model_file(keras_file)converter = tf.lite.TFLiteConverter.from_keras_model_file(keras_file) # tf1.3# converter = tf.lite.TFLiteConverter.from_keras_model(model_keras) # tf2.0tflite_model = converter.convert()if not out_tflite:out_tflite = os.path.join(model_dir, "{}_{}.tflite".format(model_name, outputs_layer))open(out_tflite, "wb").write(tflite_model)print("successfully convert to tflite done")print("save model at: {}".format(out_tflite))def converer_keras_to_tflite_v2(keras_path, outputs_layer=None, out_tflite=None, optimize=False, quantization=False):""":param keras_path: keras *.h5 files:param outputs_layer: default last layer:param out_tflite: output *.tflite file:param optimize:return:"""if not os.path.exists(keras_path):raise Exception("Error:{}".format(keras_path))model_dir = os.path.dirname(keras_path)model_name = os.path.basename(keras_path)[:-len(".h5")]# 加載keras模型, 結(jié)構(gòu)打印# model = tf.keras.models.load_model(keras_path)model = tf.keras.models.load_model(model_path, custom_objects={'tf': tf}, compile=False)print(model.summary())if outputs_layer:# 從keras模型中提取層,轉(zhuǎn)換成tflitemodel = tf.keras.models.Model(inputs=model.input, outputs=model.get_layer(outputs_layer).output)# outputs = [model.output["bbox"],model.output["scores"]]# model = tf.keras.models.Model(inputs=model.input, outputs=outputs)print(model.summary())# converter = tf.lite.TocoConverter.from_keras_model_file(keras_file)# converter = tf.lite.TFLiteConverter.from_keras_model_file(keras_file) # tf1.3converter = tf.lite.TFLiteConverter.from_keras_model(model) # tf2.0prefix = [model_name, outputs_layer]# converter.allow_custom_ops = False# converter.experimental_new_converter = True""""https://tensorflow.google.cn/lite/guide/ops_select我們優(yōu)先推薦使用 TFLITE_BUILTINS 轉(zhuǎn)換模型,然后是同時使用 TFLITE_BUILTINS,SELECT_TF_OPS ,最后是只使用 SELECT_TF_OPS。同時使用兩個選項(也就是 TFLITE_BUILTINS,SELECT_TF_OPS)會用 TensorFlow Lite 內(nèi)置的運算符去轉(zhuǎn)換支持的運算符。有些 TensorFlow 運算符 TensorFlow Lite 只支持部分用法,這時可以使用 SELECT_TF_OPS 選項來避免這種局限性。"""# converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,# tf.lite.OpsSet.SELECT_TF_OPS]# converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]# converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]if optimize:print("weight quantization")# Enforce full integer quantization for all ops and use int input/outputconverter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]prefix += ["optimize"]else:converter.optimizations = [tf.lite.Optimize.DEFAULT]if quantization == "int8":converter.representative_dataset = representative_dataset_gen# converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]# converter.inference_input_type = tf.int8 # or tf.uint8# converter.inference_output_type = tf.int8 # or tf.uint8converter.target_spec.supported_types = [tf.int8]elif quantization == "float16":converter.target_spec.supported_types = [tf.float16]prefix += [quantization]if not out_tflite:prefix = [str(n) for n in prefix if n]prefix = "_".join(prefix)out_tflite = os.path.join(model_dir, "{}.tflite".format(prefix))tflite_model = converter.convert()open(out_tflite, "wb").write(tflite_model)print("successfully convert to tflite done")print("save model at: {}".format(out_tflite))def representative_dataset_gen():"""# 生成代表性數(shù)據(jù)集:return:"""image_dir = '/home/dm/panjinquan3/FaceDetector/tf-yolov3-detection/data/finger_images/'input_size = [320, 320]imgSet = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if os.path.isfile(os.path.join(image_dir, f))]for img_path in imgSet:orig_image = cv2.imread(img_path)rgb_image = cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB)image_tensor = cv2.resize(rgb_image, dsize=tuple(input_size))image_tensor = np.asarray(image_tensor / 255.0, dtype=np.float32)image_tensor = image_tensor[np.newaxis, :]yield [image_tensor]def parse_args():# weights_path = "../yolov3-micro.h5"weights_path = "../yolov3-micro_freeze_head.h5"parser = argparse.ArgumentParser()parser.add_argument("-c", "--model_path", help="model_path", default=weights_path, type=str)parser.add_argument("--outputs_layer", help="outputs_layer", default=None, type=str)parser.add_argument("-o", "--out_tflite", help="out tflite model path", default=None, type=str)parser.add_argument("-opt", "--optimize", help="optimize model", default=True, type=bool)parser.add_argument("-q", "--quantization", help="quantization model", default="float16", type=str)return parser.parse_args()def get_model(model_path):if not model_path:model_path = os.path.join(os.getcwd(), "*.h5")model_list = glob.glob(model_path)else:model_list = [model_path]return model_listdef unsupport_tflite_op():"""tf.shape,tf.Sizeerror: 'tf.Size' op is neither a custom op nor a flex operror: 'tf.Softmax' op is neither a custom op nor a flex op===========================================================tf.Softmax-->tf.nn.softmax"""passif __name__ == '__main__':args = parse_args()# outputs_layer = "fc1"outputs_layer = args.outputs_layermodel_list = get_model(args.model_path)out_tflite = args.out_tfliteoptimize = args.optimizequantization = args.quantizationfor model_path in model_list:converer_keras_to_tflite_v2(model_path, outputs_layer, out_tflite=out_tflite, optimize=optimize,quantization=quantization)# converer_keras_to_tflite_v1(keras_model, outputs_layer, out_tflite=None)

?

3. 常見問題解決方法


'tf.ResizeNearestNeighbor' op is neither a custom op nor a flex op
<unknown>:0: error: failed while converting: 'main': Ops that can be supported by the flex runtime (enabled via setting the -emit-select-tf-ops flag): ResizeNearestNeighbor.

解決方法:?https://panjinquan.blog.csdn.net/article/details/107360700


Quantization not yet supported for op: LEAKY_RELU

總結(jié)

以上是生活随笔為你收集整理的Tensorflow2.0(Keras)转换TFlite的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男人天堂最新网址 | 免费在线观看黄色 | 欧美日韩激情视频 | 日韩欧美成人网 | 国产婷婷一区二区三区 | 美丽姑娘免费观看在线观看 | 日日干天天 | 日本天堂免费 | 亚洲天堂自拍偷拍 | 成人在线视频免费观看 | 欧美激情一级 | 毛片免费播放 | 又粗又大又硬毛片免费看 | 国产成人精品一区二区三区无码熬 | 伊人久久大 | 国产成人精品一区在线播放 | 男女高h视频 | 娇小的粉嫩xxx极品 国产精品人人爽人人爽 | 欧美片网站yy | 国产视频91在线 | 日韩色资源 | gai免费观看网站外网 | 丰满熟女人妻一区二区三区 | 国产美女网 | 国语对白对话在线观看 | 67194在线免费观看 | 一区二区成人av | 亚洲 欧美 激情 另类 校园 | 国产日韩在线观看视频 | 男人操女人的软件 | 视色网站| 一级免费黄色片 | 美女扒开腿让男人 | 天堂国产一区二区三区 | 又污又黄又爽的网站 | 亚洲欧美一区二区三区情侣bbw | 国产亚洲性欧美日韩在线观看软件 | 99久久精品国产一区二区三区 | 无码无套少妇毛多18pxxxx | 久草热在线观看 | 天天摸天天做天天爽水多 | 熟女一区二区三区四区 | 手机看片福利一区 | 亚洲国产日韩在线观看 | 黑森林福利视频导航 | 中文字幕乱码人妻一区二区三区 | 久久伊人网站 | 捆绑裸体绳奴bdsm亚洲 | 色六月婷婷 | 国产无遮挡又黄又爽 | 我要操婊 | 免费搞黄网站 | 香蕉视频网站在线 | 人妻丰满熟妇无码区免费 | 国产精品美女视频 | 97在线播放 | 国产一级一片免费播放 | 午夜精品美女久久久久av福利 | 亚洲午夜色 | 在线的av| 国产精品久久久无码一区 | 强辱丰满人妻hd中文字幕 | 中文字幕亚洲无线码在线一区 | 91免费看国产 | 艹久久| 国产一国产二 | 欧美色综合网站 | 日韩国产欧美综合 | 88av在线播放 | xxxxx毛片 | 亚洲精品国产福利 | 制服丝袜av电影 | 欧美日韩一级黄色片 | julia一区| 欧美成人一级片 | 激情五月综合色婷婷一区二区 | 亚洲色图五月天 | 亚洲国产精品久久AV | 青娱乐超碰在线 | 天天躁日日躁狠狠躁伊人 | 韩国美女一区二区 | 日韩女优在线视频 | 精品无码一区二区三区爱欲 | 日韩一区二区在线观看视频 | 福利一区二区在线观看 | 亚洲精品v| av女人的天堂 | 毛茸茸成熟亚洲人 | 亚洲乱码一区二区 | av老司机久久 | 欧美国产日韩一区二区 | 日韩精品一区二区三区在线视频 | 啪啪五月天| 99久久精品免费视频 | 最新黄色av | 欧美成人精品欧美一级乱 | 国产美女视频91 | 四虎av影视 | 国产精彩视频一区 |