首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ONNX模型中找到量化参数,从而将已经量化的tflite模型转换为ONNX?

如何在ONNX模型中找到量化参数,从而将已经量化的tflite模型转换为ONNX?
EN

Stack Overflow用户
提问于 2022-10-28 01:17:43
回答 1查看 44关注 0票数 0

我想要做的是将量化的tflite转换为ONNX,并使用tf2onnx直接使用ORT运行它。我试图转换的网络是YOLOv5,使用我自己的dataset + COCO进行预培训,模型已经成功转换。我确信这一点,因为我只是尝试加载ONNX模型(通过PRT)和tflite模型,从tflite解释器的输入和输出细节中保存量化参数,使用这些量化参数实际运行ONNX模型的会话,它实际上显示了运行我用Ultratycs训练的tflite模型/原始pt模型的相同结果。

问题是,在tflite的情况下,可以从输入细节或输出细节中找到量化参数,如缩放因子和零点,但我不知道如何从转换的ONNX模型中找到这些精确的数字。

对于ORT,get_inputs()和get_outputs()只显示输入/输出张量的名称、它们的类型以及它们的维度。如果使用ONNX,我还没有深入挖掘它。

如对此问题有任何见解,将不胜感激。提前谢谢你,祝你今天愉快。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-29 03:33:53

因此,我找到了解决办法,并决定为那些可能对解决方案感到好奇的人贴出我自己的答案。

我所做的就是导入onnx,加载模型,并从该模型的图成员,尝试引用该图中的第一个和最后一个节点。在这些节点中,尝试从“输入”选项卡中提取第二个和第三个元素的名称,因为第一个元素将是实际的输入张量。

然后,使用该图的初始化器,尝试找到同名的那些,一旦我找到它们,就用onnx.numpy_helper.to_array()将它们转换为实际值--这里是代码片段

代码语言:javascript
复制
  factors = onnx_model.graph.initializer
  for idx, init in enumerate(factors):
    if factors[idx].name == nodes[0].input[1]:
      array_test = onnx.numpy_helper.to_array(factors[idx])
      self.scale_input = array_test
    elif factors[idx].name == nodes[0].input[2]:
      array_test = onnx.numpy_helper.to_array(factors[idx])
      self.zero_point_input = array_test
    elif factors[idx].name == nodes[len(nodes) - 1].input[1]:  
      array_test = onnx.numpy_helper.to_array(factors[idx])
      self.scale_output = array_test
    elif factors[idx].name == nodes[len(nodes) - 1].input[2]:
      array_test = onnx.numpy_helper.to_array(factors[idx])
      self.zero_point_output = array_test            
  print(self.scale_input, self.scale_output)  
  print(self.zero_point_input, self.zero_point_output)  
  del onnx_model  

问题是,实际的操作环境是嵌入式ECU,由于某种原因不支持onnx,因此,我试图找到onnx运行时可用的解决方案,但就目前而言,这是我得到的全部。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74229713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档