本文主要是介绍利用python构建ONNX网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
利用python构建ONNX网络
利用python的API,构建一个简单的神经网络。
Y = f ( X , A , B ) Y = f(X, A, B) Y=f(X,A,B)
上述网络需要四个函数进行构建
-
make_tensor_value_info: declares a variable (input or output) given its shape and type,声明变量
-
make_node: creates a node defined by an operation (an operator type), its inputs and outputs。构建节点(算子类型)
-
make_graph: a function to create an ONNX graph with the objects created by the two previous functions。利用变量以及算子构建计算图
-
make_model: a last function which merges the graph and additional metadata。将计算图和一些额外的元数据构成一个完整的模型
例子
# importsfrom onnx import TensorProto
from onnx.helper import (make_model, make_node, make_graph,make_tensor_value_info)
from onnx.checker import check_model# inputs# 'X' is the name, TensorProto.FLOAT the type, [None, None] the shape
X = make_tensor_value_info('X', TensorProto.FLOAT, [None, None])
A = make_tensor_value_info('A', TensorProto.FLOAT, [None, None])
B = make_tensor_value_info('B', TensorProto.FLOAT, [None, None])# outputs, the shape is left undefinedY = make_tensor_value_info('Y', TensorProto.FLOAT, [None])# nodes# It creates a node defined by the operator type MatMul,
# 'X', 'A' are the inputs of the node, 'XA' the output.
node1 = make_node('MatMul', ['X', 'A'], ['XA'])
node2 = make_node('Add', ['XA', 'B'], ['Y'])# from nodes to graph
# the graph is built from the list of nodes, the list of inputs,
# the list of outputs and a name.graph = make_graph([node1, node2], # nodes'lr', # a name[X, A, B], # inputs[Y]) # outputs# onnx graph
# there is no metadata in this case.onnx_model = make_model(graph)# Let's check the model is consistent,
# this function is described in section
# Checker and Shape Inference.
check_model(onnx_model)# the work is done, let's display it...
print(onnx_model)
空的形状None表示任意大小
序列化
保存
# The serialization
with open("linear_regression.onnx", "wb") as f:f.write(onnx_model.SerializeToString())
加载
from onnx import loadwith open("linear_regression.onnx", "rb") as f:onnx_model = load(f)# display
print(onnx_model)
数据的序列化
import numpy
from onnx.numpy_helper import from_arraynumpy_tensor = numpy.array([0, 1, 4, 5, 3], dtype=numpy.float32)
print(type(numpy_tensor))onnx_tensor = from_array(numpy_tensor)
print(type(onnx_tensor))serialized_tensor = onnx_tensor.SerializeToString()
print(type(serialized_tensor))with open("saved_tensor.pb", "wb") as f:f.write(serialized_tensor)
Initializer,为输入构建默认值
前面的模型将系数也做为模型的输入,这在使用时不便。
代码
import numpy
from onnx import numpy_helper, TensorProto
from onnx.helper import (make_model, make_node, make_graph,make_tensor_value_info)
from onnx.checker import check_model# initializers
value = numpy.array([0.5, -0.6], dtype=numpy.float32)
A = numpy_helper.from_array(value, name='A')value = numpy.array([0.4], dtype=numpy.float32)
C = numpy_helper.from_array(value, name='C')# the part which does not change
X = make_tensor_value_info('X', TensorProto.FLOAT, [None, None])
Y = make_tensor_value_info('Y', TensorProto.FLOAT, [None])
node1 = make_node('MatMul', ['X', 'A'], ['AX'])
node2 = make_node('Add', ['AX', 'C'], ['Y'])
graph = make_graph([node1, node2], 'lr', [X], [Y], [A, C])
onnx_model = make_model(graph)
check_model(onnx_model)print(onnx_model)
属性
from onnx import TensorProto
from onnx.helper import (make_model, make_node, make_graph,make_tensor_value_info)
from onnx.checker import check_model# unchanged
X = make_tensor_value_info('X', TensorProto.FLOAT, [None, None])
A = make_tensor_value_info('A', TensorProto.FLOAT, [None, None])
B = make_tensor_value_info('B', TensorProto.FLOAT, [None, None])
Y = make_tensor_value_info('Y', TensorProto.FLOAT, [None])# added
node_transpose = make_node('Transpose', ['A'], ['tA'], perm=[1, 0])# unchanged except A is replaced by tA
node1 = make_node('MatMul', ['X', 'tA'], ['XA'])
node2 = make_node('Add', ['XA', 'B'], ['Y'])# node_transpose is added to the list
graph = make_graph([node_transpose, node1, node2],'lr', [X, A, B], [Y])
onnx_model = make_model(graph)
check_model(onnx_model)# the work is done, let's display it...
print(onnx_model)
版本和元数据
from onnx import load, helperwith open("linear_regression.onnx", "rb") as f:onnx_model = load(f)onnx_model.model_version = 15
onnx_model.producer_name = "something"
onnx_model.producer_version = "some other thing"
onnx_model.doc_string = "documentation about this model"
prop = onnx_model.metadata_propsdata = dict(key1="value1", key2="value2")
helper.set_model_props(onnx_model, data)print(onnx_model)
Functions
定义一个函数,相比于计算图,更像一个模板
import numpy
from onnx import numpy_helper, TensorProto
from onnx.helper import (make_model, make_node, set_model_props, make_tensor,make_graph, make_tensor_value_info, make_opsetid,make_function)
from onnx.checker import check_modelnew_domain = 'custom'
opset_imports = [make_opsetid("", 14), make_opsetid(new_domain, 1)]# Let's define a function for a linear regressionnode1 = make_node('MatMul', ['X', 'A'], ['XA'])
node2 = make_node('Add', ['XA', 'B'], ['Y'])linear_regression = make_function(new_domain, # domain name'LinearRegression', # function name['X', 'A', 'B'], # input names['Y'], # output names[node1, node2], # nodesopset_imports, # opsets[]) # attribute names# Let's use it in a graph.X = make_tensor_value_info('X', TensorProto.FLOAT, [None, None])
A = make_tensor_value_info('A', TensorProto.FLOAT, [None, None])
B = make_tensor_value_info('B', TensorProto.FLOAT, [None, None])
Y = make_tensor_value_info('Y', TensorProto.FLOAT, [None])graph = make_graph([make_node('LinearRegression', ['X', 'A', 'B'], ['Y1'], domain=new_domain),make_node('Abs', ['Y1'], ['Y'])],'example',[X, A, B], [Y])onnx_model = make_model(graph, opset_imports=opset_imports,functions=[linear_regression]) # functions to add)
check_model(onnx_model)# the work is done, let's display it...
print(onnx_model)
带属性的function
import numpy
from onnx import numpy_helper, TensorProto, AttributeProto
from onnx.helper import (make_model, make_node, set_model_props, make_tensor,make_graph, make_tensor_value_info, make_opsetid,make_function)
from onnx.checker import check_modelnew_domain = 'custom'
opset_imports = [make_opsetid("", 14), make_opsetid(new_domain, 1)]# Let's define a function for a linear regression
# The first step consists in creating a constant
# equal to the input parameter of the function.
cst = make_node('Constant', [], ['B'])att = AttributeProto()
att.name = "value"# This line indicates the value comes from the argument
# named 'bias' the function is given.
att.ref_attr_name = "bias"
att.type = AttributeProto.TENSOR
cst.attribute.append(att)node1 = make_node('MatMul', ['X', 'A'], ['XA'])
node2 = make_node('Add', ['XA', 'B'], ['Y'])linear_regression = make_function(new_domain, # domain name'LinearRegression', # function name['X', 'A'], # input names['Y'], # output names[cst, node1, node2], # nodesopset_imports, # opsets["bias"]) # attribute names# Let's use it in a graph.X = make_tensor_value_info('X', TensorProto.FLOAT, [None, None])
A = make_tensor_value_info('A', TensorProto.FLOAT, [None, None])
B = make_tensor_value_info('B', TensorProto.FLOAT, [None, None])
Y = make_tensor_value_info('Y', TensorProto.FLOAT, [None])graph = make_graph([make_node('LinearRegression', ['X', 'A'], ['Y1'], domain=new_domain,# bias is now an argument of the function and is defined as a tensorbias=make_tensor('former_B', TensorProto.FLOAT, [1], [0.67])),make_node('Abs', ['Y1'], ['Y'])],'example',[X, A], [Y])onnx_model = make_model(graph, opset_imports=opset_imports,functions=[linear_regression]) # functions to add)
check_model(onnx_model)# the work is done, let's display it...
print(onnx_model)
Parsing
模型的检验
import onnx.parser
import onnx.checkerinput = '''<ir_version: 8,opset_import: [ "" : 15]>agraph (float[I,4] X, float[4,2] A, int[4] B) => (float[I] Y) {XA = MatMul(X, A)Y = Add(XA, B)}'''
try:onnx_model = onnx.parser.parse_model(input)onnx.checker.check_model(onnx_model)
except Exception as e:print(e)
形状推断
import onnx.parser
from onnx import helper, shape_inferenceinput = '''<ir_version: 8,opset_import: [ "" : 15]>agraph (float[I,4] X, float[4,2] A, float[4] B) => (float[I] Y) {XA = MatMul(X, A)Y = Add(XA, B)}'''
onnx_model = onnx.parser.parse_model(input)
inferred_model = shape_inference.infer_shapes(onnx_model)print(inferred_model)
这篇关于利用python构建ONNX网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!