如何用Python导出onnx模型

sklearn导出onnx详解及报错解决方案

写在前面

onnx格式在机器学习模型多方软件调用中非常好用,scikit-learn库导出onnx却还存在不少问题,当然github上也有不少大牛在逐渐完善,其中针对xgboost导出onnx的介绍非常少,而针对xgboos的回归算法做预测并成功导出的则更是几乎没有,很多小伙伴导出onnx后预测失败,这里就以scikit leatn的多输出回归预测模型导出为例进行详解。
那么本文带大家详细了解一下这个过程以及解决可能存在的问题。

Xgboost导出onnx详解

这里主要是针对在代码中通过回归预测多输出问题,给出正确导出xgboost的回归模型至onnx模型的方法。

先看下面的代码,这里输入是一个1x5的矩阵,输出是1个1x112的矩阵,算是一个多输出,这里具体数据不用关心

1.xgboost模型定义及onnx导出

多的不说,直接给重点: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进行学习预测

3.导入onnx模型

这个没什么好说的

  sess_S = rt.InferenceSession("xgbOnnx.onnx")

4.通过导入的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]

5.可能遇见的问题

问题一:未注册转换器

Xgboost导出onnx报错
Unable to find alias for model ‘’.The converter is likely missing.

遇到这个情况多半是因为没有注册转换器导致,详见上面的代码

问题二:输出不对

仔细研究的小伙伴可能发现预测输出的矩阵维度竟然是一维了,明明是1x112维,如果遇见这种情况那么需要用多输出回归

#定义多输出回归模型
   xgb_S = MultiOutputRegressor(xgb.XGBRegressor(max_depth=5, n_estimators=100, learning_rate=0.3))

你可能感兴趣的:(Python专栏,sklearn,python,scikit-learn)