本版本不提供ONNX模型npy数据生成功能,请自行安装ONNX环境并提前准备ONNX原始数据“*.npy”文件。本文仅提供生成符合精度比对要求的numpy格式ONNX原始数据“*.npy”文件的样例参考。
为输出符合精度比对要求的“*.npy”数据文件,需在推理结束后的代码中增加dump操作,示例代码如下:
import os
import onnx
import onnxruntime
import numpy as np
import time
from skl2onnx.helpers.onnx_helper import enumerate_model_node_outputs
from skl2onnx.helpers.onnx_helper import select_model_inputs_outputs
from skl2onnx.helpers.onnx_helper import save_onnx_model
#修改模型,增加输出节点
model_onnx = onnx.load("./resnet50.onnx")
output = []
for out in enumerate_model_node_outputs(model_onnx):
output.append(out)
num_onnx = select_model_inputs_outputs(model_onnx,outputs=output)
save_onnx_model(num_onnx, "resnet50_dump.onnx")
#推理得到输出,本示例中采用随机数作为输入
input_data = np.random.random((1,3,224,224)).astype(np.float32)
input_data.tofile("test_data.bin")
sess = onnxruntime.InferenceSession("resnet50_dump.onnx")
input_name = sess.get_inputs()[0].name
output_name = [node.name for node in sess.get_outputs()]
res = sess.run(output_name, {input_name: input_data})
#获得输出名称,确保每个算子节点有对应名称
node_name = [node.name for node in model_onnx.graph.node]
#保存数据
node_output_num = [len(node.output) for node in model_onnx.graph.node]
idx = 0
for num, name in zip(node_output_num, node_name):
for i in range(num):
data = res[idx]
file_name = name + "." + str(i) + "." + str(round(time.time() * 1000000)) + ".npy"
output_dump_path = os.path.join("./onnx_dump/", file_name)
np.save(output_dump_path, data.astype(np.float16))
idx += 1
需要根据代码中的output_dump_path参数在当前目录新建对应“onnx_dump”目录或自定义目录。