Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V předchozí části tohoto kurzu jste se naučili, jak sestavit a exportovat model ve formátu ONNX. Teď vám ukážeme, jak vložit exportovaný model do aplikace pro Windows a spustit ho místně na zařízení zavoláním rozhraní API pro Windows ML.
Až to dokončíme, budete mít funkční aplikaci pro analýzu dat.
Informace o ukázkové aplikaci
V tomto kroku kurzu vytvoříte aplikaci, která dokáže analyzovat tabulková data Irises. Aplikace vám umožní přidat excelový soubor s požadovanými vstupními informacemi nebo ručně zadat vstupní parametry – délku a šířku sepalu a okvětního lístku Iris v cm. Tyto funkce budou zpracovány místně uloženým modelem neurální sítě ONNX, který jste vytvořili a vytrénovali v předchozí části. Na základě výstupu modelu aplikace zobrazí správný typ Iris.
Tady vás provedeme tímto procesem.
Poznámka:
Pokud se rozhodnete použít předdefinovanou ukázku kódu, můžete naklonovat soubor řešení. Naklonujte úložiště, přejděte do této ukázky a otevřete soubor Iris Data Analysis.csproj v sadě Visual Studio. Přejděte na část Spustit aplikaci na této stránce, abyste ho viděli v akci.
Níže vás provedeme vytvořením aplikace a přidáním kódu Windows ML.
Vytvoření desktopové aplikace Windows ML (C#)
Pokud chcete vytvořit funkční aplikaci Windows ML, musíte udělat toto:
- Načtěte model strojového učení.
- Spojte vstupy a výstupy modelu.
- Vyhodnoťte model a zobrazte smysluplné výsledky.
Budete také muset vytvořit základní uživatelské rozhraní, abyste zajistili lepší uživatelské prostředí.
Otevření nového projektu v sadě Visual Studio
- Pojďme začít. Otevřete Visual Studio a zvolte
Create a new project.
- Na panelu hledání zvolte
C#jako jazyk,Windowsjako cílovou platformu aDektopjako typ projektu. VyberteNUnit Test Project (.NET Core)jako typ projektu a výběremnextotevřete okno konfigurace projektu.
- V okně konfigurace postupujte takto:
- Pojmenujte projekt. Tady ji nazýváme Iris Data Analysis.
- Zvolte umístění projektu.
- Pokud používáte VS2019, zkontrolujte, jestli
Create directory for solutionje zaškrtnuté. - Pokud používáte VS2017, ujistěte se, že
Place solution and project in the same directorynení zaškrtnuto.
Stisknutím create vytvoříte projekt. Může se objevit okno minimální cílové verze. Ujistěte se, že je minimální verze nastavená na Windows 10 verze 1809 (10.0; build 17763) nebo vyšší.
- Po vytvoření projektu přejděte do složky projektu, otevřete složku
[….\DataClassifier\Assets]a zkopírujteNetwork.onnxsoubor do tohoto umístění.
Prozkoumání projektového řešení
Pojďme prozkoumat řešení projektu.
Visual Studio automaticky vytvořilo několik souborů cs-code v Průzkumníku řešení.
MainPage.xaml obsahuje kód XAML pro vaše grafické uživatelské rozhraní a MainPage.xaml.cs obsahuje kód vaší aplikace. Pokud jste předtím vytvořili aplikaci pro UPW, měly by vám tyto soubory být velmi známé.
Když jsme soubor přidali Network.onnx do složky assets, musíme ho do tohoto projektu správně přidat.
- V Průzkumníku řešení klikněte pravým tlačítkem na složku Assets a vyberte
Add > Existing Item. - Přejděte ke složce Assets v
Iris Data Analysis [….\Iris Data Analysis \Assets], najděte tam dříve zkopírovanýNetwork.onnx modela vyberteAdd. - Chcete-li zajistit sestavení modelu při kompilaci aplikace, klikněte pravým tlačítkem myši na
Network.onnxsoubor a vyberteProperties. NastavteBuild ActionnaContent.
Budete také muset vytvořit nový soubor třídy cs-code, který bude obsahovat nějaký další kód strojového učení, který zahrnuje třídy a metody, které budou volat rozhraní API strojového učení systému Windows.
- Klikněte pravým tlačítkem myši na název řešení v sadě Visual Studio a zvolte
addanew item. V otevřeném okně vyberteClassa pojmenujte ho – tady použijemeIrisModel.cs. Nový třídní soubor se objeví pod vaším projektem.
.
Vytvoření kódu machine learningu
V tomto kroku vytvoříme všechny třídy a metody, které budou volat rozhraní API služby Windows Machine Learning. Ty vám umožní načíst, svázat a vyhodnotit model strojového učení ONNX ve vašem projektu.
Poklikejte na
IrisModel.cssoubor.Nahraďte příkazy using následujícím kódem, abyste získali přístup ke všem rozhraním API, která budete potřebovat.
using System;
using System.Linq;
using System.Threading.Tasks;
using Windows.AI.MachineLearning;
using Windows.Storage;
Inicializujte třídy strojového učení
Abychom vám pomohli pracovat s rozhraními API služby Windows Machine Learning, budeme muset přidat několik tříd IrisModel.cs .
K získání přístupu k natrénovanýmu modelu strojového učení použijeme LearningModel třídu. Tato třída je součástí oboru názvů Windows.AI.MachineLearning a představuje trénovaný model strojového učení. Po vytvoření instance je hlavním objektem, LearningModel který používáte k interakci s rozhraními API systému Windows ML.
Abyste mohli model učení vyhodnotit, budete muset vytvořit zkušební relaci. K tomu použijete LearningModelSession třídu. Tato třída se používá k vyhodnocení modelů strojového učení a vytvoří vazbu modelu na zařízení, které pak model spustí a vyhodnotí. Když vytvoříte relaci s tímto rozhraním API, můžete také vybrat zařízení pro spuštění modelu (výchozí hodnota je váš procesor).
Kromě toho budete muset zadat popisky výstupu modelů strojového učení. Tyto popisky můžete později připojit k předpovídanému výstupu modelu.
Poznámka:
Další informace o LearningModel a LearningModelSession třídách najdete v dokumentaci ke třídě LearningModel a dokumentaci ke třídě LearningModelSession.
- Zkopírujte do
IrisModel.cssouboru následující kód.
class IrisModel
{
private LearningModel _learning_model;
private LearningModelSession _session;
private String[] _labels = { "Iris-setosa", "Iris-versicolor", "Iris-virginica"};
Načtení modelu
Dále budete muset načíst model strojového učení a vytvořit relaci, kterou budete provádět s právě definovanými třídami. K načtení modelu použijete několik statických LearningModel metod třídy – v našem případě použijeme LoadFromStorageFileAsync, které vám umožní načíst model ONNX z ISorageFile asynchronně.
Poznámka:
Chcete-li se dozvědět více o dalších způsobech načítání modelu, podívejte se na dokumentaci Načíst model.
- Zkopírujte do
IrisModel.cssouboru následující kód.
public async Task Initialize()
{
// Load and create the model and session
var modelFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets//Network.onnx"));
_learning_model = await LearningModel.LoadFromStorageFileAsync(modelFile);
_session = new LearningModelSession(_learning_model);
}
Definování tensoru vstupu modelu
Teď nadefinujeme správný vstup na základě požadavků modelu. Síťový model, který jste vytvořili v předchozí části, má čtyři vstupní hodnoty. Každá vstupní hodnota představuje možné velikosti čtyř vlastností kosatce: délku kalichu v cm, šířku kalichu v cm, délku okvětního lístku v cm a šířku okvětního lístku v cm. Na základě tohoto vstupu model vrátí typ kosatce, který těmto parametrům nejlépe odpovídá. Pro účely tohoto kurzu budete muset omezit velikost vstupních hodnot na platné logické hodnoty – v tomto kurzu použijeme následující:
- délka sepalu - 1 cm až 100 cm
- sepal width – 1cm až 8cm
- délka okvětní lístky – 0,5 cm až 10 cm
- šířka okvětního lístku – 0,1 cm až 5 cm
- Zkopírujte do
IrisModel.cssouboru následující kód.
private float _sepal_length = 1.0f;
public float Sepal_Length
{
get
{
return _sepal_length;
}
set
{
// validate range [1,10]
if (value >= 1 && value <= 10)
{
_sepal_length = value;
}
}
}
private float _sepal_width = 1.0f;
public float Sepal_Width
{
get
{
return _sepal_width;
}
set
{
// validate range [1, 8]
if (value >= 1 && value <= 8)
{
_sepal_width = value;
}
}
}
private float _petal_length = 0.5f;
public float Petal_Length
{
get
{
return _petal_length;
}
set
{
// validate range [0.5, 10]
if (value >= 0.5 && value <= 10)
{
_petal_length = value;
}
}
}
private float _petal_width = 0.1f;
public float Petal_Width
{
get
{
return _petal_width;
}
set
{
// validate range [0.1, 5]
if (value >= 0.1 && value <= 5)
{
_petal_width = value;
}
}
}
Rozhraní API pro Windows ML přijímají vstupní hodnoty čtyř popisných tříd podporovaných modely ONNX: tensory, sekvence, mapy a obrázky. V tomto případě model vyžaduje 32bitový objekt tensor float ve tvaru float32[batch_size;4]. Vzhledem k tomu, že velikost dávky je 1, vstupní tvar tensoru je [1x4].
K vytvoření tensorového vstupu použijete třídu TensorFloat .
Třída TensorFloat je součástí oboru názvů Windows.AI.MachineLearning a slouží k definování objektu tenzoru s plovoucí desetinnou čárkou o velikosti 32 bitů – tenzoru 32bitových hodnot s plovoucí desetinnou čárkou. Tato třída obsahuje několik užitečných metod pro sestavení tensoru. Ve vašem případě použijete metodu CreateFromArray k sestavení vstupu tensoru v přesné velikosti, kterou váš model vyžaduje. Toto volání přidáme do metody vyhodnocení.
Vytvoření vazby a vyhodnocení modelu
Teď, když jste definovali vstupní tensor modelu a vytvořili instanci vytrénovaného modelu, je čas vytvořit metodu pro propojení a vyhodnocení vytrénovaného modelu.
Tato metoda je klíčovou součástí aplikace strojového učení. Zahrnuje tensorizaci vstupních hodnot a vazby vstupu modelu. Tento model použijete později v kódu aplikace k vyhodnocení modelu.
Pro vázání vstupu a výstupu použijte třídu LearningModelBinding. Model strojového učení má vstupní a výstupní funkce, které předávají informace do a z modelu. Mějte na paměti, že požadovaná funkce musí být podporována rozhraními API systému Windows ML. Třída LearningModelBinding se aplikuje na LearningModelSession k přiřazení hodnot pojmenovaným vstupním a výstupním vlastnostem.
Třída LearningModelBinding má několik předdefinovaných metod, které můžete použít k vytvoření vazby hodnot na tyto pojmenované funkce. V této části použijete metodu Bind k vytvoření vazby hodnot k modelu.
Pokud chcete model vyhodnotit a získat z něj výsledky, využijete relevantní předdefinované metody evaluace z LearningModelSession – ve vašem případě metodu Evaluate. Tato metoda poskytne potřebné funkce a vyhodnotí model strojového učení pomocí hodnot funkcí zadaných LearningModelBinding třídou.
Poznámka:
Další informace o dalších metodách vyhodnocení spuštění modelu najdete v dokumentaci ke třídě LearningModelSession a zkontrolujte, které metody je možné implementovat ve třídě LearningModelSession.
Extrahování a zobrazení výsledků
Model vrátí predikované hodnoty v tensorovém formátu jako výstup typu float tensor. Teď budete muset extrahovat výstup modelu a zobrazit správné výsledky. Uděláte to tak, že převedete formát tensoru na vektor spuštěním GetAsVectorView() funkce na predikovaném výstupu.
Model vrátí tři hodnoty pravděpodobnosti, z nichž každá představuje jeden konkrétní typ duhovky. Budete muset vrátit označení s nejvyšší pravděpodobností.
- Zkopírujte do
IrisModel.cssouboru následující kód.
internal String Evaluate()
{
// input tensor shape is [1x4]
long[] shape = new long[2];
shape[0] = 1;
shape[1] = 4;
// set up the input tensor
float[] input_data = new float[4];
input_data[0] = _sepal_length;
input_data[1] = _sepal_width;
input_data[2] = _petal_length;
input_data[3] = _petal_width;
TensorFloat tensor_float = TensorFloat.CreateFromArray(shape, input_data);
// bind the tensor to "input"
var binding = new LearningModelBinding(_session);
binding.Bind("input", tensor_float);
// evaluate
var results = _session.Evaluate(binding, "");
// get the results
TensorFloat prediction = (TensorFloat)results.Outputs.First().Value;
var prediction_data = prediction.GetAsVectorView();
// find the highest predicted value
int max_index = 0;
float max_value = 0;
for (int i = 0; i < prediction_data.Count; i++)
{
var val = prediction_data.ElementAt(i);
if (val > max_value)
{
max_value = val;
max_index = i;
}
}
// return the label corresponding to the highest predicted value
return _labels.ElementAt(max_index);
}
Dokončili jste část kódu strojového učení. Teď můžete model snadno integrovat s aplikací pro Windows. V poslední části tohoto kurzu jsme poskytli základní grafické uživatelské rozhraní Windows a řídicí kód pro otestování modelu pomocí metod, které jste už vytvořili.
Vytvoření grafického uživatelského rozhraní aplikace
Pokud chcete vytvořit kód aplikace grafického uživatelského rozhraní pro vaši aplikaci, poklikejte na
MainPage.xamlsoubor kódu a otevřete předdefinovanou šablonu grafického uživatelského rozhraní.Zkopírujte následující kód a vložte ho pod
MainPage.xaml“Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" " Height="939">řádek.
<Grid Margin="30,30,30,30">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock x:Name="title" HorizontalAlignment="Left" Text="Data Analysis App - Windows ML" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="32" TextDecorations="Underline" FontWeight="Bold"/>
<TextBlock x:Name="subtitle" HorizontalAlignment="Left" Text="Provide the input :" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="20" Grid.Row="1" FontWeight="Bold"/>
<Grid Grid.Row="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="sepal_length" Text="sepal length in mm [range of 10 - 100]:" VerticalAlignment="Center"/>
<TextBlock x:Name="sepal_width" Text="sepal width in mm [range of 10 - 80]:" VerticalAlignment="Center" Grid.Row="1"/>
<TextBlock x:Name="petal_length" Text="petal length in mm [range of 5 - 100]:" VerticalAlignment="Center" Grid.Row="2"/>
<TextBlock x:Name="petal_width" Text="sepal width in mm [range of 1 - 50]:" VerticalAlignment="Center" Grid.Row="3"/>
<Slider x:Name="sepal_length_input" Minimum="10" Maximum="100" Orientation="Horizontal" Grid.Column="1" Width="200" ValueChanged="sepal_length_input_ValueChanged"/>
<Slider x:Name="sepal_width_input" Minimum="10" Maximum="80" Orientation="Horizontal" Grid.Row="1" Grid.Column="1" Width="200" ValueChanged="sepal_width_input_ValueChanged"/>
<Slider x:Name="petal_length_input" Minimum="5" Maximum="100" Orientation="Horizontal" Grid.Row="2" Grid.Column="1" Width="200" ValueChanged="petal_length_input_ValueChanged"/>
<Slider x:Name="petal_width_input" Minimum="1" Maximum="50" Orientation="Horizontal" Grid.Row="3" Grid.Column="1" Width="200" ValueChanged="petal_width_input_ValueChanged"/>
</Grid>
<TextBlock x:Name="output" Text="Output:" FontSize="20" FontWeight="Bold" Grid.Row="3"/>
<Grid Grid.Row="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="output_subtitle" Text="Based on the information provided, the Iris type is:"/>
<TextBlock x:Name="model_output" Text="Model output" FontStyle="Italic" Grid.Column="1" Margin="10,0,0,0"/>
</Grid>
</Grid>
Vytvoření ovládacího prvku aplikace
Kód řízení aplikace obsahuje MainPage.xaml.cshlavní metodu pro spuštění aplikace a několik kroků pro spuštění modelu a spuštění výstupu:
- Vytvoříte instanci nového objektu
IrisModeltřídy, kterou jste vytvořili dříve v tomto kurzu. - Zavoláte metodu
Evaluate(), kterou jste vytvořili v předchozí části modelu. Tato metoda se použije čtyřikrát, jednou pro každý ze vstupních parametrů: délka kališního lístku, šířka kališního lístku, délka okvětního lístku a šířka okvětního lístku.
Aplikace zobrazí výsledek na základě algoritmu předpovědi strojového učení.
- Pokud chcete vytvořit kód řízení aplikace, poklikejte na
MainPage.xaml.cssoubor kódu a přidejte následující kód.
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace Iris_Data_Analysis
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
private IrisModel _iris_model;
public MainPage()
{
this.InitializeComponent();
_iris_model = new IrisModel();
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
_iris_model.Initialize();
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
}
private void sepal_length_input_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (_iris_model != null)
{
_iris_model.Sepal_Length = (float)sepal_length_input.Value / 10.0f;
model_output.Text = _iris_model.Evaluate();
}
}
private void sepal_width_input_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (_iris_model != null)
{
_iris_model.Sepal_Width = (float)sepal_width_input.Value / 10.0f;
model_output.Text = _iris_model.Evaluate();
}
}
private void petal_length_input_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (_iris_model != null)
{
_iris_model.Petal_Length = (float)petal_length_input.Value / 10.0f;
model_output.Text = _iris_model.Evaluate();
}
}
private void petal_width_input_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (_iris_model != null)
{
_iris_model.Petal_Width = (float)petal_width_input.Value / 10.0f;
model_output.Text = _iris_model.Evaluate();
}
}
}
}
Spuštění aplikace
Teď jste připraveni spustit aplikaci a zobrazit výsledky.
Povolte vývojářský režim a otestujte aplikaci ze sady Visual Studio. Ujistěte se, že jsou rozevírací nabídky na horním panelu nástrojů nastavené na Debug. Změňte platformu řešení na x64 a spusťte projekt na místním počítači, pokud je vaše zařízení 64bitové, nebo x86, pokud je 32bitová.
Grafické uživatelské rozhraní aplikace obsahuje čtyři posuvníky pro změnu vstupu požadovaných parametrů. Jakákoli změna vstupu vygeneruje nový výstup na základě prediktivního algoritmu. Výstup se zobrazí pod vstupními posuvníky.
Vidíte, že pro zadanou délku sepalu = 40 mm, šířku sepalu = 50, délku korunního lístku = 75 a šířku korunního lístku = 15 aplikace vygenerovala výsledek typu Iris-versicolor.
Shrnutí
Právě jste vytvořili svou první aplikaci Windows Machine Learning od vytvoření modelu po úspěšné spuštění.
Další zdroje
Další informace o tématech uvedených v tomto kurzu najdete v následujících zdrojích informací:
- Nástroje Windows ML: Přečtěte si další nástroje, jako je Řídicí panel Windows ML, WinMLRunner a generátor kódu mglen Windows ML.
- Model ONNX: Přečtěte si další informace o formátu ONNX.
- Výkon a paměť Windows ML: Přečtěte si další informace o správě výkonu aplikací pomocí Windows ML.
- Referenční informace k rozhraní API služby Windows Machine Learning: Přečtěte si další informace o třech oblastech rozhraní API služby Windows ML.