文章插图
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 文件,并使用训练后整型量化 。最后,将检查转换后模型的准确率并将其与原始浮点模型进行比较 。
经验总结扩展阅读
- 幼师好还是护士好 哪个更吃香
- 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年农历八月十七宜清扫房屋吗