如何将Keras构建的多分类神经网络导出为PMML文件?
我之前也碰到过这个问题——keras2pmml确实对多分类场景的支持很有限,尤其是带有softmax输出层的模型,直接用它就会报KeyError: 'softmax'。这里有两个靠谱的解决方案,亲测有效:
方案1:用
sklearn2pmml配合Keras的scikit-learn包装器 sklearn2pmml是更成熟的PMML转换工具,完美支持多分类任务,还能无缝对接Keras模型。具体步骤如下:
- 先装依赖
确保安装好所需的包:
pip install sklearn2pmml keras scikit-learn
- 把Keras模型包装成scikit-learn兼容的Estimator
用KerasClassifier(多分类专用)来包装你的模型,还要手动指定类别标签,避免转换时出错:
from keras.wrappers.scikit_learn import KerasClassifier from sklearn2pmml import PMMLPipeline, sklearn2pmml from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam # 先定义模型构建函数(sklearn2pmml要求模型可序列化,所以用函数封装) def build_multi_class_model(): model = Sequential() model.add(Dense(output_dim=9, activation='tanh', input_shape=(12,))) model.add(Dense(output_dim=8, activation='tanh')) model.add(Dense(5, activation='softmax')) # 用你原来的编译配置 learning_rate = 0.2 epochs = 20 decay_rate = learning_rate / epochs optimizer = Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, decay=decay_rate, amsgrad=False) model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) return model # 包装模型,指定训练参数 keras_estimator = KerasClassifier(build_fn=build_multi_class_model, epochs=20, batch_size=32) # 如果你已经训练好了modelnew2,可以直接替换掉默认模型 keras_estimator.model = modelnew2 # 必须手动设置类别列表,确保多分类逻辑正确(替换成你的实际类别标签) keras_estimator.classes_ = [0, 1, 2, 3, 4] # 构建PMML管道并导出 pipeline = PMMLPipeline([('classifier', keras_estimator)]) # 注意:如果你的标签是one-hot编码的,转成整数标签再fit(比如y_train.argmax(axis=1)) pipeline.fit(X_train, y_train) sklearn2pmml(pipeline, "MultiClass_Keras_Model.pmml", with_repr=True)
方案2:用ONNX作为中间格式转换
如果上面的方法遇到兼容性问题,还可以走"Keras→ONNX→PMML"的路线:
- Keras转ONNX
用tf2onnx工具转换:
pip install tf2onnx
import tensorflow as tf from tf2onnx import convert.from_keras # 转换已训练好的模型 onnx_model, _ = convert.from_keras(modelnew2, input_signature=[tf.TensorSpec(shape=(None, 12), dtype=tf.float32, name="input_features")]) tf.io.write_file("keras_model.onnx", onnx_model.SerializeToString())
- ONNX转PMML
用onnxmltools完成转换:
pip install onnxmltools
from onnxmltools.convert.convert_onnx import convert_onnx # 转换并保存PMML pmml_content = convert_onnx("keras_model.onnx") with open("MultiClass_Keras_Model.pmml", "w", encoding="utf-8") as f: f.write(pmml_content)
这个方法需要注意输入输出的名称和类型匹配,可能需要微调参数确保类别映射正确。
为什么keras2pmml会报错?
keras2pmml工具最初只针对二分类任务做了适配,没有处理softmax输出对应的多分类逻辑,所以才会抛出KeyError: 'softmax'的错误,优先用方案1的sklearn2pmml会更省心。
内容的提问来源于stack exchange,提问作者Wendy De Wit
相关产品推荐
相关产品推荐

