Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticinin önceki bölümünde, BIR modeli ONNX biçiminde derlemeyi ve dışarı aktarmayı öğrendiniz. Şimdi, dışarı aktarılan modelinizi bir Windows uygulamasına eklemeyi ve Windows ML API'lerini çağırarak bir cihazda yerel olarak çalıştırmayı göstereceğiz.
bitirdiğimizde, çalışan bir veri analizi uygulamasına sahip olacaksınız.
Örnek uygulama hakkında
Öğreticinin bu adımında, Irises tablo verilerini çözümleyebilecek bir uygulama oluşturacaksınız. Uygulama, excel dosyasını gerekli giriş bilgileriyle eklemenize veya giriş parametrelerini (Iris'in sepal ve petal cm cinsinden uzunluğu ve genişliği) el ile girmenize olanak sağlar. Bu özellikler, önceki bölümde oluşturup eğitmiş olduğunuz yerel olarak depolanan bir sinir ağı ONNX modeli tarafından işlenir. Model çıkışına bağlı olarak uygulama doğru Iris türünü görüntüler.
Burada, bu süreçte size yol gösteririz.
Uyarı
Önceden tanımlanmış kod örneğini kullanmayı seçerseniz çözüm dosyasını kopyalayabilirsiniz. Depoyu kopyalayın, bu örneğe gidin ve dosyayı Visual Studio ile açın.Kullanımda Iris Data Analysis.csproj görmek için bu sayfanın Uygulamayı Başlat bölümüne atlayın.
Aşağıda uygulamanızı oluşturma ve Windows ML kodu ekleme konusunda size yol göstereceğiz.
Windows ML Desktop (C#) uygulaması oluşturma
Çalışan bir Windows ML uygulaması oluşturmak için aşağıdakileri yapmanız gerekir:
- Makine öğrenmesi modeli yükleme.
- Modelin girişlerini ve çıkışlarını bağlayın.
- Modeli değerlendirin ve anlamlı sonuçlar görüntüleyin.
Ayrıca daha iyi bir kullanıcı deneyimi sağlamak için temel bir kullanıcı arabirimi oluşturmanız gerekir.
Visual Studio'da yeni bir proje açma
- Haydi başlayalım. Visual Studio'yu açın ve öğesini seçin
Create a new project.
- Arama çubuğunda diliniz,
C#hedef platformunuz veWindowsproje türünüz olarak seçinDektop.NUnit Test Project (.NET Core)Proje türünüz olarak seçin ve proje için bir yapılandırma penceresi açmak için seçinnext.
- Yapılandırma penceresinde aşağıdakileri yapın:
- Projenize bir ad verin. Burada buna Iris Veri Analizi diyoruz.
- Projenizin konumunu seçin.
- VS2019 kullanıyorsanız işaretli olduğundan emin olun
Create directory for solution. - VS2017 kullanıyorsanız
Place solution and project in the same directoryişaretli olmadığından emin olun.
Projenizi oluşturmak için basın create . Minimum hedef sürüm penceresi açılabilir. En düşük sürümünüzün Windows 10, sürüm 1809 (10.0; derleme 17763) veya üzeri olarak ayarlandığından emin olun.
- Proje oluşturulduktan sonra proje klasörüne gidin, assets klasörünü
[….\DataClassifier\Assets]açın ve dosyanızıNetwork.onnxbu konuma kopyalayın.
Proje çözümünü keşfetme
Şimdi proje çözümünüzü inceleyelim.
Visual Studio, Çözüm Gezgini'nin içinde otomatik olarak birkaç cs-code dosyası oluşturmuştur.
MainPage.xaml GUI'nizin XAML kodunu ve MainPage.xaml.cs uygulama kodunuzu içerir. Daha önce bir UWP uygulaması oluşturduysanız, bu dosyalar size çok tanıdık geliyor olmalıdır.
Dosyamızı Network.onnx assets klasörüne eklemiş olsak da dosyayı bu projeye düzgün bir şekilde eklememiz gerekir.
- Çözüm Gezgini'nde Varlıklar klasörüne sağ tıklayın ve öğesini seçin
Add > Existing Item. -
Iris Data Analysis [….\Iris Data Analysis \Assets]içindeki Varlıklar klasörüne gidin, daha önce buraya kopyaladığınızNetwork.onnx modelöğesini bulun veAddseçin. - Uygulamanızı derlerken modelin oluşturulduğundan emin olmak için
Network.onnxdosyasına sağ tıklayın vePropertiesöğesini seçin.Build ActionayarınıContentyapın.
Ayrıca, Windows ML API'lerini çağıracak sınıfları ve yöntemleri içeren bazı ek makine öğrenmesi kodunu barındırmak için yeni bir cs-code sınıf dosyası oluşturmanız gerekir.
- Visual Studio'da çözüm adına sağ tıklayın ve
addilenew itemöğesini seçin. Açık penceredeClassseçin ve bir ad verin - buradaIrisModel.cskullanıyoruz. Projeniz kapsamında yeni bir sınıf dosyası itiraz edecektir.
.
Machine Learning kodu oluşturma
Bu adımda, Windows Machine Learning API'lerini çağıracak tüm sınıfları ve yöntemleri oluşturacağız. Bunlar, projenizdeki bir ONNX makine öğrenmesi modelini yüklemenize, bağlamanıza ve değerlendirmenize olanak verir.
Dosyaya
IrisModel.csçift tıklayın.İhtiyacınız olacak tüm API'lere erişmek için using deyimlerini aşağıdakilerle değiştirin.
using System;
using System.Linq;
using System.Threading.Tasks;
using Windows.AI.MachineLearning;
using Windows.Storage;
Makine öğrenmesi sınıflarını başlatma
Windows Machine Learning API'leriyle etkileşim kurmanıza yardımcı olması için IrisModel.cs birkaç sınıf eklememiz gerekir.
Eğitilmiş makine öğrenmesi modeline erişmek için LearningModel sınıfını kullanacağız. Bu sınıf ad alanının Windows.AI.MachineLearning bir parçasıdır ve eğitilmiş bir makine öğrenmesi modelini temsil eder. Oluşturulduğunda, LearningModel Windows ML API'leriyle etkileşim kurmak için kullandığınız ana nesnedir.
Öğrenme modelini değerlendirmek için bir değerlendirme oturumu oluşturmanız gerekir. Bunu yapmak için LearningModelSession sınıfını kullanırsınız. Bu sınıf makine öğrenmesi modellerini değerlendirmek için kullanılır ve modeli çalıştıran ve modeli değerlendiren bir cihaza bağlar. Bu API ile oturum oluşturduğunuzda modelinizi yürütmek için bir cihaz da seçebilirsiniz (varsayılan değer CPU'nuzdur).
Ayrıca, makine öğrenmesi modellerinizin çıktısının etiketlerini belirtmeniz gerekir. Bu etiketleri modelin tahmin edilen çıkışına daha sonra bağlayabilirsiniz.
Uyarı
ve LearningModel sınıfları hakkında LearningModelSession daha fazla bilgi edinmek için lütfen LearningModel sınıf belgelerini ve LearningModelSession sınıfı belgelerini gözden geçirin.
- Aşağıdaki kodu dosyaya
IrisModel.cskopyalayın.
class IrisModel
{
private LearningModel _learning_model;
private LearningModelSession _session;
private String[] _labels = { "Iris-setosa", "Iris-versicolor", "Iris-virginica"};
Modeli Yükleme
Ardından makine öğrenmesi modelini yüklemeniz ve yeni tanımladığınız sınıflarla gerçekleştirebileceğiniz bir oturum oluşturmanız gerekir. Modeli yüklemek için sınıfın LearningModel birkaç statik yöntemini kullanacaksınız. Bizim örneğimizde, bir ONNX modelini zaman uyumsuz olarak yüklemenizi sağlayan ISorageFile kullanacağız.
Uyarı
Modeli yüklemenin ek yolları hakkında daha fazla bilgi edinmek için lütfen Model yükleme belgelerini gözden geçirin.
- Aşağıdaki kodu dosyaya
IrisModel.cskopyalayın.
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);
}
Model girişi tensor'ını tanımlama
Şimdi model gereksinimlerinize göre doğru girişi tanımlayacağız. Önceki bölümde oluşturduğunuz ağ modelinin dört giriş değeri vardır. Her giriş değeri, dört iris özelliğinin olası boyutlarını temsil eder: cm cinsinden sepal uzunluk, cm cinsinden sepal genişlik, cm'de taçyaprağı uzunluğu ve cm cinsinden taçyaprağı genişliği. Bu girişe bağlı olarak model, bu parametrelere en uygun iris türünü döndürür. Giriş değerlerinin boyutunu geçerli mantıksal değerlerle sınırlamanız gerekir. Bu öğreticide aşağıdakileri kullanacağız:
- sepal uzunluğu - 1cm ile 100cm
- sepal genişlik – 1cm - 8cm
- petal uzunluğu – 0,5cm - 10cm
- petal genişliği – 0,1cm - 5cm
- Aşağıdaki kodu dosyaya
IrisModel.cskopyalayın.
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;
}
}
}
Windows ML API'leri ONNX modelleri tarafından desteklenen dört açıklayıcı sınıfın giriş değerlerini kabul eder: tensorlar, diziler, haritalar ve görüntüler. Bu durumda model, float32[batch_size,4] şeklinde 32 bit tensor float nesnesi gerektirir. Küme boyutu 1 olduğundan, giriş tensör şekli [1x4] şeklindedir.
Tensor girişi oluşturmak için TensorFloat sınıfını kullanacaksınız.
TensorFloat sınıfı, Windows.AI.MachineLearning ad alanının bir parçasıdır ve 32-bit kayan nokta değerlerinin tensor'u olan bir 32-bit float tensor nesnesini tanımlamak için kullanılır. Bu sınıf, bir tensor oluşturmak için birkaç yararlı yöntem içerir. Sizin örneğinizde CreateFromArray yöntemini kullanarak modelinizin tam olarak gerektirdiği boyutta bir tensor girişi oluşturacaksınız. Bu çağrıyı değerlendirme yöntemine ekleyeceğiz.
Modeli bağlama ve değerlendirme
Artık model giriş tensor'unu tanımlayıp eğitilen modeli ve oturumu örneklediğinize göre, eğitilen makine öğrenmesi modelini bağlamak ve değerlendirmek için bir yöntem oluşturmanın zamanı geldi.
Bu yöntem, bir makine öğrenmesi uygulamasının temel parçasıdır. Giriş değerlerinin tensorizasyonunu ve model girişinin bağlamasını içerir. Bu modeli daha sonra uygulama kodunuzda kullanarak modelinizi değerlendireceksiniz.
Giriş ve çıkış bağlamak için sınıfını LearningModelBinding kullanırsınız. Makine öğrenmesi modeli, bilgileri modele aktaran ve modelden dışarı aktaran giriş ve çıkış özelliklerine sahiptir. Gerekli özelliklerin Windows ML API'leri tarafından desteklenmesi gerektiğini unutmayın.
LearningModelBinding sınıfı, değerleri adlandırılmış giriş ve çıkış özelliklerine bağlamak için LearningModelSession öğesine uygulanır.
sınıfı, LearningModelBinding değerleri bu adlandırılmış özelliklere bağlamak için kullanabileceğiniz önceden tanımlanmış birkaç yönteme sahiptir. Burada, modelinize değerleri bağlamak için yöntemini kullanacaksınız Bind .
Modelinizi değerlendirmek ve ondan sonuçlar almak için, LearningModelSession içindeki uygun önceden tanımlanmış değerlendirme yöntemlerini çağırırsınız - sizin durumunuzda, Evaluate yöntemi. Bu yöntem, sınıfı tarafından LearningModelBinding sağlanan özellik değerlerini kullanarak makine öğrenmesi modelini değerlendirerek ihtiyacınız olan işlevselliği sağlar.
Uyarı
Modeli çalıştırmak için başka bir değerlendirme yöntemi hakkında bilgi edinmek için lütfen LearningModelSession Sınıfı belgelerini gözden geçirerek LearningModelSession'da hangi yöntemlerin uygulanabileceğini denetleyin.
Sonuçları ayıklama ve görüntüleme
Model, tensor biçiminde tahmin edilen değerleri Tensor float çıkışı olarak döndürür. Şimdi model çıkışını ayıklamanız ve doğru sonuçları görüntülemeniz gerekir. Bunu yapmak için, işlevi önceden belirtilen çıkışta çalıştırarak tensor biçimini vektöre GetAsVectorView() dönüştüreceksiniz.
Model, her biri belirli bir iris türünü temsil eden üç olasılık değeri döndürür. En yüksek olasılığa sahip etiketi döndürmeniz gerekir.
- Aşağıdaki kodu dosyaya
IrisModel.cskopyalayın.
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);
}
Kodunuzun makine öğrenmesi bölümünü tamamladınız. Artık modelinizi Windows uygulamasıyla kolayca tümleştirebilirsiniz. Bu öğreticinin son bölümünde, önceden oluşturduğunuz yöntemleri kullanarak modeli test etmek için temel bir Windows GUI ve denetim kodu sağladık.
Uygulama GUI'sini oluşturma
Uygulamanız için bir GUI uygulama kodu oluşturmak için kod dosyasına çift tıklayın
MainPage.xamlve GUI'niz için önceden tanımlanmış bir şablon açın.Aşağıdaki kodu
MainPage.xamlkopyalayıp satırın altına yapıştırın“Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" " Height="939">.
<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>
Uygulama denetimini oluşturma
uygulama denetim kodu, MainPage.xaml.csuygulamayı çalıştırmak için ana yöntemi ve modelinizi çalıştırmak ve çıkışı yürütmek için birkaç adım içerir:
- Bu öğreticide daha önce oluşturduğunuz sınıfın
IrisModelyeni bir nesnesinin örneğini oluşturacaksınız. - Model üzerinde önceki bölümde oluşturduğunuz
Evaluate()yöntemini çağıracaksınız. Bu yöntem, giriş parametrelerinin her birine birer tane olmak üzere dört kez uygulanır: sepal uzunluk, sepal genişlik, yaprakların uzunluğu ve yaprakların genişliği.
Uygulama, makine öğrenmesi tahmin algoritmasına göre sonucu görüntüler.
- Uygulama denetim kodu oluşturmak için kod dosyasına çift tıklayın
MainPage.xaml.csve aşağıdaki kodu ekleyin.
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();
}
}
}
}
Uygulamayı başlatma
Artık uygulamanızı başlatmaya ve sonuçları görmeye hazırsınız.
Visual Studio'dan geliştirici modunu etkinleştirin ve uygulamanızı test edin. Üst araç çubuğundaki açılan menülerin Debug olarak ayarlandığından emin olun. Cihazınız 64 bitse projeyi yerel makinenizde çalıştırmak için Çözüm Platformu'nun x64, 32 bit ise x86 olarak değiştirin.
Uygulama GUI'sinde gerekli parametrelerin girişini değiştirmek için dört kaydırıcı bulunur. Girişteki herhangi bir değişiklik, tahmin algoritmasını temel alan yeni bir çıkış oluşturur. Çıkış, giriş kaydırıcılarının altında görüntülenir.
Sepals uzunluğu = 40 mm, sepals genişliği = 50, petal uzunluğu = 75 ve petal genişliği = 15 olan girdiye, uygulamanın Iris-versicolor türü girdisi olarak yanıt verdiğini görebilirsiniz.
Özet
Model oluşturma aşamasından başarılı yürütmeye kadar ilk Windows Machine Learning uygulamanızı yaptınız.
Ek Kaynaklar
Bu öğreticide bahsedilen konular hakkında daha fazla bilgi edinmek için aşağıdaki kaynakları ziyaret edin:
- Windows ML araçları: Windows ML Panosu, WinMLRunner ve mglen Windows ML kod oluşturucu gibi daha fazla araç öğrenin.
- ONNX modeli: ONNX biçimi hakkında daha fazla bilgi edinin.
- Windows ML performansı ve belleği: Windows ML ile uygulama performansını yönetme hakkında daha fazla bilgi edinin.
- Windows Machine Learning API başvurusu: Windows ML API'lerinin üç alanı hakkında daha fazla bilgi edinin.