ML.NET 示例:将ML.NET模型导出到ONNX
在這個(gè)示例中,您將看到如何使用ML.NET來(lái)訓(xùn)練回歸模型,然后將該模型轉(zhuǎn)換為ONNX格式。
問(wèn)題
開(kāi)放式神經(jīng)網(wǎng)絡(luò)交換即ONNX是一種表示深度學(xué)習(xí)模型的開(kāi)放格式。使用ONNX,開(kāi)發(fā)人員可以在最先進(jìn)的工具之間移動(dòng)模型,并選擇最適合他們的組合。ONNX是由一個(gè)合作伙伴社區(qū)開(kāi)發(fā)和支持的。
有時(shí)您可能希望使用ML.NET訓(xùn)練模型,然后轉(zhuǎn)換為ONNX,例如,如果您希望使用WinML使用模型以利用Windows應(yīng)用程序中的GPU推斷。
不是所有的ML.NET模型都可以轉(zhuǎn)換成ONNX;它依賴(lài)于訓(xùn)練器和訓(xùn)練管道中的變換。有關(guān)支持的訓(xùn)練器列表,請(qǐng)參見(jiàn)ML.NETAlgorithms Doc中的表格,有關(guān)支持的轉(zhuǎn)換的列表請(qǐng)查看Data transforms Doc。
數(shù)據(jù)集
本示例使用NYC出租車(chē)票價(jià)數(shù)據(jù)集。
解決方案
控制臺(tái)應(yīng)用程序項(xiàng)目ONNXExport 用于訓(xùn)練一個(gè)ML.NET模型,該模型根據(jù)行駛距離和乘客數(shù)量等特征預(yù)測(cè)出租車(chē)票價(jià),將該模型導(dǎo)出到ONNX,然后使用ONNX模型進(jìn)行預(yù)測(cè)。
NuGet包
要將ML.NET模型導(dǎo)出到ONNX,必須在項(xiàng)目中安裝以下NuGet包:
Microsoft.ML.OnnxConverter
您還必須安裝:
Microsoft.ML, 用于訓(xùn)練ML.NET模型
Microsoft.ML.ONNXRuntime和Microsoft.ML.OnnxTransformer,用于為ONNX模型評(píng)分
轉(zhuǎn)換和訓(xùn)練器
此管道包含以下轉(zhuǎn)換和訓(xùn)練器,它們都是ONNX可導(dǎo)出的:
OneHotEncoding 轉(zhuǎn)換
Concatenate 轉(zhuǎn)換
Light GBM 訓(xùn)練器
代碼
訓(xùn)練ML.NET模型后,可以使用以下代碼轉(zhuǎn)換為ONNX:
using?(var?stream?=?File.Create("taxi-fare-model.onnx"))mlContext.Model.ConvertToOnnx(model,?trainingDataView,?stream);您需要一個(gè)轉(zhuǎn)換器和輸入數(shù)據(jù)來(lái)將ML.NET模型轉(zhuǎn)換為ONNX模型。默認(rèn)情況下,ONNX轉(zhuǎn)換將生成具有最新OpSet版本的ONNX文件
轉(zhuǎn)換為ONNX后,可以使用以下代碼使用ONNX模型:
var?onnxEstimator?=?mlContext.Transforms.ApplyOnnxModel(onnxModelPath);using?var?onnxTransformer?=?onnxEstimator.Fit(trainingDataView);var?onnxOutput?=?onnxTransformer.Transform(testDataView);在同一個(gè)示例輸入上比較ML.NET模型和ONNX模型時(shí),應(yīng)該會(huì)得到相同的結(jié)果。如果運(yùn)行項(xiàng)目,則應(yīng)在控制臺(tái)中獲得類(lèi)似于以下輸出的結(jié)果:
Predicted?Scores?with?ML.NET?model Score??????19.60645 Score??????18.673796 Score??????5.9175444 Score??????4.8969507 Score??????19.108932 Predicted?Scores?with?ONNX?model Score??????19.60645 Score??????18.673796 Score??????5.9175444 Score??????4.8969507 Score??????19.108932性能
默認(rèn)的ONNX到ML.NET的轉(zhuǎn)換不是最佳的,并且會(huì)產(chǎn)生ML.NET使用不需要的額外圖形輸出。ONNX運(yùn)行時(shí)執(zhí)行反向深度優(yōu)先搜索,這會(huì)導(dǎo)致大量從ONNX運(yùn)行時(shí)到ML.NET的本機(jī)內(nèi)存到托管內(nèi)存的轉(zhuǎn)換操作,并執(zhí)行超過(guò)必要內(nèi)核的操作。
如果只指定必要的圖形輸出,它將只執(zhí)行圖形的一個(gè)子集。因此,通過(guò)消除除Score之外的所有圖形輸出,可以提高推理性能。
總結(jié)
以上是生活随笔為你收集整理的ML.NET 示例:将ML.NET模型导出到ONNX的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WPF 制作便携小空调
- 下一篇: .NET之生成数据库全流程