ONNX(Open Neural Network Exchange)是一个开放的格式,用于表示深度学习模型,使得模型可以在不同的框架和工具之间进行转换和使用。本文将介绍如何将使用Keras框架构建的模型转换为ONNX格式。首先,将简要介绍Keras,这对于刚开始接触深度学习并考虑使用Keras构建和训练模型的工程师来说非常有用。
Keras是一个用于构建神经网络的高级接口。它不包含用于训练和部署模型的运行时环境,其设计初衷是为了用户友好——界面简洁且直观。在Keras中构建模型的代码易于理解,可以清晰地看到所有涉及的层及其功能。Keras最初是由Google的一位工程师作为研究项目开发的,后来被整合进TensorFlow中,因此如果安装了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):
# 转换为onnx模型
onnx_model = keras2onnx.convert_keras(model, model.name)
# 向ONNX模型添加元数据
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
# 这必须是一个整数或长整型
keras2onnx.save_model(onnx_model, ONNX_MODEL_FILE)
添加元数据到模型是一个最佳实践。随着用来训练模型的数据的演变,模型也会随之变化。因此,添加元数据到模型是一个好主意,这样就可以将它与以前的模型区分开来。上面的示例向doc_string属性添加了模型的简短描述,并设置了版本。creation_date和author是添加到metadata_props属性包中的自定义属性。可以自由地使用这个属性包创建尽可能多的自定义属性。遗憾的是,model_version属性需要一个整数或长整型,所以无法像服务那样使用major.minor.revision语法来版本化。
keras2onnx包忠于Keras的设计目标。它直观且易于使用。在本文中,为那些寻找用于构建和训练神经网络的深度学习框架的人提供了Keras的简要概述。然后,展示了如何使用keras2onnx包将Keras模型转换为ONNX格式。