当前位置: 首页 > 知识库问答 >
问题:

TFlite解释器在为量化模型分配张量时引发运行时错误。涉及scale_diff和output_scale的断言失败

东郭海阳
2023-03-14

亲爱的开发人员和NN爱好者,我已经量化了一个模型(8位训练后量化),我正在尝试使用tflite Interpter对得到的模型进行推理。

在某些情况下,解释器运行正常,我可以按预期对量化模型进行推理,输出与原始模型足够接近。因此,我的设置似乎是正确的。然而,根据具体的量化模型,我经常遇到以下运行时错误。

Traceback (most recent call last):
    File ".\quantize_model.py", line 328, in <module>
        interpreter.allocate_tensors()
    File "---path removed---tf-nightly_py37\lib\site-packages\tensorflow\lite\python\interpreter.py", line 243, in allocate_tensors
        return self._interpreter.AllocateTensors()
RuntimeError: tensorflow/lite/kernels/kernel_util.cc:154 scale_diff / output_scale <= 0.02 was not true.Node number 26 (FULLY_CONNECTED) failed to prepare.

由于误差似乎与偏差的比例有关,我使用偏差正则化器重新训练了原始模型。但是,错误仍然存在。

你对如何避免这个错误有什么建议吗?我应该以不同的方式训练或设计模型吗?是否可以抑制此错误并照常继续(即使精度降低)?

我已经使用Netron从量化tflite模型中提取了有关“节点26”的一些细节:

*Node properties ->
type: FullyConnected, location:26. *Attributes asymmetric_quantization: false, fused_activation: NONE, keep_num_dims: false, weights_format: DEFAULT. 
*Inputs ->
input. name: functional_3/tf_op_layer_Reshape/Reshape;StatefulPartitionedCall/functional_3/tf_op_layer_Reshape/Reshape
type: int8[1,34]
quantization: 0 ≤ 0.007448929361999035 * (q - -128) ≤ 1.8994770050048828
location: 98
weights. name: functional_3/tf_op_layer_MatMul_54/MatMul_54;StatefulPartitionedCall/functional_3/tf_op_layer_MatMul_54/MatMul_54
type: int8[34,34]
quantization: -0.3735211491584778 ≤ 0.002941111335530877 * q ≤ 0.1489555984735489
location: 42
[weights omitted to save space]
bias. name: functional_3/tf_op_layer_AddV2_93/AddV2_3/y;StatefulPartitionedCall/functional_3/tf_op_layer_AddV2_93/AddV2_3/y
type: int32[34]
quantization: 0.0002854724007192999 * q
location: 21
[13,-24,-19,-9,4,59,-18,9,14,-15,13,6,12,5,10,-2,-14,16,11,-1,12,7,-4,16,-8,6,-17,-7,9,-15,7,-29,5,3]
*outputs ->
output. name: functional_3/tf_op_layer_AddV2/AddV2;StatefulPartitionedCall/functional_3/tf_op_layer_AddV2/AddV2;functional_3/tf_op_layer_Reshape_99/Reshape_99/shape;StatefulPartitionedCall/functional_3/tf_op_layer_Reshape_99/Reshape_99/shape;functional_3/tf_op_layer_Reshape_1/Reshape_1;StatefulPartitionedCall/functional_3/tf_op_layer_Reshape_1/Reshape_1;functional_3/tf_op_layer_AddV2_93/AddV2_3/y;StatefulPartitionedCall/functional_3/tf_op_layer_AddV2_93/AddV2_3/y
type: int8[1,34]
quantization: -0.46506571769714355 ≤ 0.0031077787280082703 * (q - 22) ≤ 0.32741788029670715
location: 99

共有2个答案

严亦
2023-03-14

我有另一种方法可以克服我的问题并与你们分享。根据量化文件,激活的量化仅支持Relu和标识。如果我们在Relu激活之前错过biasAdd,它可能会失败,因此,我们可以通过tf将层包装为一个标识来绕过它。标识。我已经尝试过了,它在不编辑cpp文件的情况下适用于我的案例。

沈永贞
2023-03-14

我找到了一个解决方法,包括手动修改量化的tflite模型。这是触发相关运行时错误的文件(tensorflow/lite/kernels/kernel_utils.cc):

// TODO(ahentz): The following conditions must be guaranteed by the training pipeline.
...
const double scale_diff = std::abs(input_product_scale - bias_scale);
const double output_scale = static_cast<double>(output->params.scale);
TF_LITE_ENSURE(context, scale_diff / output_scale <= 0.02);

评论明确指出,模型量化中的一些功能仍需完成。失败条件与偏差的规模有关。我验证了我的量化模型不满足上述约束。为了手动修复量化模型,可以执行以下步骤:

  1. 使用Netron打开量化模型,找到引起故障的节点(在我的例子中是节点26)

当然,这个解决方案只是一个临时的变通方法,有用,直到tenstorflow的量化器中的代码被纠正。

 类似资料:
  • 分配张量时如何解决ResourceExhaustedError: OOM的问题? ResourceExhaustedError(回溯见上文):使用形状分配张量时OOM[10000,32,28,28] 我包含了几乎所有的代码 错误中引用的行是: 快跑。。在训练循环中 下面列出了我从调试器输出复制的更多错误(有更多行,但我认为这些是主要错误,其他错误是由此引起的…) tensorflow.python

  • 我制作了自己的AlexNet实现,其中少了一个完全连接的层,用于对102类花卉进行分类。我的培训集由11000个图像组成,而验证和培训集各有3000个图像。我以HDF5格式编写了这三个数据集,并将它们存储在磁盘上。我重新加载了它们,并尝试使用8和75个纪元的批次通过网络传递图像。但是,出现了内存错误 我已经尝试将批量大小减少到8,并将尺寸减少到400x400(原来是500x500),但没有用 te

  • 我试图使用tenstorflow联邦学习工具为我的数据。我有两个数据集(dataset和dataset2)从csv文件中获得,其中前15列是功能,最后一列是标签。我将我的熊猫数据帧转换为tenstorflow数据集。然而,在迭代器处,有一个奇怪的类型错误。我是新来的tenrflow和发送代码:任何帮助将不胜感激。提前感谢。 错误消息如下: 回溯(最近一次调用):文件“/home/affectech

  • 我正在使用Firebase MLKIT在本地应用程序中实现“. tflite”模型。model.tflite文件大小约为132 MB。它显示了错误原因: onFailure:java.lang.IllegalStateException:内部错误:准备张量分配时意外失败:此解释器不支持常规的张量流操作。确保在推理之前调用Flex委托。节点号17(Flex)准备失败。 和错误消息: 本地模型加载失败

  • 根据来自的说明,我已将tensorflow推理图转换为tflite模型文件(*.tflite)https://www.tensorflow.org/lite/convert. 我在我的GPU服务器上测试了tflite模型,该服务器有4个Nvidia TITAN GPU。我使用了tf.lite。解释器加载并运行tflite模型文件。 它与以前的张量流图一样工作,然而,问题是推理变得太慢了。当我检查原

  • 我有这个代码,用于使用tenorflow hub的预训练通用编码器构建语义搜索引擎。我无法转换为tlite。我已将模型保存到我的目录中。 导入模型: 根据数据训练模型: 保存模型: 保存工作正常,但当我转换到tflite它给出错误。 转换码: 错误: