Bagikan melalui


Menyebarkan model analisis data Anda di aplikasi Windows dengan API Windows ML

Di bagian sebelumnya dari tutorial ini, Anda mempelajari cara membangun dan mengekspor model dalam format ONNX. Sekarang, kami akan menunjukkan kepada Anda cara menyematkan model yang diekspor ke dalam aplikasi Windows, dan menjalankannya secara lokal di perangkat dengan memanggil API Windows ML.

Pada saat kami selesai, Anda akan memiliki aplikasi analisis data yang berfungsi.

Tentang aplikasi sampel

Dalam langkah tutorial ini, Anda akan membuat aplikasi yang dapat menganalisis data tabular Irises. Aplikasi ini akan memungkinkan Anda untuk menambahkan file excel dengan informasi input yang diperlukan atau memasukkan parameter input secara manual - panjang dan lebar sepal dan kelopak Iris dalam cm. Fitur-fitur ini akan diproses oleh model ONNX jaringan neural yang disimpan secara lokal yang Anda buat dan latih di bagian sebelumnya. Berdasarkan output model, aplikasi akan menampilkan jenis Iris yang benar.

Di sini, kami akan memandul Anda melalui proses itu.

Catatan

Jika Anda memilih untuk menggunakan sampel kode yang telah ditentukan sebelumnya, Anda dapat mengkloning file solusi. Kloning repositori, navigasikan ke sampel ini, dan buka Iris Data Analysis.csproj file dengan Visual Studio.Lewati ke Luncurkan bagian Aplikasi dari halaman ini untuk melihatnya digunakan.

Di bawah ini, kami akan memandu Anda cara membuat aplikasi dan menambahkan kode Windows ML.

Membuat aplikasi Windows ML Desktop (C#)

Untuk membuat aplikasi Windows ML yang berfungsi, Anda harus melakukan hal berikut:

  • Muat model pembelajaran mesin.
  • Ikat input dan output model.
  • Mengevaluasi model dan menampilkan hasil yang bermakna.

Anda juga harus membuat antarmuka pengguna dasar, untuk memberikan pengalaman pengguna yang lebih baik.

Membuka proyek baru dalam Visual Studio

  1. Mari kita mulai. Buka Visual Studio dan pilih Create a new project.

Create new Visual Studio project

  1. Di bilah pencarian, pilih C# sebagai bahasa Anda, Windows sebagai platform target Anda, dan Dektop sebagai jenis proyek Anda. Pilih NUnit Test Project (.NET Core) sebagai jenis proyek Anda, dan pilih next untuk membuka jendela konfigurasi untuk proyek.

Create new NUnit Test Project app

  1. Di jendela konfigurasi, lakukan hal berikut:
  • Beri nama proyek Anda. Di sini, kami menyebutnya Iris Data Analysis.
  • Pilih lokasi proyek Anda.
  • Jika Anda menggunakan VS2019, pastikan Create directory for solution dicentang.
  • Jika Anda menggunakan VS2017, pastikan Place solution and project in the same directory tidak dicentang.

Tekan create untuk membuat proyek Anda. Jendela versi target minimum dapat muncul. Pastikan versi minimum Anda diatur ke Windows 10, versi 1809 (10.0; build 17763) atau yang lebih tinggi.

  1. Setelah proyek dibuat, navigasikan ke folder proyek, buka folder aset , dan salin file Anda Network.onnx [….\DataClassifier\Assets]ke lokasi ini.

Menjelajahi solusi proyek

Mari kita jelajahi solusi proyek Anda.

Visual Studio secara otomatis membuat beberapa file kode cs di dalam Penjelajah Solusi. MainPage.xaml berisi kode XAML untuk GUI Anda, dan MainPage.xaml.cs berisi kode aplikasi Anda. Jika Anda telah membuat aplikasi UWP sebelumnya, file-file ini harus sangat akrab bagi Anda.

Meskipun kami telah menambahkan file kami Network.onnx ke folder aset, kita perlu menambahkannya dengan benar ke proyek ini.

  1. Klik kanan pada folder Aset di Penjelajah Solusi dan, pilih Add > Existing Item.
  2. Navigasikan ke folder Aset di dalam Iris Data Analysis [….\Iris Data Analysis \Assets], temukan yang Network.onnx model sebelumnya Anda salin di sana, dan pilih Add.
  3. Untuk memastikan model dibuat saat Anda mengkompilasi aplikasi, klik kanan pada Network.onnx file dan pilih Properties. Atur Build Action ke Content.

Anda juga harus membuat file kelas kode cs baru untuk mengakomodasi beberapa kode pembelajaran mesin tambahan, yang mencakup kelas dan metode yang akan memanggil API Windows ML.

  1. Klik kanan pada nama solusi di Visual Studio, dan pilih add dan new item. Di jendela terbuka, pilih Class dan beri nama - di sini, kami menggunakan IrisModel.cs. File kelas baru akan menarik di bawah proyek Anda.

Add a new class file to your VS project.

Membuat kode Pembelajaran Mesin

Dalam langkah ini, kita akan membuat semua kelas dan metode yang akan memanggil WINDOWS Pembelajaran Mesin API. Ini akan memungkinkan Anda memuat, mengikat, dan mengevaluasi model pembelajaran mesin ONNX dalam proyek Anda.

  1. Klik dua kali pada IrisModel.cs file.

  2. Ganti pernyataan penggunaan dengan yang berikut ini, untuk mendapatkan akses ke semua API yang akan Anda butuhkan.

using System;
using System.Linq;
using System.Threading.Tasks;
using Windows.AI.MachineLearning;
using Windows.Storage;

Menginisialisasi kelas pembelajaran mesin

Kita harus menambahkan beberapa kelas untuk IrisModel.cs membantu Anda berinteraksi dengan Windows Pembelajaran Mesin API.

Untuk mendapatkan akses ke model pembelajaran mesin terlatih, kita akan menggunakan kelas .LearningModel Kelas ini adalah bagian Windows.AI.MachineLearning dari namespace layanan, dan mewakili model pembelajaran mesin terlatih. Setelah dibuat, LearningModel adalah objek utama yang Anda gunakan untuk berinteraksi dengan API Windows ML.

Untuk mengevaluasi model pembelajaran, Anda harus membuat sesi evaluasi. Untuk melakukannya, Anda menggunakan LearningModelSession kelas . Kelas ini digunakan untuk mengevaluasi model pembelajaran mesin, dan mengikat model ke perangkat yang kemudian menjalankan dan mengevaluasi model. Saat membuat sesi dengan API ini, Anda juga dapat memilih perangkat untuk menjalankan model Anda (defaultnya adalah CPU Anda).

Selain itu, Anda harus menentukan label output model pembelajaran mesin Anda. Anda dapat menyambungkan label tersebut ke output model yang diprediksi nanti.

Catatan

Untuk mempelajari selengkapnya tentang LearningModel kelas dan LearningModelSession , silakan tinjau dokumentasi kelas Pembelajaran Model dan dokumentasi kelas Pembelajaran ModelSession.

  1. Salin kode berikut ke IrisModel.cs file.
class IrisModel
    {
        private LearningModel _learning_model;
        private LearningModelSession _session;
        private String[] _labels = { "Iris-setosa", "Iris-versicolor", "Iris-virginica"};

Muat Model

Selanjutnya, Anda harus memuat model pembelajaran mesin dan membuat sesi, yang akan Anda lakukan dengan kelas yang baru saja Anda tentukan. Untuk memuat model, Anda akan menggunakan beberapa metode LearningModel statis kelas - dalam kasus kami, kami akan menggunakan LoadFromStorageFileAsync, yang memungkinkan Anda memuat model ONNX dari secara asinkron ISorageFile .

Catatan

Untuk mempelajari selengkapnya tentang cara tambahan memuat model, silakan tinjau dokumentasi Muat model.

  1. Salin kode berikut ke IrisModel.cs file.
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);
}

Menentukan tensor input model

Sekarang, kami akan menentukan input yang benar berdasarkan persyaratan model Anda. Model jaringan yang Anda bangun di bagian sebelumnya memiliki empat nilai input. Setiap nilai input mewakili kemungkinan ukuran empat fitur iris: panjang sepal dalam cm, lebar sepal dalam cm, panjang kelopak dalam cm, dan lebar kelopak dalam cm. Berdasarkan input ini, model akan mengembalikan jenis iris yang paling sesuai dengan parameter tersebut. Anda harus membatasi ukuran nilai input ke nilai logis yang valid - untuk tutorial ini, kita akan menggunakan yang berikut:

  • panjang sepal - 1cm hingga 100cm
  • lebar sepal – 1cm hingga 8cm
  • panjang kelopak – 0,5cm hingga 10cm
  • lebar kelopak – 0,1cm hingga 5cm
  1. Salin kode berikut ke IrisModel.cs file.
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;
        }
    }
}

API ML Windows menerima nilai input dari empat kelas deskriptif yang didukung oleh model ONNX: tensor, urutan, peta, dan gambar. Dalam hal ini, model memerlukan objek float tensor 32-bit dalam bentuk float32[batch_size,4]. Karena ukuran batch adalah 1, bentuk tensor input adalah [1x4].

Untuk membuat input tensor, Anda akan menggunakan kelas TensorFloat .

Kelas TensorFloat adalah bagian Windows.AI.MachineLearning dari namespace layanan, dan digunakan untuk menentukan objek tensor float 32-bit - tensor nilai floating point 32-bit. Kelas ini berisi beberapa metode yang berguna untuk membangun tensor. Dalam kasus Anda, Anda akan menggunakan metode CreateFromArray untuk membangun input tensor dalam ukuran yang tepat yang diperlukan model Anda. Kami akan menambahkan panggilan tersebut dalam metode evaluasi.

Mengikat dan Mengevaluasi model

Sekarang setelah Anda menentukan tensor input model dan membuat instans model dan sesi terlatih, saatnya untuk membuat metode untuk mengikat dan mengevaluasi model pembelajaran mesin terlatih.

Metode ini adalah bagian utama dari aplikasi pembelajaran mesin. Ini termasuk tensorisasi nilai input dan pengikatan input model. Anda akan menggunakan model ini nanti dalam kode aplikasi untuk mengevaluasi model Anda.

Untuk mengikat input dan output, Anda menggunakan LearningModelBinding kelas . Model pembelajaran mesin memiliki fitur input dan output, yang meneruskan informasi ke dalam dan ke luar model. Ketahuilah bahwa fitur yang diperlukan harus didukung oleh API Windows ML. Kelas LearningModelBinding diterapkan pada nilai yang LearningModelSession mengikat ke fitur input dan output bernama.

Kelas LearningModelBinding ini memiliki beberapa metode yang telah ditentukan sebelumnya yang dapat Anda gunakan untuk mengikat nilai ke fitur bernama tersebut. Di sini, Anda akan menggunakan Bind metode untuk mengikat nilai ke model Anda.

Untuk mengevaluasi model Anda dan menerima hasil darinya, Anda memanggil metode evauasi yang telah ditentukan sebelumnya dari LearningModelSession - dalam kasus Anda, metode .Evaluate Metode ini akan menyediakan fungsionalitas yang Anda butuhkan, mengevaluasi model pembelajaran mesin menggunakan nilai fitur yang disediakan oleh LearningModelBinding kelas .

Catatan

Untuk mempelajari tentang metode evaluasi lain untuk menjalankan model, silakan periksa metode mana yang dapat diimplementasikan pada Pembelajaran ModelSession dengan meninjau dokumentasi Kelas Pembelajaran ModelSession.

Mengekstrak dan menampilkan hasilnya

Model mengembalikan nilai yang diprediksi dalam format tensor sebagai output float Tensor. Anda sekarang perlu mengekstrak output model dan menampilkan hasil yang tepat. Untuk melakukan ini, Anda akan mengonversi format tensor ke vektor dengan menjalankan GetAsVectorView() fungsi pada output berpredikat.

Model mengembalikan tiga nilai probabilitas, masing-masing mewakili satu jenis iris tertentu. Anda harus mengembalikan label dengan probabilitas tertinggi.

  1. Salin kode berikut ke IrisModel.cs file.
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);
}

Anda sekarang telah menyelesaikan bagian pembelajaran mesin dari kode Anda. Sekarang, Anda dapat dengan mudah mengintegrasikan model Anda dengan aplikasi Windows. Di bagian terakhir tutorial ini, kami telah menyediakan GUI Windows dasar dan kode kontrol untuk menguji model, menggunakan metode yang telah Anda buat.

Membuat GUI aplikasi

  1. Untuk membuat kode aplikasi GUI untuk aplikasi Anda, klik dua kali pada MainPage.xaml file kode dan buka templat yang telah ditentukan untuk GUI Anda.

  2. Salin-tempel kode di bawah ini ke MainPage.xaml, di “Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" " Height="939"> bawah baris.

    <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>

Membuat kontrol aplikasi

Kode kontrol aplikasi, MainPage.xaml.cs, mencakup metode utama untuk menjalankan aplikasi, dan beberapa langkah untuk menjalankan model Anda dan menjalankan output:

  1. Anda akan membuat instans objek baru dari IrisModel kelas yang telah Anda buat sebelumnya dalam tutorial ini.
  2. Anda akan memanggil metode yang Evaluate() Anda buat di bagian sebelumnya pada model. Metode ini akan diterapkan empat kali, satu pada setiap parameter input: panjang sepal, lebar sepal, panjang kelopak, dan lebar kelopak.

Aplikasi ini akan menampilkan hasilnya berdasarkan algoritma prediksi pembelajaran mesin.

  1. Untuk membuat kode kontrol aplikasi, klik MainPage.xaml.cs dua kali file kode dan tambahkan kode berikut.
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();
            }
        }
    }
}

Luncurkan aplikasi tersebut

Sekarang Anda siap untuk meluncurkan aplikasi Anda dan melihat hasilnya.

Aktifkan mode pengembang dan uji aplikasi Anda dari Visual Studio. Pastikan menu dropdown di toolbar atas diatur ke Debug. Ubah Platform Solusi ke x64 untuk menjalankan proyek di komputer lokal Anda jika perangkat Anda 64-bit, atau x86 jika 32-bit.

GUI aplikasi menyertakan empat slider untuk mengubah input parameter yang diperlukan. Setiap perubahan input akan menghasilkan output baru berdasarkan algoritma prediksi. Output ditampilkan di bawah penggerak input.

Anda dapat melihat bahwa input panjang sepal = 40mm, lebar sepal = 50, panjang kelopak = 75, dan lebar kelopak = 15, aplikasi menghasilkan input jenis Iris-versicolor!

Successful classification in your app

Ringkasan

Anda baru saja membuat aplikasi Windows Pembelajaran Mesin pertama Anda, dari pembuatan model hingga keberhasilan eksekusi.

Sumber Tambahan

Untuk mempelajari selengkapnya tentang topik yang disebutkan dalam tutorial ini, kunjungi sumber daya berikut: