序列化¶
保存模型和任何Proto类¶
这个ONNX图需要被序列化到一个连续的内存缓冲区中。方法SerializeToString在每个ONNX对象中都是可用的。
with open("model.onnx", "wb") as f:
f.write(onnx_model.SerializeToString())
此方法具有以下签名。
每个 Proto 类都实现了方法 SerializeToString。
因此,以下代码适用于页面 Protos 中描述的任何类。
with open("proto.pb", "wb") as f:
f.write(proto.SerializeToString())
下一个示例展示了如何保存一个NodeProto。
from onnx import NodeProto
node = NodeProto()
node.name = "example-type-proto"
node.op_type = "Add"
node.input.extend(["X", "Y"])
node.output.extend(["Z"])
with open("node.pb", "wb") as f:
f.write(node.SerializeToString())
加载模型¶
以下函数仅自动化加载类 ModelProto。接下来的部分展示了如何恢复 任何其他proto类。
- onnx.load(f: IO[bytes] | str | PathLike, format: Literal['protobuf', 'textproto', 'onnxtxt', 'json'] | str | None = None, load_external_data: bool = True) ModelProto¶
将序列化的ModelProto加载到内存中。
- Parameters:
f – 可以是一个类似文件的对象(具有“read”函数)或包含文件名的字符串/PathLike
format – 序列化格式。当未指定时,如果
f是路径,则从文件扩展名推断。如果未指定_并且_f不是路径,则使用'protobuf'。当格式为文本格式时,编码假定为“utf-8”。load_external_data – 是否加载外部数据。 如果数据位于模型的同一目录下,则设置为True。 如果不是,用户需要调用
load_external_data_for_model()并指定目录以加载外部数据。
- Returns:
已加载内存中的ModelProto。
from onnx import load
onnx_model = load("model.onnx")
或者:
from onnx import load
with open("model.onnx", "rb") as f:
onnx_model = load(f)
下一个函数从字节数组执行相同的操作。
- onnx.load_model_from_string(s: bytes | str, format: Literal['protobuf', 'textproto', 'onnxtxt', 'json'] | str = 'protobuf') ModelProto[源代码]¶
加载包含序列化 ModelProto 的二进制字符串(字节)。
- Parameters:
s – 一个字符串,包含序列化的 ModelProto
format – 序列化格式。当未指定时,如果
f是路径,则从文件扩展名推断。如果未指定 _且_f不是路径,则使用 'protobuf'。当格式为文本格式时,编码假定为“utf-8”。
- Returns:
已加载内存中的ModelProto。
加载一个Proto¶
Proto 在这里指的是包含数据的任何类型,包括模型、张量、稀疏张量,以及页面 Protos 中列出的任何类。用户必须知道他需要恢复的数据类型,然后调用方法 ParseFromString。protobuf 不会存储任何关于保存数据的类的信息。因此,在恢复对象之前,必须知道这个类。
下一个示例展示了如何恢复一个NodeProto。
from onnx import NodeProto
tp2 = NodeProto()
with open("node.pb", "rb") as f:
content = f.read()
tp2.ParseFromString(content)
print(tp2)
input: "X"
input: "Y"
output: "Z"
name: "example-type-proto"
op_type: "Add"
存在一个快捷方式用于 TensorProto:
- onnx.load_tensor_from_string(s: bytes, format: Literal['protobuf', 'textproto', 'onnxtxt', 'json'] | str = 'protobuf') TensorProto[source]¶
加载包含序列化 TensorProto 的二进制字符串(字节)。
- Parameters:
s – 一个字符串,包含序列化的 TensorProto
format – 序列化格式。当未指定时,如果
f是路径,则从文件扩展名推断。如果未指定 _且_f不是路径,则使用 'protobuf'。当格式为文本格式时,编码假定为“utf-8”。
- Returns:
加载到内存中的TensorProto。