Udostępnij przez


Zwiąż model

Model uczenia maszynowego ma funkcje danych wejściowych i wyjściowych, które przekazują informacje do i z modelu.

Po załadowaniu modelu jako LearningModel, możesz użyć LearningModel.InputFeatures i LearningModel.OutputFeatures, aby uzyskać obiekty ILearningModelFeatureDescriptor. Zawierają one listę oczekiwanych typów funkcji wejściowych i wyjściowych modelu.

Element LearningModelBinding służy do wiązania wartości z funkcją, odwołując się do klasy ILearningModelFeatureDescriptor według jej właściwości Name .

Poniższy film wideo zawiera krótkie omówienie powiązań funkcji modeli uczenia maszynowego.


Typy funkcji

Usługa Windows ML obsługuje wszystkie typy funkcji ONNX, które są wyliczane w usłudze LearningModelFeatureKind. Są one mapowane na różne klasy deskryptorów funkcji:

Tensory

Tensory to tablice wielowymiarowe, a najczęstszy tensor to tensor z 32-bitowymi liczbami zmiennoprzecinkowymi. Wymiary tensorów mają układ rzędowy z gęsto upakowanymi danymi, które reprezentują każdy wymiar. Całkowity rozmiar tensora jest produktem rozmiarów każdego wymiaru.

Sekwencje

Sekwencje to wektory wartości. Typowym zastosowaniem typów sekwencji jest wektor prawdopodobieństw zmiennoprzecinkowych, który niektóre modele klasyfikacji zwracają, aby wskazać stopień dokładności dla każdego przewidywania.

Mapy

Mapy przedstawiają informacje w postaci par klucz/wartość. Modele klasyfikacji często zwracają mapę ciągów/zmiennoprzecinkowych opisujących prawdopodobieństwo zmiennoprzecinkowe dla każdej nazwy klasyfikacji oznaczonej etykietą. Na przykład dane wyjściowe modelu, który próbuje przewidzieć rasę psa na obrazie, może mieć wartość ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6].

Skalary

Większość map i sekwencji będzie zawierać wartości, które są skalarnymi. Są one wyświetlane, gdzie tensorFeatureDescriptor.Shape.Size ma wartość zero (0). W takim przypadku mapa lub sekwencja będą typu skalarnego. Najczęstszym elementem jest float. Na przykład mapa od ciągu znaków do liczby zmiennoprzecinkowej to:

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

Rzeczywista wartość funkcji mapy będzie wartością IMap<string, float>.

Sekwencja map

Sekwencja map to tylko wektor pary klucz-wartość. Na przykład, sekwencja map przekształcających ciągi znaków na wartości zmiennoprzecinkowe będzie typu IVector<IMap<string, float>>. Powyższe dane wyjściowe prognoz ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] rasy psów są przykładem sekwencji map.

Obrazy

Podczas pracy z obrazami należy pamiętać o formatach obrazów i tensoryzacji.

Formaty obrazów

Modele są trenowane przy użyciu danych treningowych obrazów, a wagi są zapisywane i dostosowane do tego zestawu treningowego. Przekazując obraz jako dane wejściowe do modelu, należy upewnić się, że jego format jest zgodny z formatem obrazów treningowych.

W wielu przypadkach model opisuje oczekiwany format obrazu; Modele ONNX mogą używać metadanych do opisywania oczekiwanych formatów obrazów.

Większość modeli używa następujących formatów, ale nie jest to uniwersalne dla wszystkich modeli:

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

Tensoryzacja

Obrazy są reprezentowane w Windows ML w formacie tensora. Tensoryzacja to proces konwertowania obrazu na tensor i odbywa się podczas wiązania.

Windows ML konwertuje obrazy na 4-wymiarowe tensory 32-bitowe zmiennoprzecinkowe w formacie tensora NCHW.

  • N: Rozmiar partii (lub liczba obrazów). Windows ML obsługuje obecnie partii o rozmiarze N wynoszącym 1.
  • C: Liczba kanałów (1 dla gray8, 3 dla Bgr8).
  • H: Wysokość.
  • W: szerokość.

Każdy piksel obrazu to 8-bitowa wartość koloru przechowywana w zakresie 0–255 i zapakowana w 32-bitowy zmiennoprzecinkowy float.

Jak przekazywać obrazy do modelu

Istnieją dwa sposoby przekazywania obrazów do modeli:

  • ImageFeatureValue (Wartość obrazu)

    Zalecamy użycie klasy ImageFeatureValue do powiązania obrazów jako danych wejściowych i wyjściowych, ponieważ zajmuje się zarówno konwersją, jak i tensoryzacji, więc obrazy są zgodne z wymaganym formatem obrazu modelu. Obecnie obsługiwane typy formatów modeli to Gray8, Rgb8 i Bgr8, a obecnie obsługiwany zakres pikseli to 0–255.

    Element ImageFeatureValue można utworzyć przy użyciu metody statycznej ImageFeatureValue.CreateFromVideoFrame.

    Aby dowiedzieć się, jakiego formatu potrzebuje model, winML używa następującej logiki i kolejności pierwszeństwa:

    1. Bind(String, Object, IPropertySet) zastąpi wszystkie ustawienia obrazu.
    2. Metadane modelu będą następnie sprawdzane i używane, jeśli są dostępne.
    3. Jeśli nie podano żadnych metadanych modelu i nie podano właściwości obiektu wywołującego, środowisko uruchomieniowe podejmie próbę najlepszego dopasowania.
    • Jeśli tensor wygląda jak NCHW (4-wymiarowy zmiennoprzecinkowy32, N==1), środowisko uruchomieniowe zakłada Gray8 (C==1) lub Bgr8 (C==3) w zależności od liczby kanałów.
    • zakłada się, że NominalRange_0_255
    • Zakłada się SRGB

    Istnieje kilka opcjonalnych właściwości, które można przekazać do elementu Bind(String, Object, IPropertySet):

    • BitmapBounds: jeśli określono, są to granice przycinania, które mają być stosowane przed wysłaniem obrazu do modelu.
    • BitmapPixelFormat: jeśli zostanie określony, jest to format pikseli, który będzie używany jako format pikseli modelu podczas konwersji obrazu.

    W przypadku kształtów obrazów model może określić konkretny kształt, który przyjmuje (na przykład SqueezeNet przyjmuje wartość 224, 224), lub model może określić dowolne wymiary dla dowolnego kształtu obrazu (wiele modeli typu StyleTransfer może przyjmować obrazy o zmiennym rozmiarze). Obiekt wywołujący może użyć BitmapBounds aby wybrać sekcję obrazu, której chcieliby użyć. Jeśli nie zostanie to określone, środowisko uruchomieniowe będzie skalować obraz do rozmiaru modelu (z zachowaniem proporcji), a następnie przyciąć go do środka.

  • TensorFloat powiedział:

    Jeśli Windows ML nie obsługuje formatu kolorów lub zakresu pikseli modelu, możesz zaimplementować konwersje, a następnie tensoryzowanie. Utworzysz czterowymiarowy tensor NCHW dla 32-bitowych zmiennoprzecinków dla wartości wejściowej. Zobacz Przykład niestandardowej tensoryzacji, aby dowiedzieć się, jak to zrobić.

    Gdy ta metoda jest używana, wszystkie metadane obrazu w modelu są ignorowane.

Przykład

W poniższym przykładzie pokazano, jak powiązać dane wejściowe modelu. W takim przypadku utworzymy powiązanie na podstawie sesji, utworzymy element ImageFeatureValue z elementu inputFrame i powiążemy obraz z danymi wejściowymi modelu 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);
}

Zobacz także

Uwaga / Notatka

Skorzystaj z następujących zasobów, aby uzyskać pomoc dotyczącą uczenia maszynowego z systemem Windows:

  • Aby zadać lub odpowiedzieć na pytania techniczne dotyczące usługi Windows ML, użyj tagu windows-machine-learning w usłudze Stack Overflow.
  • Aby zgłosić usterkę, popełnij zgłoszenie na GitHubie .