序列化

保存模型和任何Proto类

这个ONNX图需要被序列化到一个连续的内存缓冲区中。方法SerializeToString在每个ONNX对象中都是可用的。

with open("model.onnx", "wb") as f:
    f.write(onnx_model.SerializeToString())

此方法具有以下签名。

class onnx.ModelProto
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 中列出的任何类。用户必须知道他需要恢复的数据类型,然后调用方法 ParseFromStringprotobuf 不会存储任何关于保存数据的类的信息。因此,在恢复对象之前,必须知道这个类。

class onnx.ModelProto
ParseFromString()

将序列化的消息解析为当前消息。

下一个示例展示了如何恢复一个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。