onnx格式在机器学习模型多方软件调用中非常好用,scikit-learn库导出onnx却还存在不少问题,当然github上也有不少大牛在逐渐完善,其中针对xgboost导出onnx的介绍非常少,而针对xgboos的回归算法做预测并成功导出的则更是几乎没有,很多小伙伴导出onnx后预测失败,这里就以scikit leatn的多输出回归预测模型导出为例进行详解。
那么本文带大家详细了解一下这个过程以及解决可能存在的问题。
这里主要是针对在代码中通过回归预测多输出问题,给出正确导出xgboost的回归模型至onnx模型的方法。
先看下面的代码,这里输入是一个1x5的矩阵,输出是1个1x112的矩阵,算是一个多输出,这里具体数据不用关心
多的不说,直接给重点:1.必须自己注册转换器 2.导出指定多输出的final_types
#注册转换器
update_registered_converter(XGBRegressor, 'XgBoostRegression', calculate_linear_regressor_output_shapes,
convert_xgboost)
#定义回归模型
xgb_S = xgb.XGBRegressor(max_depth=5, n_estimators=100, learning_rate=0.3)
#学习回归模型
xgb_S = xgb_S.fit(shuRuPvDataArray, reduceDataArrayS)
#模型预测,给一个1x5的输入
y_pred_S = xgb_S.predict([[2, 54, 1, 1, 1]])
# 导出onnx
initial_type = [('float_input', FloatTensorType([1, 5]))]
final_type = [('output', FloatTensorType([1, 112]))]
onx_S = convert_sklearn(xgb_S, initial_types=initial_type, final_types=final_type)
# 将模型导出为onnx格式到根目录下
with open("xgbOnnx.onnx", "wb") as f:
f.write(onx_S.SerializeToString())
看到这里似乎没什么问题,于是开始调用这个onnx进行学习预测
这个没什么好说的
sess_S = rt.InferenceSession("xgbOnnx.onnx")
input_name_S = sess_S.get_inputs()[0].name
output_name_S = sess_S.get_outputs()[0].name
pred_onx = sess_S.run([output_name_S], {input_name_S: [[2, 54, 1, 1, 1]]})
y_pred_S = pred_onx[0]
Xgboost导出onnx报错
Unable to find alias for model ‘
遇到这个情况多半是因为没有注册转换器导致,详见上面的代码
仔细研究的小伙伴可能发现预测输出的矩阵维度竟然是一维了,明明是1x112维,如果遇见这种情况那么需要用多输出回归
#定义多输出回归模型
xgb_S = MultiOutputRegressor(xgb.XGBRegressor(max_depth=5, n_estimators=100, learning_rate=0.3))