ir_version: 3
producer_name: "onnx.utils.extract_model"
graph {
node {
input: "Input3"
input: "Constant339"
output: "Minus340_Output_0"
name: "Minus340"
op_type: "Sub"
doc_string: ""
domain: ""
}
node {
input: "Minus340_Output_0"
input: "Constant343"
output: "Block352_Output_0"
name: "Block352"
op_type: "Div"
doc_string: ""
domain: ""
}
name: "Extracted from {CNTKGraph}"
initializer {
data_type: 1
float_data: 127.5
name: "Constant339"
}
initializer {
data_type: 1
float_data: 255.0
name: "Constant343"
}
input {
name: "Input3"
type {
tensor_type {
elem_type: 1
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
dim {
dim_value: 64
}
dim {
dim_value: 64
}
}
}
}
}
output {
name: "Block352_Output_0"
type {
tensor_type {
elem_type: 1
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
dim {
dim_value: 64
}
dim {
dim_value: 64
}
}
}
}
}
value_info {
name: "Minus340_Output_0"
type {
tensor_type {
elem_type: 1
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
dim {
dim_value: 64
}
dim {
dim_value: 64
}
}
}
}
}
value_info {
name: "Block352_Output_0"
type {
tensor_type {
elem_type: 1
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
dim {
dim_value: 64
}
dim {
dim_value: 64
}
}
}
}
}
}
opset_import {
domain: ""
version: 7
}
# 了解了onnx的结构后,我们可以根据它的结构将其拆分成多个单节点的onnx模型,以便于对整体模型的单个节点进行测试和分析。
import onnx
from onnx import helper,numpy_helper
#获取对应输入信息
def getInputTensorValueInfo(input_name,model):
in_tvi = []
for name in input_name:
for params_input in model.graph.input:
if params_input.name == name:
in_tvi.append(params_input)
for inner_output in model.graph.value_info:
if inner_output.name == name:
in_tvi.append(inner_output)
return in_tvi
#获取对应输出信息
def getOutputTensorValueInfo(output_name,model):
out_tvi = []
for name in output_name:
out_tvi = [inner_output for inner_output in model.graph.value_info if inner_output.name == name]
if name == model.graph.output[0].name:
out_tvi.append(model.graph.output[0])
return out_tvi
#获取对应超参数值
def getInitTensorValue(input_name,model):
init_t = []
for name in input_name:
init_t = [init for init in model.graph.initializer if init.name == name]
return init_t
#构建单个节点onnx模型
def createSingelOnnxModel(ModelPath,nodename,SaveType="",SavePath=""):
model = loadOnnxModel(str(ModelPath))
Node,input_name,output_name = getNodeAndIOname(nodename,model)
in_tvi = getInputTensorValueInfo(input_name,model)
out_tvi = getOutputTensorValueInfo(output_name,model)
init_t = getInitTensorValue(input_name,model)
graph_def = helper.make_graph(
[Node],
nodename,
inputs=in_tvi, # 输入
outputs=out_tvi, # 输出
initializer=init_t, # initalizer
)
model_def = helper.make_model(graph_def, producer_name='onnx-example')
print(nodename+"onnx模型生成成功!")
# 获取整个ONNX模型的一些信息
#获取节点名列表
def getNodeNameList(model):
NodeNameList = []
for i in range(len(model.graph.node)):
NodeNameList.append(model.graph.node[i].name)
return NodeNameList
def get_node_attributes(node):
return node.attribute
def get_node_inputs(node):
return node.input
def get_node_outputs(node):
return node.output
def show_weight(weight):
print("="*10, "details of weight: ", weight.name, "="*10)
print("data type: ", weight.data_type)
print("shape: ", weight.dims)
data_numpy = numpy_helper.to_array(weight)
# data_numpy = np.frombuffer(weight.raw_data, dtype=xxx)
# print("detail data:", data_numpy)
print("="*40)
# onnx.utils.extract_model("emotion-ferplus-7.onnx","mini_model.onnx",["Input3"],["Block352_Output_0"])
model = onnx.load("mini_model.onnx")
# print(model.ir_version) # IR的版本
# print(model.producer_name) #
# print(model.opset_import) # opset 版本信息
# graph
# graph中有node(NodeProto类型),input(ValueInfoProto类型),output(ValueInfoProto类型)和initializer(TensorProto类型)
# 其中node中存放着模型中的所有计算节点,input中存放着模型所有的输入节点,output存放着模型所有的输出节点,initializer存放着模型所有的权重;
#value_info存放了各个tensor 的信息
# node 通过input和output的指向关系,描绘出一个深度学习模型的拓扑图
# for node in model.graph.node:
# print(node)
#获取节点和节点的输入输出名列表,一般节点的输入将来自于上一层的输出放在列表前面,参数放在列表后面
def getNode(nodename,model):
for i in range(len(model.graph.node)):
if model.graph.node[i].name == nodename:
Node = model.graph.node[i]
input_name = model.graph.node[i].input
output_name = model.graph.node[i].output
return Node,input_name,output_name
for node in model.graph.node:
print(get_node_inputs(node))
print(get_node_outputs(node))
print(get_node_attributes(node))
# print(model.graph.input)
# print(model.graph.output)
# for value_inifo in model.graph.value_info:
# print(value_inifo)
# for initializer in model.graph.initializer:
# print(initializer)
#获取节点数量
print(len(model.graph.node))
# with open("model.txt","w") as f:
# f.write(str(model))
# print(model.graph)
print(getNodeNameList(model))
https://github.com/ZhangGe6/onnx-modifier/tree/master
https://github.com/bindog/onnx-surgery/blob/master/surgery.py
https://bindog.github.io/blog/2020/03/13/deep-learning-model-convert-and-depoly/
https://www.zhihu.com/question/386526462
https://blog.csdn.net/ChuiGeDaQiQiu/article/details/123794387
网友评论