Sdílet prostřednictvím


Svázání modelu

Model strojového učení má vstupní a výstupní funkce, které předávají informace do a z modelu.

Po načtení modelu jako LearningModel můžete k získání objektů ILearningModelFeatureDescriptor použít LearningModel.InputFeatures a LearningModel.OutputFeatures. Tyto seznamy uvádějí očekávané typy vstupních a výstupních funkcí modelu.

Pomocí LearningModelBinding vytvoříte vazbu hodnot na vlastnost tím, že odkazujete na ILearningModelFeatureDescriptor podle jeho vlastnosti Name.

Následující video poskytuje stručný přehled vazeb funkcí modelů strojového učení.


Typy funkcí

Windows ML podporuje všechny typy funkcí ONNX, které jsou vyčíslené v LearningModelFeatureKind. Tyto třídy jsou mapovány na různé třídy popisovače funkcí:

Tenzory

Tensory jsou multidimenzionální pole a nejběžnější tensor je tensor 32bitových float. Rozměry tenzorů jsou uspořádány po řádcích s kompaktními souvislými daty představující každou dimenzi. Celková velikost tensoru je součinem velikostí jednotlivých dimenzí.

Sekvence

Sekvence jsou vektory hodnot. Běžné použití sekvenčních typů je vektor desetinných pravděpodobností, který některé klasifikační modely vracejí, aby vyjádřily míru přesnosti pro každou předpověď.

Mapy

Mapy jsou páry klíčů a hodnot. Klasifikační modely obvykle vracejí mapu typu string/float, která popisuje plovoucí pravděpodobnost pro každý název klasifikace. Například výstup modelu, který se snaží předpovědět plemena psa na obrázku, může být ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6].

Skaláry

Většina map a sekvencí bude obsahovat hodnoty, které jsou skaláry. Zobrazí se tam, kde TensorFeatureDescriptor.Shape.Size je nula (0). V tomto případě bude mapa nebo sekvence skalárního typu. Nejběžnější je float. Například řetězec s plovoucí mapou by byl:

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

Skutečná hodnota funkce mapy bude hodnota IMap<string, float>.

Posloupnost map

Posloupnost map je jen vektor párů klíč/hodnota. Například posloupnost map typu string-to-float by byla typu IVector<IMap<string, float>>. Výše uvedený výstup predikcí ["Boston terrier", 90.0], ["Golden retriever", 7.4], ["Poodle", 2.6] psího plemena je příkladem posloupnosti map.

Obrázky

Při práci s obrázky budete muset znát formáty obrázků a tensorizaci.

Formáty obrázků

Modely jsou trénovány pomocí obrazových trénovacích dat, a váhy jsou ukládány a upravovány pro tuto trénovací sadu. Když do modelu předáte vstup obrázku, musí jeho formát odpovídat formátu trénovacích obrázků.

V mnoha případech model popisuje očekávaný formát obrázku; Modely ONNX můžou používat metadata k popisu očekávaných formátů obrázků.

Většina modelů používá následující formáty, ale není univerzální pro všechny modely:

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

Tensorizace

Obrázky jsou reprezentovány ve Windows ML ve formátu tensoru. Tensorizace je proces převodu obrázku na tenzor a probíhá během vazby.

Windows ML převádí obrázky na 4rozměrné tensory s 32bitovými plovoucími daty ve formátu "NCHW tensor":

  • N: Velikost dávky (nebo počet obrázků). Windows ML v současné době podporuje velikost dávky N 1.
  • C: Počet kanálů (1 pro Gray8, 3 pro Bgr8).
  • H: Výška.
  • W: Šířka.

Každý pixel obrázku je 8bitové barevné číslo uložené v rozmezí 0–255 a zabalené do 32bitového floatu.

Jak předat obrázky do modelu

Obrázky můžete předávat do modelů dvěma způsoby:

  • ImageFeatureValue

    K vytvoření vazby obrázků jako vstupů a výstupů doporučujeme použít ImageFeatureValue , protože se postará o převod i tensorizaci, takže obrázky odpovídají požadovanému formátu image modelu. Aktuálně podporované typy formátů modelu jsou Gray8, Rgb8 a Bgr8 a aktuálně podporovaný rozsah pixelů je 0–255.

    ImageFeatureValue můžete vytvořit pomocí statické metody ImageFeatureValue.CreateFromVideoFrame.

    Pokud chcete zjistit, jaký formát model potřebuje, použije WinML následující logiku a pořadí priorit:

    1. Bind(String, Object, IPropertySet) přepíše všechna nastavení obrázku.
    2. Metadata modelu se pak zkontrolují a použijí, pokud jsou k dispozici.
    3. Pokud nejsou zadána žádná metadata modelu a volající nezadal žádné vlastnosti, běhové prostředí se pokusí provést nejlepší shodu.
    • Pokud tenzor vypadá jako NCHW (4rozměrná float32, N==1), modul runtime bude v závislosti na počtu kanálů předpokládat buď Gray8 (C==1), nebo Bgr8 (C==3).
    • Předpokládá se rozsah NominalRange_0_255
    • Předpokládá se sRGB

    Existuje několik volitelných vlastností, které můžete předat Bind(String, Object, IPropertySet):

    • BitmapBounds: Pokud je zadáno, jedná se o hranice oříznutí, které se použijí před odesláním obrázku do modelu.
    • BitmapPixelFormat: Pokud je zadán, jedná se o pixelový formát, který se použije jako formát pixel modelu během převodu obrázku.

    Pro tvary obrázků může model určit buď určitý tvar, který má (například SqueezeNet má rozměry 224x224), nebo model může zadat volné rozměry pro libovolný tvar obrázků (mnoho modelů typu StyleTransfer může pracovat s obrázky s proměnlivou velikostí). Volající může použít BitmapBounds k výběru oddílu obrázku, který by chtěl použít. Pokud není zadáno, runtime přizpůsobí obrázek na velikost modelu (při zachování poměru stran) a poté jej ořízne na střed.

  • TensorFloat – plovoucí funkce

    Pokud Windows ML nepodporuje barevný formát modelu nebo rozsah pixelů, můžete implementovat převody a tensorizaci. Pro vstupní hodnotu vytvoříte čtyřrozměrný tensor NCHW pro 32bitové plovoucí hodnoty. Podívejte se na ukázkový příklad vlastní tensorizace, abyste viděli, jak to udělat.

    Při použití této metody se ignorují všechna metadata obrázků v modelu.

Příklad

Následující příklad ukazuje, jak vytvořit vazbu na vstup modelu. V tomto případě vytvoříme vazbu ze session, vytvoříme ImageFeatureValue ze inputFrame a svážeme obrázek na vstup 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);
}

Viz také

Poznámka:

Pomoc s Windows ML vám poskytnou následující zdroje:

  • Pokud chcete položit nebo zodpovědět technické otázky týkající se Windows ML, použijte značku windows-machine-learning na Stack Overflow.
  • Pokud chcete nahlásit chybu, zapište prosím problém na našem GitHubu .