赞
踩
onnx将每一个网络的每一层或者说是每一个算子当作节点Node,再由这些Node去构建一个Graph,相当于是一个网络。最后将Graph和这个onnx模型的其他信息结合在一起,生成一个model,也就是最终的.onnx的模型。
在构建onnx模型这个过程中,这个文件至关重要。其中make_node、make_graph、make_model是不可或缺的。make_tensor_value_info和make_tensor是构建graph中所需要用到的。
make_node(op_type,inputs,outputs,name=None,doc_string=None,**kwargs)
auto_pad
:VALID,dilations
:[1,1,1],group
:1,kernel_shape
:(7,7),pads
:[3,3,3,3],strides
:(2,2)dict = {"kernel_shape": (7, 7),
"group": 1,#default为1,所以可以不写
"strides": (2, 2),
"auto_pad": "VALID",
"dilations": [1, 1, 1],
"pads": [3, 3, 3, 3]}#顺序无所谓
node_def = helper.make_node(
NodeType, # 节点名
X_name, # 输入
Y_name, # 输出
**dict
)
也可以写成:
node_def = helper.make_node(
NodeType, # 节点名
X_name, # 输入
Y_name, # 输出
kernel_shape = (7,7),
strides = (2,2),
auto_pad = "VALID",
dilations = [1,1,1],
pads = [3,3,3,3],
)
当然你也可以自己魔改,想放什么进去都可以,不过尽量还是统一符合官网要求比较好~
make_graph(nodes,name,inputs,outputs,initializer=None,doc_string=None,value_info=[])
注意! inputs、outputs、value_info都是ValueInfoProto列表形式,那么它们各自存放什么东西呢?
对于一个多层网络而言,其中间层的输入有来自上一层的输出,也有来自外界的超参数和数据,为了区分,onnx中将来自外界的超参数信息和输入数据信息统一放在inputs里,而value_info里存放的是来自经过前向计算得到的中间层输出数据的信息(2019.04.09更新:现在onnx官方提供了前向推理计算value_info并生成onnx模型的api)。注意,是信息,不是具体数据值。outputs只存放整个网络的输出信息。
第二个需要注意的是: initializer作为存放超参数具体数值的TensorProto列表,其中每个TensorProto总会有与其对应的ValueInfoProto存在,对应关系通过name来联系。比如inputs里放了一个Conv1的权重参数信息,名字为"Conv1_W"那么对应的initializer里会有个名字与其相同的TensorProto来存储这个权重参数的具体数值。
第三个需要注意的是: 对于一个网络而言如何能体现其网络结构呢?即节点与节点之间的关联。
在构建每一个node时就需要注意,当前node的输入来自于哪一个node的输出,名字要匹配上,才能将node间联系体现出来。
make_model(graph, **kwargs)
这个函数中会先实例化一个ModelProto----model,其中会对它的ir_version(现在默认是3)、graph(就是把传入的graph复制进model.graph)、opset_import做处理。具体可以看helper里的make_model这个函数。我们只要知道这是个最后把graph和模型其他信息组合在一起构建出一个完整的onnx model的函数就可以了。
make_tensor(name,data_type,dims,vals,raw=False)
make_tensor_value_info(name,elem_type,shape,doc_string="",shape_denotation=None)
make_attribute(key,value,doc_string=None)
构建一个简单的onnx模型,实质上,只要构建好每一个node,然后将它们和输入输出超参数一起塞到graph,最后转成model就可以了。
写了一个base,在构建onnx的时候可以直接调用createOnnxNode、createOnnxModel来构建一个onnx模型,可以选择把onnx保存为txt格式,很大就是了。具体流程后续补上。
代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。