本文主要是介绍onnx模型动态输入形状转静态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
早期tensorflow生成的模型,因为是静态图,定义模型时输入的是tf.placeholder ,导出的pb 或都saved model,总是动态,至少batch size 这一维是动态,即[None,H,W,3],H,W有具体值;如果是支持多尺度的输入的话,那输入形状是[None,None,None,3]。以上None部分,也可能是用户常常自定义的一个名称。
在pytorch导出onnx时,可以设置是使事使用dynamic,dynamic的价值也就是可以变输入。但在部分边端芯片上部署模型时,通常是必须固定形状的。
如下代码实现这个功能:
def convert_dynamic_to_static(input_model_path, output_model_path, batch_size):# 加载模型model = onnx.load(input_model_path)graph = model.graph# 遍历模型的所有输入和输出for tensor in list(graph.input) + list(graph.value_info) + list(graph.output):# 将第一维(通常是批大小)设置为静态值,其它维度也可以设置,看个人需要tensor.type.tensor_type.shape.dim[0].dim_value = batch_size# 保存修改后的模型onnx.save(model, output_model_path)# 使用示例
convert_dynamic_to_static('segmentation_v2.onnx', 'segmentation_v2_static.onnx', 1)
模型可以配合netron来查看。
这篇关于onnx模型动态输入形状转静态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!