在模型部署时,出现了pytorch模型转onnx模型后可能会存在精度下降严重的问题,我做了以下几种尝试,可供参考:
模型转换
-
验证了当device分别为cpu和cuda时,转换出来的模型是否有差异,但结果精度无大的变化。
-
验证onnx模型是否有小数精度的损失,通过以下程序来验证两模型的输出是否相同,但结果到小数点后四位都是相同的。
import onnxruntime import numpy as np from onnxruntime.datasets import get_example import torch def to_numpy(tensor): return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() checkpoint = torch.load('./testModel.pth') model.load_state_dict(checkpoint['model_state_dict'], strict=False) # 得到torch模型的输出 dummy_input = torch.randn(1, 3, 224, 224) model.eval() with torch.no_grad(): torch_out, _ = model(dummy_input) # 得到onnx模型的输出 onnx_model = get_example(r'D:/Test/Model/model.onnx') # 要写绝对路径 sess = onnxruntime.InferenceSession(onnx_model) inname = [input.name for input in sess.get_inputs()] onnx_out = sess.run(None, {inname[0]: to_numpy(dummy_input)}) # 判断输出结果是否一致,小数点后4位一致即可 print(to_numpy(torch_out)) print(onnx_out[0]) np.testing.assert_almost_equal(to_numpy(torch_out), onnx_out[0], decimal=4)
模型调用
-
调用时设置的batch从测试时的64减为了1,精度会下降0.05左右,但这不是主要原因。
-
颜色通道是否与模型符合,结果:验证颜色通道为RGB,没问题。
-
验证图片打开的格式,坐标系是否有问题,结果:图片打开后的size格式为CHW,也没问题。
-
最后发现是小数运算精度问题,将图片转为ndarry时,不能使用img = np.array(img, np.float32),而应该是 img = np.array(img)。