可能导致将pytorch转为onnx模型后精度下降的几个原因

在模型部署时,出现了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)。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值