ONNX提供了ONNX图上shape推理的可选实现,该实现包含每一个核心操作符,且为扩展提供了接口。因此,既可以使用已有shape推理函数到你的图中,也可以自定义shape推理实现来与你的操作符保持一致,或者同时使用以上两种方法;shape推理函数是OpSchema中的一个成员。
引用shape推理
可通过c++或者python引用shape推理,其中python API为:
可运行的python脚本为:链接
C++ API为一个函数:
其中,参数ModelProto是进行shape推理的文件,该文件使用内联方式标注,且带有shape信息;第二个参数是可选的;
实现自定义操作符的shape推理
通过使用
在操作符规则中增加shape推理,其中InferenceFunction定义在shape_inference.h中,该文件中还有核心接口结构体InferenceContext以及一些帮助。InferenceContext有助于进入操作符的输入,并且允许保存推理输出信息。
更多示例,请搜索TypeAndShapeInferenceFunction,其中一个实现是onnx/defs/tensor/defs.cc中的concat;
限制
shape推理不保证是完整的,特别地,一些动态行为会阻塞shape推理流,如reshape到一个动态可变的大小,并且,不是所有的操作符都要有一份shape推理实现。
shape推理仅对常量和简单的变量有效,不支持包含变量的算术表达式。如,Concat大小为(5,2)和(7,2)的两个张量会产生一个(12,2)大小的张量,但是当Concat大小为(5,2)和(N,2)的张量将只能产生(M,2)的张量,而不是(N+5,2)。值得注意的是,未知的符号值会被反传,因此这里的M代表与其他M相同的未知数量。
这些限制是当前实现的一个属性,不是功能限制,如果你需要一些更优的东西,请让我们知道。