ONNX

简而言之 ONNX 就是一种框架间的转换格式,例如我们用 TensorFlow 写的模型可以转换为 ONNX 格式,并在 Caffe2 环境下运行该模型。

  1. from torch.autograd import Variable
  2. import torch.onnx
  3. import torchvision
  4. dummy_input = Variable(torch.randn(10, 3, 224, 224)).cuda()
  5. model = torchvision.models.alexnet(pretrained=True).cuda()
  6. input_names = [ "actual_input_1" ] + [ "learned_%d" % i for i in range(16) ]
  7. output_names = [ "output1" ]
  8. torch.onnx.export(model, dummy_input, "alexnet.onnx", verbose=True, input_names=input_names, output_names=output_names)
  1. graph(%actual_input_1 : Float(10, 3, 224, 224),
  2. %learned_0 : Float(64, 3, 11, 11),
  3. %learned_1 : Float(64),
  4. %learned_2 : Float(192, 64, 5, 5),
  5. %learned_3 : Float(192),
  6. %learned_4 : Float(384, 192, 3, 3),
  7. %learned_5 : Float(384),
  8. %learned_6 : Float(256, 384, 3, 3),
  9. %learned_7 : Float(256),
  10. %learned_8 : Float(256, 256, 3, 3),
  11. %learned_9 : Float(256),
  12. %learned_10 : Float(4096, 9216),
  13. %learned_11 : Float(4096),
  14. %learned_12 : Float(4096, 4096),
  15. %learned_13 : Float(4096),
  16. %learned_14 : Float(1000, 4096),
  17. %learned_15 : Float(1000)):
  18. %17 : Float(10, 64, 55, 55) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[11, 11], pads=[2, 2, 2, 2], strides=[4, 4]](%actual_input_1, %learned_0, %learned_1) # /usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py:342:0
  19. %18 : Float(10, 64, 55, 55) = onnx::Relu(%17) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
  20. %19 : Float(10, 64, 27, 27) = onnx::MaxPool[kernel_shape=[3, 3], pads=[0, 0, 0, 0], strides=[2, 2]](%18) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:488:0
  21. %20 : Float(10, 192, 27, 27) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[5, 5], pads=[2, 2, 2, 2], strides=[1, 1]](%19, %learned_2, %learned_3) # /usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py:342:0
  22. %21 : Float(10, 192, 27, 27) = onnx::Relu(%20) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
  23. %22 : Float(10, 192, 13, 13) = onnx::MaxPool[kernel_shape=[3, 3], pads=[0, 0, 0, 0], strides=[2, 2]](%21) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:488:0
  24. %23 : Float(10, 384, 13, 13) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%22, %learned_4, %learned_5) # /usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py:342:0
  25. %24 : Float(10, 384, 13, 13) = onnx::Relu(%23) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
  26. %25 : Float(10, 256, 13, 13) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%24, %learned_6, %learned_7) # /usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py:342:0
  27. %26 : Float(10, 256, 13, 13) = onnx::Relu(%25) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
  28. %27 : Float(10, 256, 13, 13) = onnx::Conv[dilations=[1, 1], group=1, kernel_shape=[3, 3], pads=[1, 1, 1, 1], strides=[1, 1]](%26, %learned_8, %learned_9) # /usr/local/lib/python3.6/dist-packages/torch/nn/modules/conv.py:342:0
  29. %28 : Float(10, 256, 13, 13) = onnx::Relu(%27) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
  30. %29 : Float(10, 256, 6, 6) = onnx::MaxPool[kernel_shape=[3, 3], pads=[0, 0, 0, 0], strides=[2, 2]](%28) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:488:0
  31. %30 : Float(10, 256, 6, 6) = onnx::AveragePool[kernel_shape=[1, 1], strides=[1, 1]](%29) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:768:0
  32. %31 : Float(10, 9216) = onnx::Flatten[axis=1](%30) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:807:0
  33. %32 : Float(10, 4096) = onnx::Gemm[alpha=1, beta=1, transB=1](%31, %learned_10, %learned_11) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:1370:0
  34. %33 : Float(10, 4096) = onnx::Relu(%32) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:807:0
  35. %34 : Float(10, 4096) = onnx::Gemm[alpha=1, beta=1, transB=1](%33, %learned_12, %learned_13) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:1370:0
  36. %35 : Float(10, 4096) = onnx::Relu(%34) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
  37. %output1 : Float(10, 1000) = onnx::Gemm[alpha=1, beta=1, transB=1](%35, %learned_14, %learned_15) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:1370:0
  38. return (%output1)

WinRT


https://docs.microsoft.com/zh-cn/windows/ai/windows-ml/get-started-desktop#prerequisites

安装VS

安装WinRT

image.png

image.png

学习资料

  • ONNX 教程:
  • Windows AI
  • ONNX
  • 英伟达公开课|详解迁移式学习下的实时目标检测模型训练与署:
  • 英伟达博客:
  • 英伟达中国优酷主页:
  • 英伟达在线课程: