目录
Keras简介
快速浏览模型
安装和导入转换器
将Keras模型转换为ONNX
摘要和后续步骤
参考文献
系列文章列表如下:
ONNX系列一 --- 带有ONNX的便携式神经网络
ONNX系列二 --- 使用ONNX使Keras模型可移植
ONNX系列三 --- 使用ONNX使PyTorch AI模型可移植
ONNX系列四 --- 使用ONNX使TensorFlow模型可移植
ONNX系列五 --- 在C#中使用可移植的ONNX AI模型
ONNX系列六 --- 在Java中使用可移植的ONNX AI模型
ONNX系列七 --- 在Python中使用可移植的ONNX AI模型
在关于2020年使用便携式神经网络的系列文章中,您将学习如何将Keras模型转换为便携式ONNX格式。
由于ONNX并不是用于构建和训练模型的框架,因此我将首先简要介绍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就像运行下面所示的函数一样简单。唯一必需的代码行是用于转换模型并将转换后的模型保存到文件系统的行。关于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。