使 Keras 模型可移植到 ONNX





5.00/5 (2投票s)
在本文中,我将为那些寻求用于构建和训练神经网络的深度学习框架的人提供 Keras 的简要概述。
在我们关于 2020 年使用可移植神经网络的系列文章中,您将学习如何将 Keras 模型转换为可移植的 ONNX 格式。
由于 ONNX 不是构建和训练模型的框架,我将首先简要介绍 Keras。 这对于从头开始并考虑使用 Keras 作为构建和训练模型的框架的工程师将很有用。
Keras 简介
Keras 旨在成为构建神经网络的接口。 这意味着它不包含用于训练和服务模型的运行时。 它的界面在设计时考虑到了人类用户——它具有高级别且易于使用。 当您查看在 Keras 中创建模型的代码时,很容易看到所有涉及的层以及它们的作用。
Keras 最初是由 Google 工程师编写的研究项目。 因此,它最终进入了 TensorFlow,因此如果您安装了 2.0,那么您已经拥有 Keras。
快速浏览模型
下面的代码创建并训练一个模型,该模型预测 MNIST 数据集中的数字。(它是本文系列随附的完整端到端演示的摘录。)在下一节中,我们将此模型转换为 ONNX 格式。
def build_model():
model = keras.Sequential(
[
keras.Input(shape=input_shape),
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dropout(0.5),
layers.Dense(num_classes, activation="softmax"),
]
)
return model
def train_model(model, x_train, y_train):
model.compile(loss="categorical_crossentropy",
optimizer="adam",
metrics=["accuracy"])
model.fit(x_train, y_train,
batch_size=batch_size, epochs=epochs,
validation_split=0.1)
安装和导入转换器
在将 Keras 模型转换为 ONNX 之前,您需要安装 keras2onnx 包,因为它不包含在 Keras 或 TensorFlow 中。 以下命令安装 Keras 到 ONNX 的转换实用程序
pip install keras2onnx
安装后,可以使用以下导入将转换器导入到您的模块中
import keras2onnx
将 Keras 模型转换为 ONNX
将您的 Keras 模型转换为 ONNX 就像运行下面显示的函数一样简单。 唯一的强制性代码行是转换模型并将转换后的模型保存到文件系统的代码行。 keras2onnx 转换器的值得注意之处在于,它只需要模型作为参数。 这使得转换变得容易且不易出错。 其他框架的其他转换器需要有关模型输入的信息,而这些信息很容易出错。
def export_to_onnx(model):
# convert to onnx model
onnx_model = keras2onnx.convert_keras(model, model.name)
# Add metadata to the ONNX model.
meta = onnx_model.metadata_props.add()
meta.key = "creation_date"
meta.value = datetime.datetime.now().strftime("%m/%d/%Y, %H:%M:%S")
meta = onnx_model.metadata_props.add()
meta.key = "author"
meta.value = 'keithpij'
onnx_model.doc_string = 'MNIST model'
onnx_model.model_version = 3 # This must be an integer or long.
keras2onnx.save_model(onnx_model, ONNX_MODEL_FILE)
将元数据添加到模型的代码是一种最佳实践。 随着您用于训练模型的数据的发展,您的模型也会发展。 因此,最好向模型添加元数据,以便您可以将其与以前的模型区分开来。 上面的示例将模型的简要描述添加到 doc_string
属性,并设置版本。 creation_date
和 author
是添加到 metadata_props
属性包的自定义属性。 您可以使用此属性包自由创建任意数量的自定义属性。 不幸的是,model_version
属性需要整数或长整数,因此您将无法像使用 major.minor.revision 语法来版本化您的服务一样对其进行版本化。
总结和后续步骤
keras2onnx 包忠实于 Keras 本身的设计目标。 它直观且易于使用。 在本文中,我为那些正在寻找用于构建和训练神经网络的深度学习框架的人们提供了 Keras 的简要概述。 然后,我展示了如何使用 kera2onnx 包将 Keras 模型转换为 ONNX 格式。
由于本文的目的是演示将 Keras 模型转换为 ONNX 格式,因此我没有详细介绍构建和训练 Keras 模型。 此帖子的代码示例包含探索 Keras 本身的代码。 keras_mnist.py 模块是一个完整的端到端演示,展示了如何加载数据、探索图像和训练模型。
接下来,我们将研究如何将 PyTorch 模型转换为 ONNX。