天天看點

ONNX系列五 --- 在C#中使用可移植的ONNX AI模型安裝和導入ONNX運作時載入ONNX模型使用ONNX運作時進行預測摘要和後續步驟參考文獻

目錄

安裝和導入ONNX運作時

載入ONNX模型

使用ONNX運作時進行預測

摘要和後續步驟

參考文獻

  • 下載下傳源547.1 KB

系列文章清單如下:

ONNX系列一 --- 帶有ONNX的便攜式神經網絡

ONNX系列二 --- 使用ONNX使Keras模型可移植

ONNX系列三 --- 使用ONNX使PyTorch AI模型可移植

ONNX系列四 --- 使用ONNX使TensorFlow模型可移植

ONNX系列五 --- 在C#中使用可移植的ONNX AI模型

ONNX系列六 --- 在Java中使用可移植的ONNX AI模型

ONNX系列七 --- 在Python中使用可移植的ONNX AI模型

在關于2020年使用便攜式神經網絡的系列文章中,您将學習如何在x64架構上安裝ONNX并在C#中使用它。

微軟與Facebook和AWS共同開發了ONNX。ONNX格式和ONNX運作時都具有行業支援,以確定所有重要架構都能夠将其圖形導出到ONNX,并且這些模型可以在任何硬體配置上運作。

ONNX Runtime是用于運作已轉換為ONNX格式的機器學習模型的引擎。傳統機器學習模型和深度學習模型(神經網絡)都可以導出為ONNX格式。運作時可以在Linux,Windows和Mac上運作,并且可以在各種晶片體系結構上運作。它還可以利用諸如GPU和TPU之類的硬體加速器。但是,沒有針對作業系統,晶片體系結構和加速器的每種組合的安裝包,是以,如果不使用任何一種常見組合,則可能需要從源代碼建構運作時。檢查ONNX運作時網站以獲得所需組合的安裝說明。本文将展示如何在具有預設CPU的x64體系結構和具有GPU的x64體系結構上安裝ONNX Runtime。

除了可以在許多硬體配置上運作之外,還可以從大多數流行的程式設計語言中調用運作時。本文的目的是展示如何在C#中使用ONNX Runtime。我将展示如何安裝onnxruntime軟體包。安裝ONNX Runtime後,我會将先前導出的MNIST模型加載到ONNX Runtime中,并使用它進行預測。

安裝和導入ONNX運作時

在使用ONNX Runtime之前,您需要安裝Microsoft.ML.OnnxRuntime,它是一個NuGet軟體包。如果尚未安裝.NET CLI,則還需要安裝它。以下指令将運作時安裝在具有預設CPU的x64體系結構上:

dotnet add package microsoft.ml.onnxruntime           

要将運作時安裝在帶有GPU的x64架構上,請使用以下指令:

dotnet add package microsoft.ml.onnxruntime.gpu           

一旦安裝了運作時,就可以使用以下using語句将其導入到C#代碼檔案中:

using Microsoft.ML.OnnxRuntime;
using Microsoft.ML.OnnxRuntime.Tensors;           

引入Tensor工具的using語句将幫助我們為ONNX模型建立輸入,并解釋ONNX模型的輸出(預測)。

載入ONNX模型

下面的代碼段顯示了如何将ONNX模型加載到以C#運作的ONNX運作時中。此代碼建立可用于進行預測的會話對象。這裡使用的模型是從PyTorch導出的ONNX模型。

這裡有幾件事值得注意。首先,您需要查詢會話以擷取其輸入。這是使用會話的InputMetadata屬性完成的。我們的MNIST模型隻有一個輸入參數:784個浮點數組,代表MNIST資料集中的一張圖像。如果您的模型有多個輸入參數,則InputMetadata的每個參數都有一個條目。

Utilities.LoadTensorData();
string modelPath = Directory.GetCurrentDirectory() + @"/pytorch_mnist.onnx";

using (var session = new InferenceSession(modelPath))
{
   float[] inputData = Utilities.ImageData[imageIndex];
   string label = Utilities.ImageLabels[imageIndex];
   Console.WriteLine("Selected image is the number: " + label);

   var inputMeta = session.InputMetadata;
   var container = new List<NamedOnnxValue>();

   foreach (var name in inputMeta.Keys)
   {
      var tensor = new DenseTensor<float>(inputData, inputMeta[name].Dimensions);
      container.Add(NamedOnnxValue.CreateFromTensor<float>(name, tensor));
   }

   // Run code omitted for brevity.
}           

上面的代碼未顯示用于讀取原始MNIST圖像并将每個圖像轉換為784個浮點數組的實用程式。還可以從MNIST資料集中讀取每個圖像的标簽,以便可以确定預測的準确性。該代碼是标準的.NET代碼,但仍然鼓勵您檢出并使用它。如果您需要讀入與MNIST資料集相似的圖像,它将節省您的時間。

使用ONNX運作時進行預測

以下函數顯示了如何使用在加載ONNX模型時建立的ONNX會話:

{
   // Load code not shown for brevity.

   // Run the inference
   using (var results = session.Run(container))
   {
      // Get the results
      foreach (var r in results)
      {
         Console.WriteLine("Output Name: {0}", r.Name);
         int prediction = MaxProbability(r.AsTensor<float>());
         Console.WriteLine("Prediction: " + prediction.ToString());
      }
   }
}           

大多數神經網絡不會直接傳回預測。它們傳回每個輸出類的機率清單。對于我們的MNIST模型,每個圖像的傳回值将是10個機率的清單。可能性最高的條目是預測。您可以做的一個有趣的測試是,将ONNX模型在建立模型的架構中運作時傳回的機率與從原始模型傳回的機率進行比較。理想情況下,模型格式和運作時的更改不應更改所産生的任何機率。這将使每當模型發生更改時都可以運作良好的單元測試。

摘要和後續步驟

在本文中,我簡要介紹了ONNX運作時和ONNX格式。然後,我展示了如何在ONNX Runtime中使用C#加載和運作ONNX模型。

本文的代碼示例包含一個工作的控制台應用程式,該應用程式示範了此處顯示的所有技術。此代碼示例是GitHub存儲庫的一部分,該存儲庫探讨了使用神經網絡預測MNIST資料集中發現的數字。具體來說,有一些示例顯示了如何在Keras,PyTorch,TensorFlow 1.0和TensorFlow 2.0中建立神經網絡。

如果您想了解有關導出為ONNX格式和使用ONNX Runtime的更多資訊,請查閱本系列的其他文章。

參考文獻

  • https://docs.microsoft.com/zh-cn/dotnet/core/tutorials/with-visual-studio-code
  • https://docs.microsoft.com/zh-cn/nuget/quickstart/install-and-use-a-package-using-the-dotnet-cli
  • https://code.visualstudio.com/docs/setup/mac
  • https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet
  • https://microsoft.github.io/onnxruntime/
  • https://github.com/microsoft/onnxruntime/blob/master/docs/CSharp_API.md#getting-started
  • https://github.com/keithpij/onnx-lab

繼續閱讀