我正在尝试分割DNN模型为了在边缘上执行部分网络其余的在云中.因为它必须是跨平台的,并与每个框架一起工作,我需要直接从ONNX开始.
我知道如何从tensorflow/keras开始生成ONNX模型,以及如何运行ONNX模型,但我意识到在ONNX文件上工作真的很难,比如可视化和修改它。
是否有人可以帮助我理解如何分割和ONNX模型,或者至少运行ONNX模型的一部分(如从输入到N层和从N层到输出)?
我从这个情况开始:
# load MobileNetV2 model
model = MobileNetV2()
# Export the model
tf.saved_model.save(model, "saved_model")
# export to .onnx
!python -m tf2onnx.convert --saved-model saved_model --output mobilenet_v2.onnx --opset 7
# open the saved ONNX Model
print("Import ONNX Model..")
onnx_model = onnx.load("mobilenet_v2.onnx")
tf_rep = prepare(onnx_model, logging_level="WARN", auto_cast=True)
我试图使用sclblonnx但是在这么大的模型上(虽然它是一个小模型),我不能真正打印图形,当我用textlist_inputs/list_outputs列出输入和输出时,我真的不知道它们是如何相互连接的。
任何帮助都将非常感激。提前谢谢你。
在Onnx PythonAPI规范中,您可以通过指定张量的输入名称和输出名称来分割Onnx模型。
您可能需要做的第一件事是理解下划线图形对于你的onnx模型。
onnx_graph = onnx_model.graph
将返回图形对象。
之后,您需要了解您想要在哪里将这个图分成两个单独的图(从而运行两个模型)。
你可以用中子绘制图形(这是sclblonnx所做的),或者你可以尝试通过查看
手动查看内部onnx_graph_nodes = onnx_graph.node
当然,查看图的输入(onnx_graph.input
)和输出(onnx_graph.output
)也很重要。
如果你看"合并"从sclblonnx文件中,您将看到潜入图形以及"分割"的语法细节。函数可以帮助你。