Tensorflow Lite从入门到精通( 四 )

更多细节请参考:Tensorflow官方文档 训练后动态范围量化
全整型量化整型量化是将32位浮点数 转换为8位定点数 。这样可以缩减模型大小并加快推理速度,这对低功耗设备(如微控制器)很有价值 。仅支持整数的加速器(如Edge TPU)也需要使用此数据格式 。
对于全整数量化,需要校准或估算模型中所有浮点张量的范围,即 (min, max) 。与权重和偏差等常量张量不同,模型输入、激活(中间层的输出)和模型输出等变量张量不能校准,除非我们运行几个推断周期 。因此,转换器需要一个有代表性的数据集来校准它们 。这个数据集可以是训练数据或验证数据的一个小子集(大约 100-500 个样本) 。请参阅下面的  representative_dataset() 函数 。
从 TensorFlow 2.7 版本开始,您可以通过签名指定代表数据集 , 示例如下:

Tensorflow Lite从入门到精通

文章插图
Tensorflow Lite从入门到精通

文章插图
def representative_dataset():  for data in dataset:    yield {      "image": data.image,      "bias": data.bias,    }如果给定的 TensorFlow 模型中有多个签名,则可以通过指定签名密钥来指定多个数据集:
Tensorflow Lite从入门到精通

文章插图
Tensorflow Lite从入门到精通

文章插图
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,      },    )您可以通过提供输入张量列表来生成代表性数据集:
Tensorflow Lite从入门到精通

文章插图
Tensorflow Lite从入门到精通

文章插图
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 版本开始,我们推荐使用基于签名的方法,而不是基于输入张量列表的方法,因为输入张量排序可以很容易地翻转 。
出于测试目的 , 您可以使用如下所示的虚拟数据集:
Tensorflow Lite从入门到精通

文章插图
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 可以通过该函数估算所有可变数据的动态范围(相比训练或评估数据集,此数据集不必唯一)为了支持多个输入,每个代表性数据点都是一个列表,并且列表中的元素会根据其索引被馈送到模型 。

推荐阅读