You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Keras构建的多分类神经网络导出为PMML文件?

我之前也碰到过这个问题——keras2pmml确实对多分类场景的支持很有限,尤其是带有softmax输出层的模型,直接用它就会报KeyError: 'softmax'。这里有两个靠谱的解决方案,亲测有效:

方案1:用sklearn2pmml配合Keras的scikit-learn包装器

sklearn2pmml是更成熟的PMML转换工具,完美支持多分类任务,还能无缝对接Keras模型。具体步骤如下:

  1. 先装依赖
    确保安装好所需的包:
pip install sklearn2pmml keras scikit-learn
  1. 把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"的路线:

  1. 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())
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:04:21