Tensorflow Lite从入门到精通( 六 )


文章插图
def representative_dataset():    for _ in range(100):      data = np.random.rand(1, 244, 244, 3)      yield [data.astype(np.float32)]1、模型整型量化,输入输出还是浮点
启动默认的 optimizations 只能量化固定参数(如:权重),但是模型输入/输出 和层之间的状态值 依然是浮点型的,要量化可变中间值,您需要提供 python/tf/lite/RepresentativeDataset?hl=zh-cn" rel="external nofollow noreferrer">RepresentativeDataset 。这是一个生成器函数,它提供一组足够大的输入数据来代表典型值 。converter 可以通过该函数估算所有可变数据的动态范围(相比训练或评估数据集,此数据集不必唯一)为了支持多个输入,每个代表性数据点都是一个列表,并且列表中的元素会根据其索引被馈送到模型 。
import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_keras_model(model)# 启动默认的 optimizations 来量化所有固定参数(权重)converter.optimizations = [tf.lite.Optimize.DEFAULT]# 要量化可变数据(模型输入/输出 和层之间的中间体),提供 RepresentativeDataset,来估算所有可变数据的动态范围converter.representative_dataset = representative_data_gentflite_model_quant = converter.convert()现在,所有权重和可变数据都已量化,并且与原始 TensorFlow Lite 模型相比,该模型要小得多 。
但是,为了与传统上使用浮点模型输入和输出张量的应用保持兼容,TensorFlow Lite 转换器将模型的输入和输出张量保留为浮点,这通常对兼容性有利,但它无法兼容执行全整形运算的设备(如 Edge TPU) 。
interpreter = tf.lite.Interpreter(model_content=tflite_model_quant)input_type = interpreter.get_input_details()[0]['dtype']print('input: ', input_type)    # <class 'numpy.float32'>output_type = interpreter.get_output_details()[0]['dtype']print('output: ', output_type)  # <class 'numpy.float32'>2、全整型量化
为了量化输入和输出张量,我们需要使用一些附加参数再次转换模型:
converter = tf.lite.TFLiteConverter.from_keras_model(model)converter.optimizations = [tf.lite.Optimize.DEFAULT]    # 先启动默认的optimizations将模型权重进行量化converter.representative_dataset = representative_data_gen  # 使用代表数据集量化模型中间值# 如果有任何的 ops不能量化,converter 将抛出错误converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]# 将输入和输出tensors设置为int8 类型converter.inference_input_type = tf.int8   # or tf.uint8converter.inference_output_type = tf.int8  # or tf.uint8tflite_model_quant = converter.convert()现在我们可以看到输入和输出张量现在是整数格式:
interpreter = tf.lite.Interpreter(model_content=tflite_model_quant)input_type = interpreter.get_input_details()[0]['dtype']print('input: ', input_type)    # <class 'numpy.int8'>output_type = interpreter.get_output_details()[0]['dtype']print('output: ', output_type)  # <class 'numpy.int8'>我们来整一个栗子,您将从头开始训练一个 MNIST 模型、将其转换为 TensorFlow Lite 文件,并使用训练后整型量化 。最后,将检查转换后模型的准确率并将其与原始浮点模型进行比较 。

经验总结扩展阅读