更多细节请参考:Tensorflow官方文档 训练后动态范围量化
全整型量化整型量化是将32位浮点数 转换为8位定点数 。这样可以缩减模型大小并加快推理速度,这对低功耗设备(如微控制器)很有价值 。仅支持整数的加速器(如Edge TPU)也需要使用此数据格式 。
对于全整数量化,需要校准或估算模型中所有浮点张量的范围,即 (min, max) 。与权重和偏差等常量张量不同,模型输入、激活(中间层的输出)和模型输出等变量张量不能校准,除非我们运行几个推断周期 。因此,转换器需要一个有代表性的数据集来校准它们 。这个数据集可以是训练数据或验证数据的一个小子集(大约 100-500 个样本) 。请参阅下面的 representative_dataset() 函数 。
从 TensorFlow 2.7 版本开始,您可以通过签名指定代表数据集 , 示例如下:
文章插图
文章插图
def representative_dataset(): for data in dataset: yield { "image": data.image, "bias": data.bias, }如果给定的 TensorFlow 模型中有多个签名,则可以通过指定签名密钥来指定多个数据集:
文章插图
文章插图
def representative_dataset(): # Feed data set for the "encode" signature. for data in encode_signature_dataset: yield ( "encode", { "image": data.image, "bias": data.bias, } ) # Feed data set for the "decode" signature. for data in decode_signature_dataset: yield ( "decode", { "image": data.image, "hint": data.hint, }, )您可以通过提供输入张量列表来生成代表性数据集:
文章插图
文章插图
def representative_dataset(): for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100): yield [tf.dtypes.cast(data, tf.float32)]从 TensorFlow 2.7 版本开始,我们推荐使用基于签名的方法,而不是基于输入张量列表的方法,因为输入张量排序可以很容易地翻转 。
出于测试目的 , 您可以使用如下所示的虚拟数据集:
文章插图
文章插图
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 可以通过该函数估算所有可变数据的动态范围(相比训练或评估数据集,此数据集不必唯一)为了支持多个输入,每个代表性数据点都是一个列表,并且列表中的元素会根据其索引被馈送到模型 。
推荐阅读
- 请问去未知暗殿怎么走(复古未知暗殿从哪里进图解)
- 神州风闻录最新侍从强度排行是怎么样的
- iphone13几个摄像头_iphone13四个摄像头吗
- DevOps|从特拉斯辞职风波到研发效能中的不靠谱人干的荒唐事
- iqoo9参数详细_iqoo9参数配置
- 小米11 Lite参数配置_小米11 Lite参数详情
- 花心男人面相,可以从3个方面进行分析,助力快速了解
- 宝宝耳朵面相怎么看,可以从这4个方面来看
- fps值太低怎么办(fps从100多突然变低到10几)
- fps太低怎么办(fps从100多突然变低到10几)