pth2onnx.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import torch
  2. import onnx
  3. import torch.onnx
  4. import onnxruntime as ort
  5. import numpy as np
  6. from torchvision.models import resnet50, shufflenet_v2_x1_0, shufflenet_v2_x2_0
  7. from torch import nn
  8. from simple_model import SimpleModel
  9. if __name__ == '__main__':
  10. # 载入模型框架
  11. # model = SimpleModel()
  12. # model = resnet50(pretrained=True)
  13. model = shufflenet_v2_x1_0()
  14. model.fc = nn.Linear(int(model.fc.in_features), 2, bias=False)
  15. model.load_state_dict(torch.load(r'./shufflenet.pth')) # xxx.pth表示.pth文件, 这一步载入模型权重
  16. print("加载模型成功")
  17. model.eval() # 设置模型为推理模式
  18. example_input = torch.randn(1, 3, 256, 256) # [1,3,224,224]分别对应[B,C,H,W]
  19. # print(model)
  20. torch.onnx.export(model,
  21. example_input,
  22. "shufflenet.onnx",
  23. opset_version=13,
  24. export_params=True,
  25. do_constant_folding=True,
  26. ) # xxx.onnx表示.onnx文件, 这一步导出为onnx模型, 并不做任何算子融合操作。
  27. # 验证模型
  28. onnx_model = onnx.load("shufflenet.onnx") # 使用不同变量名
  29. onnx.checker.check_model(onnx_model) # 验证模型完整性
  30. # 使用ONNX Runtime进行推理
  31. ort_session = ort.InferenceSession("shufflenet.onnx")
  32. ort_inputs = {ort_session.get_inputs()[0].name: example_input.detach().numpy()}
  33. ort_outs = ort_session.run(None, ort_inputs)
  34. # 与PyTorch原始输出对比
  35. with torch.no_grad():
  36. torch_out = model(example_input)
  37. # 检查最大误差
  38. print("输出差异最大为:", np.max(np.abs(torch_out.numpy() - ort_outs[0])))
  39. #mean_mlir = [0.485×255, 0.456×255, 0.406×255] = [123.675, 116.28, 103.53]
  40. #scale_mlir = [0.229*255, 0.224*255, 0.225*255] = [58.395, 57.12, 57.375]