ONNX
简而言之 ONNX 就是一种框架间的转换格式,例如我们用 TensorFlow 写的模型可以转换为 ONNX 格式,并在 Caffe2 环境下运行该模型。
from torch.autograd import Variable
import torch.onnx
import torchvision
dummy_input = Variable(torch.randn(10, 3, 224, 224)).cuda()
model = torchvision.models.alexnet(pretrained=True).cuda()
input_names = [ "actual_input_1" ] + [ "learned_%d" % i for i in range(16) ]
output_names = [ "output1" ]
torch.onnx.export(model, dummy_input, "alexnet.onnx", verbose=True, input_names=input_names, output_names=output_names)
graph(%actual_input_1 : Float(10, 3, 224, 224),
%learned_0 : Float(64, 3, 11, 11),
%learned_1 : Float(64),
%learned_2 : Float(192, 64, 5, 5),
%learned_3 : Float(192),
%learned_4 : Float(384, 192, 3, 3),
%learned_5 : Float(384),
%learned_6 : Float(256, 384, 3, 3),
%learned_7 : Float(256),
%learned_8 : Float(256, 256, 3, 3),
%learned_9 : Float(256),
%learned_10 : Float(4096, 9216),
%learned_11 : Float(4096),
%learned_12 : Float(4096, 4096),
%learned_13 : Float(4096),
%learned_14 : Float(1000, 4096),
%learned_15 : Float(1000)):
%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
%18 : Float(10, 64, 55, 55) = onnx::Relu(%17) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
%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
%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
%21 : Float(10, 192, 27, 27) = onnx::Relu(%20) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
%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
%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
%24 : Float(10, 384, 13, 13) = onnx::Relu(%23) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
%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
%26 : Float(10, 256, 13, 13) = onnx::Relu(%25) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
%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
%28 : Float(10, 256, 13, 13) = onnx::Relu(%27) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
%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
%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
%31 : Float(10, 9216) = onnx::Flatten[axis=1](%30) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:807:0
%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
%33 : Float(10, 4096) = onnx::Relu(%32) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:807:0
%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
%35 : Float(10, 4096) = onnx::Relu(%34) # /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py:912:0
%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
return (%output1)
WinRT
https://docs.microsoft.com/zh-cn/windows/ai/windows-ml/get-started-desktop#prerequisites
安装VS
安装WinRT
学习资料
- ONNX 教程:
- Windows AI
- ONNX
- 英伟达公开课|详解迁移式学习下的实时目标检测模型训练与署:
- 英伟达博客:
- 英伟达中国优酷主页:
- 英伟达在线课程: