文章插图
import tensorflow as tf# 使用低级API tf.* 创建一个模型class Squared(tf.Module): @tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.float32)]) def __call__(self, x): return tf.square(x)model = Squared()# 运行模型# result = Squared(5.0) # 25.0# 生成 SavedModel# tf.saved_model.save(model, "saved_model_tf_dir")concrete_func = model.__call__.get_concrete_function()# TF model to TFLite# 注意,对于TensorFlow 2.7之前的版本,# from_concrete_functions API能够在只有第一个参数的情况下工作:# > converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func], model)tflite_model = converter.convert()# 保存TFLite模型with open('model.tflite', 'wb') as f: f.write(tflite_model)转换RNN模型为TFLite由于 TensorFlow 中 RNN API 的变体很多,我们的转换方式包括两个方面:
- 为标准 TensorFlow RNN API(如 Keras LSTM)提供原生支持 。这是推荐的选项 。
- 提供 进入转换基础架构的接口,用于 插入用户定义的 RNN 实现并转换为 TensorFlow Lite 。我们提供了几个有关此类转换的开箱即用的示例,这些示例使用的是 lingvo 的 LSTMCellSimple和 LayerNormalizedLSTMCellSimpleRNN 接口 。
运行推理TensorFlow Lite 推理通常遵循以下步骤:
- 加载模型
- 转换数据
- 运行推断
- 解释输出
文章插图
文章插图
# -*- coding:utf-8 -*-# Author:凌逆战 | Never# Date: 2022/10/12""""""import tensorflow as tfclass TestModel(tf.Module): def __init__(self): super(TestModel, self).__init__() @tf.function(input_signature=[tf.TensorSpec(shape=[1, 10], dtype=tf.float32)]) def add(self, x): # 为方便起见,将输出命名为“result” 。 return {'result': x + 4}saved_model_path = './saved_models'tflite_path = 'content/test_variable.tflite'# 保存模型model = TestModel()# 您可以省略signatures参数,并且将创建一个名为'serving_default'的默认签名名 。tf.saved_model.save(model, saved_model_path, signatures={'my_signature': model.add.get_concrete_function()})# TF Model to TFLiteconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_path)tflite_model = converter.convert()with open(tflite_path, 'wb') as f: f.write(tflite_model)# 加载TFLite模型interpreter = tf.lite.Interpreter(tflite_path)# 模型中只定义了一个签名,因此默认情况下它将返回签名# 如果有多个签名,我们就可以传递这个名字my_signature = interpreter.get_signature_runner()# my_signature 可以通过输入作为参数调用output = my_signature(x=tf.constant([1.0], shape=(1, 10), dtype=tf.float32))# 'output'是包含推理所有输出的字典,在本例中,我们只有一个输出'result' 。print(output['result'])
经验总结扩展阅读
- 幼师好还是护士好 哪个更吃香
- 2023年2月6日是买衣服的黄道吉日吗 2023年2月6日买衣服黄道吉日
- 2023年2月6日适合制作寿衣吗 2023年2月6日是制作寿衣吉日吗
- 2023年2月6日买鸡黄道吉日 2023年2月6日买鸡行吗
- 2023年2月6日买牛好不好 2023年2月6日买牛吉日一览表
- 2023年2月6日画画好不好 2023年农历正月十六画画吉日
- 2023年10月1日入学行吗 2023年农历八月十七入学吉日
- 2023年10月1日是举办成人仪式的黄道吉日吗 2023年10月1日举办成人仪式吉日一览表
- 2023年10月1日上学好不好 2023年10月1日适合上学吗
- 2023年10月1日清扫房屋好吗 2023年农历八月十七宜清扫房屋吗