不理解将 .pb 转换为 ff-lite 时的平均值和标准开发值

Dont understand mean values and std dev values when convertig .pb to ff-lite

本文关键字:平均值 标准 开发 pb 转换 ff-lite 不理解      更新时间:2023-10-16

我正在尝试量化存储在.pb中的张量流图。 网络的输入是一个矩阵,每行都用平均值 0 和标准 1 进行归一化。 我想创建一个 tensorflow-lite 模型量化以更快地识别干扰。 我不知道如何将输入传递给行转换。它只是一个值吗?具有 64 个值的向量?它是如何通过的?

该模型在没有量化的情况下转换得很好。

tflite_convert 
--output_file=model_simple_weight_q.tflite 
--graph_def_file=model_simple.pb 
--inference_type=QUANTIZED_UINT8 
--input_arrays=input 
--output_arrays=LogSoftmax 
--mean_values= # dont know  
--std_dev_values=# dont know

例如,如果我传递两个单个值,--mean_values=127 和 --std_dev_values=128。只是为了知道会发生什么,我收到以下错误:

F tensorflow/lite/toco/graph_transformations/resolve_constant_gather.cc:108] Check failed: coords_array.data_type == ArrayDataType::kInt32 Only int32 indices are supported
Aborted (core dumped)

您看到的错误与平均值/std_dev值无关。这是一般转换图形时的错误。它说在你的一个图操作中,索引用于tf.gather(或者可能是切片(,并且它有一个不int32的类型,但这是唯一支持的索引类型。

不幸的是,TFLite 转换错误通常不会告诉您导致错误的源代码,因此您必须做出明智的猜测。

关于平均值/std_dev值,我建议你看看这个答案: https://stackoverflow.com/a/58096430/834565

由于输入的每一行都以平均值 0 和标准 1 归一化,因此您应该给出--mean_values=0--std_dev_values=1。此外,当您进行"虚拟后跟踪量化"时,您需要为激活函数提供最小和最大范围。您需要提供 --default_ranges_min= 和 --default_ranges_max= 。

由于张量流没有提供关于如何计算激活范围的非常清晰的描述,因此最好使用少量校准数据进行"训练后全整数量化" - 这里 .在该方法中,使用校准图像计算激活函数的范围。

问候