一文玩转pytorch转onnx-tensorRT ——(B)pytorch转onnx

说明

  • pytorch转onnx全打通,就可以使用onnx的全产业链了。实际上,pytorch转onnx会遇到一些小问题,比如我遇到的upsample,找的资料蛮多的,但是归根结底有效的方法,是升级pytorch1.1到1.2,顺带提一句,更新到pytorch1.2,使用清华源加速到方法sudo pip install torch==1.2.0 torchvision==0.4.0 -f https://download.pytorch.org/whl/torch_stable.html -i https://pypi.tuna.tsinghua.edu.cn/simple。而据网上一些修改或者重新定义symbole中的方法(修改/usr/local/lib/python3.5/dist-packages/torch/onnx/symbolic.py里的层),还是要搞清楚是否是同样的版本引起的,不然反而平添一些额外的问题。

  • pytorch中的BN层转onnx转onnx前,model的bn层如果不修改running-mean-var,即默认为0,1时候,好像转到tensorRT下,会重新计算;而nvidia的retiannet-example好像没有对bn层做特殊的处理,结果也是正确的。所以这儿需要注意。不过通过mergebn和eval后再转模型,结果好像是对的了
    查看这个链接tensorFlow转onnx,如果看里面的bn层参数,bn层是会保留is_test,但还不清楚具体怎么使用这个参数,难不成用疼送人RT也可以反向传播梯度?这么修改后实验的结果是正确的,即不再因为bn层是否在训练状态而导致结果不一致。另外冻结的代码是for m in model.modules():m.eval()

  • 查看onnx的信息

    • onnx读取、可视化工具,可以帮助看onnx里的数据和结构
    • onnx的处理demo;onnx的python api
    • 使用python的api查看onnx的结构代码
        from onnx import shape_inference, utils
        import onnx
      
        filename = 'basic.onnx'
        graph = onnx.load(filename)
        graph = shape_inference.infer_shapes(graph)
        print(graph.graph)
      

如何创建自定义的onnx层?

  • 这是重点,未来会考虑转dcn过去,但自定义的dcn估计转onnx时会出问题,这儿先留个坑。标题中链接是可以参考的。
  • 使用onnx这个轮子先走到这里,未完待续……

你可能感兴趣的:(深度学习,pytorch,onnx,bn,batch,normalization,自定义onnx层)