Bagikan melalui


Mengikat model

Model pembelajaran mesin memiliki fitur input dan output, yang meneruskan informasi ke dalam dan ke luar model.

Setelah memuat model sebagai LearningModel, Anda dapat menggunakan LearningModel.InputFeatures dan LearningModel.OutputFeatures untuk mendapatkan objek ILearningModelFeatureDescriptor . Ini mencantumkan jenis fitur input dan output model yang diharapkan.

Anda menggunakan LearningModelBinding untuk mengikat nilai ke fitur, merujuk ILearningModelFeatureDescriptor berdasarkan properti Nama - nya.

Video berikut memberikan gambaran singkat tentang fitur pengikatan model pembelajaran mesin.


Jenis fitur

Windows ML mendukung semua jenis fitur ONNX, yang dijumlahkan dalam LearningModelFeatureKind. Ini dipetakan ke kelas deskriptor fitur yang berbeda:

Tensor

Tensor adalah array multi-dimensi, dan tensor yang paling umum adalah tensor float 32-bit. Dimensi tensor adalah row-major, dengan data berdekatan yang dikemas dengan ketat yang mewakili setiap dimensi. Ukuran total tensor adalah produk dari ukuran setiap dimensi.

Urutan

Urutan adalah vektor nilai. Penggunaan umum jenis urutan adalah vektor probabilitas float, yang kembali ditunjukkan oleh beberapa model klasifikasi untuk menunjukkan peringkat akurasi untuk setiap prediksi.

Maps

Peta adalah pasangan kunci/nilai informasi. Model klasifikasi biasanya mengembalikan peta string/float yang menjelaskan probabilitas float untuk setiap nama klasifikasi berlabel. Misalnya, output model yang mencoba memprediksi jenis anjing dalam gambar mungkin .["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6]

Skalar

Sebagian besar peta dan urutan akan memiliki nilai yang bernilai skalar. Ini muncul di mana TensorFeatureDescriptor.Shape.Size adalah nol (0). Dalam hal ini, peta atau urutannya akan berjenis skalar. Yang paling umum adalah float. Misalnya, string ke peta float adalah:

MapFeatureDescriptor.KeyKind == TensorKind.String
MapFeatureDescriptor.ValueDescriptor.Kind == LearningModelFeatureKind.Tensor
MapFeatureDescriptor.ValueDescriptor.as<TensorFeatureDescriptor>().Shape.Size == 0

Nilai fitur peta aktual akan menjadi IMap<string, float>.

Urutan peta

Urutan peta hanyalah vektor pasangan kunci/nilai. Misalnya, urutan peta string-ke-float akan berjenis IVector<IMap<string, float>>. Output prediksi ras ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] anjing di atas adalah contoh urutan peta.

Gambar

Saat bekerja dengan gambar, Anda harus mengetahui format dan tensorisasi gambar.

Format gambar

Model dilatih dengan data pelatihan gambar, dan bobot disimpan dan disesuaikan untuk set pelatihan tersebut. Saat Anda meneruskan input gambar ke dalam model, formatnya harus sesuai dengan format gambar pelatihan.

Dalam banyak kasus, model menjelaskan format gambar yang diharapkan; Model ONNX dapat menggunakan metadata untuk menjelaskan format gambar yang diharapkan.

Sebagian besar model menggunakan format berikut, tetapi ini tidak universal untuk semua model:

  • Image.BitmapPixelFormat: Bgr8
  • Image.ColorSpaceGamma: SRGB
  • Image.NominalPixelRange: NominalRange_0_255

Tensorisasi

Gambar diwakili dalam Windows ML dalam format tensor. Tensorisasi adalah proses mengonversi gambar menjadi tensor dan terjadi selama pengikatan.

Windows ML mengonversi gambar menjadi tensor 4 dimensi float 32-bit dalam "format tensor NCHW":

  • N: Ukuran batch (atau jumlah gambar). Windows ML saat ini mendukung ukuran batch N 1.
  • C: Jumlah saluran (1 untuk Gray8, 3 untuk Bgr8).
  • H: Tinggi.
  • W: Lebar.

Setiap piksel gambar adalah angka warna 8-bit yang disimpan dalam rentang 0-255 dan dikemas ke dalam float 32-bit.

Cara meneruskan gambar ke dalam model

Ada dua cara untuk meneruskan gambar ke dalam model:

  • ImageFeatureValue

    Sebaiknya gunakan ImageFeatureValue untuk mengikat gambar sebagai input dan output, karena mengurus konversi dan tensorisasi, sehingga gambar cocok dengan format gambar model yang diperlukan. Jenis format model yang saat ini didukung adalah Gray8, Rgb8, dan Bgr8, dan rentang piksel yang saat ini didukung adalah 0-255.

    Anda dapat membuat ImageFeatureValue menggunakan metode statis ImageFeatureValue.CreateFromVideoFrame.

    Untuk mengetahui format apa yang dibutuhkan model, WinML menggunakan logika dan urutan prioritas berikut:

    1. Bind(String, Object, IPropertySet) akan menimpa semua pengaturan gambar.
    2. Metadata model kemudian akan diperiksa dan digunakan jika tersedia.
    3. Jika tidak ada metadata model yang disediakan, dan tidak ada properti yang disediakan penelepon, runtime akan mencoba untuk membuat kecocokan terbaik.
    • Jika tensor terlihat seperti NCHW (float32 4 dimensi, N==1), runtime akan mengasumsikan Gray8 (C==1) atau Bgr8 (C==3) tergantung pada jumlah saluran.
    • NominalRange_0_255 akan diasumsikan
    • SRGB akan diasumsikan

    Ada beberapa properti opsional yang dapat Anda teruskan ke Bind(String, Object, IPropertySet):

    • BitmapBounds: Jika ditentukan, ini adalah batas pemotongan untuk diterapkan sebelum mengirim gambar ke model.
    • BitmapPixelFormat: Jika ditentukan, ini adalah format piksel yang akan digunakan sebagai format piksel model selama konversi gambar.

    Untuk bentuk gambar, model dapat menentukan bentuk tertentu yang diperlukan (misalnya, SqueezeNet membutuhkan 224.224), atau model dapat menentukan dimensi gratis untuk gambar bentuk apa pun (banyak model jenis StyleTransfer dapat mengambil gambar berukuran variabel). Pemanggil dapat menggunakan BitmapBounds untuk memilih bagian gambar mana yang ingin mereka gunakan. Jika tidak ditentukan, runtime akan menskalakan gambar ke ukuran model (menghormati rasio aspek) lalu memangkas tengah.

  • TensorFloat

    Jika Windows ML tidak mendukung format warna atau rentang piksel model Anda, Maka Anda dapat menerapkan konversi dan tensorisasi. Anda akan membuat tensor empat dimensi NCHW untuk float 32-bit untuk nilai input Anda. Lihat Sampel Tensorisasi Kustom untuk contoh cara melakukannya.

    Ketika metode ini digunakan, metadata gambar apa pun pada model diabaikan.

Contoh

Contoh berikut menunjukkan cara mengikat input model. Dalam hal ini, kami membuat pengikatan dari sesi, membuat ImageFeatureValue dari inputFrame, dan mengikat gambar ke input model, inputName.

private void BindModel(
    LearningModelSession session,
    VideoFrame inputFrame,
    string inputName)
{
    // Create a binding object from the session
    LearningModelBinding binding = new LearningModelBinding(session);

    // Create an image tensor from a video frame
    ImageFeatureValue image =
        ImageFeatureValue.CreateFromVideoFrame(inputFrame);

    // Bind the image to the input
    binding.Bind(inputName, image);
}

Lihat juga

Catatan

Gunakan sumber daya berikut untuk bantuan dengan Windows ML:

  • Untuk mengajukan atau menjawab pertanyaan teknis tentang Windows ML, silakan gunakan tag windows-machine-learning di Stack Overflow.
  • Untuk melaporkan bug, silakan ajukan masalah di GitHub kami.