Tensorflow Lite从入门到精通( 二 )


文章插图
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 的变体很多,我们的转换方式包括两个方面:

  1. 为标准 TensorFlow RNN API(如 Keras LSTM)提供原生支持 。这是推荐的选项 。
  2. 提供 进入转换基础架构的接口,用于 插入用户定义的 RNN 实现并转换为 TensorFlow Lite 。我们提供了几个有关此类转换的开箱即用的示例,这些示例使用的是 lingvo 的 LSTMCellSimple和 LayerNormalizedLSTMCellSimpleRNN 接口 。
Tensorflow官方提供了一个一个非常棒的案例:Keras LSTM fusion Codelab.ipynb
运行推理TensorFlow Lite 推理通常遵循以下步骤:
  1. 加载模型
  2. 转换数据
  3. 运行推断
  4. 解释输出
import numpy as npimport tensorflow as tf# 加载TFLite模型并分配张量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']  # 获取输入的shapeinput_data = np.array(np.random.random_sample(input_shape), dtype=np.float32)interpreter.set_tensor(input_details[0]['index'], input_data)  # 输入给模型interpreter.invoke()  # 运行# 函数`get_tensor()`返回张量数据的副本# 使用`tensor()`来获得一个指向这个张量的指针output_data = interpreter.get_tensor(output_details[0]['index'])print(output_data)定义了Signature的TFLite 推理
Tensorflow Lite从入门到精通

文章插图
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'])

经验总结扩展阅读