Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto kurzu se dozvíte, jak pomocí předem natrénovaného modelu TensorFlow klasifikovat mínění v komentářích na webu. Klasifikátor binárního mínění je konzolová aplikace jazyka C# vyvinutá pomocí sady Visual Studio.
Model TensorFlow použitý v tomto kurzu byl natrénován pomocí recenzí filmů z databáze IMDB. Jakmile aplikaci dokončíte, budete schopen zadat text recenze filmu a aplikace vám řekne, jestli má recenze pozitivní nebo negativní hodnocení.
V tomto návodu se naučíte, jak:
- Načtení předem natrénovaného modelu TensorFlow
- Transformace textu komentáře webu na funkce vhodné pro model
- Použití modelu k vytvoření předpovědi
Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples .
Požadavky
- Visual Studio 2022 nebo novější s nainstalovanou úlohou vývoj aplikací pro .NET Desktop
Nastavení
Vytvoření aplikace
Vytvořte konzolovou aplikaci jazyka C# s názvem TextClassificationTF. Klikněte na tlačítko Next.
Jako architekturu, která se má použít, zvolte .NET 8. Klikněte na tlačítko Vytvořit.
Vytvořte adresář s názvem Data v projektu a uložte soubory datové sady.
Nainstalujte balíček NuGet Microsoft.ML:
Poznámka:
Tato ukázka používá nejnovější stabilní verzi uvedených balíčků NuGet, pokud není uvedeno jinak.
V Průzkumníku řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet. Jako zdroj balíčku zvolte "nuget.org" a pak vyberte kartu Procházet . Vyhledejte Microsoft.ML, vyberte požadovaný balíček a pak vyberte Nainstalovat. Pokračujte v instalaci tím, že souhlasíte s licenčními podmínkami pro balíček, který zvolíte. Opakujte tyto kroky pro Microsoft.ML.TensorFlow, Microsoft.ML.SampleUtils a SciSharp.TensorFlow.Redist.
Přidání modelu TensorFlow do projektu
Poznámka:
Model pro tento kurz pochází z úložiště dotnet/machinelearning-testdata na GitHubu. Model je ve formátu TensorFlow SavedModel.
Stáhněte soubor zip sentiment_model a rozbalte ho.
Soubor ZIP obsahuje:
-
saved_model.pb: Samotný model TensorFlow. Model zpracovává celočíselné pole (velikost 600) představující text v řetězci recenze IMDB a vypíše dvě pravděpodobnosti, které se sčítají na hodnotu 1: pravděpodobnost, že vstupní recenze má pozitivní sentiment, a pravděpodobnost, že vstupní recenze má negativní sentiment. -
imdb_word_index.csv: mapování z jednotlivých slov na celočíselnou hodnotu. Mapování se používá ke generování vstupních funkcí pro model TensorFlow.
-
Zkopírujte obsah nejvnitřnějšího
sentiment_modeladresáře do adresáře projektusentiment_model. Tento adresář obsahuje model a další podpůrné soubory potřebné pro tento kurz, jak je znázorněno na následujícím obrázku:
V Průzkumníku řešení klikněte pravým tlačítkem na všechny soubory v
sentiment_modeladresáři a podadresáři a vyberte Vlastnosti. V části Upřesnit změňte hodnotu „Kopírovat do výstupního adresáře“ na „Kopírovat, pokud je novější“.
Přidání using direktiv a globálních proměnných
Na začátek souboru
usingpřidejte následující další direktivy:using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Transforms;Vytvořte globální proměnnou hned za
usingdirektivami pro uložení uložené cesty k souboru modelu.string _modelPath = Path.Combine(Environment.CurrentDirectory, "sentiment_model");-
_modelPathje cesta k souboru vytrénovaného modelu.
-
Modelování dat
Recenze filmů jsou texty volného formátu. Aplikace převede text do vstupního formátu očekávaného modelem v řadě diskrétních fází.
První je rozdělit text na samostatná slova a pomocí zadaného souboru mapování namapovat každé slovo na celé číslo kódování. Výsledkem této transformace je pole s proměnnou délkou celého čísla s délkou odpovídající počtu slov ve větě.
| Vlastnictví | Hodnota | Typ |
|---|---|---|
| Text recenze | tento film je opravdu dobrý | řetězec |
| VariableLengthFeatures | 14,22,9,66,78,... | int[] |
Pole funkce proměnné délky se pak změní na pevnou délku 600. Jedná se o délku, kterou model TensorFlow očekává.
| Vlastnictví | Hodnota | Typ |
|---|---|---|
| Text recenze | tento film je opravdu dobrý | řetězec |
| VariableLengthFeatures | 14,22,9,66,78,... | int[] |
| Features | 14,22,9,66,78,... | int[600] |
Vytvořte třídu pro vstupní data v dolní části souboru Program.cs :
/// <summary> /// Class to hold original sentiment data. /// </summary> public class MovieReview { public string? ReviewText { get; set; } }Vstupní datová třída ,
MovieReviewmástringpro komentáře uživatele (ReviewText).Vytvořte třídu pro funkce proměnné délky za
MovieReviewtřídou:/// <summary> /// Class to hold the variable length feature vector. Used to define the /// column names used as input to the custom mapping action. /// </summary> public class VariableLength { /// <summary> /// This is a variable length vector designated by VectorType attribute. /// Variable length vectors are produced by applying operations such as 'TokenizeWords' on strings /// resulting in vectors of tokens of variable lengths. /// </summary> [VectorType] public int[]? VariableLengthFeatures { get; set; } }Vlastnost
VariableLengthFeaturesmá VectorType atribut, který jej označí jako vektor. Všechny vektorové prvky musí být stejného typu. V datových sadách s velkým počtem sloupců se načtením více sloupců jako jednoho vektoru sníží počet průchodů daty při aplikaci datových transformací.Tato třída se používá v
ResizeFeaturesakci. Názvy jeho vlastností (v tomto případě pouze jeden) slouží k označení sloupců v DataView, které lze použít jako vstup vlastní akce mapování.Vytvořte třídu pro funkce s konstantní délkou po třídě
VariableLength:/// <summary> /// Class to hold the fixed length feature vector. Used to define the /// column names used as output from the custom mapping action, /// </summary> public class FixedLength { /// <summary> /// This is a fixed length vector designated by VectorType attribute. /// </summary> [VectorType(Config.FeatureLength)] public int[]? Features { get; set; } }Tato třída se používá v
ResizeFeaturesakci. Názvy jeho vlastností (v tomto případě pouze jeden) slouží k označení sloupců v DataView, které lze použít jako výstup vlastní akce mapování.Všimněte si, že název vlastnosti
Featuresje určen modelem TensorFlow. Tento název vlastnosti nelze změnit.Vytvořte třídu pro predikci za
FixedLengthtřídou:/// <summary> /// Class to contain the output values from the transformation. /// </summary> public class MovieReviewSentimentPrediction { [VectorType(2)] public float[]? Prediction { get; set; } }MovieReviewSentimentPredictionje prediktivní třída použitá po trénování modelu.MovieReviewSentimentPredictionmá jednufloatmatici (Prediction) aVectorTypeatribut.Vytvořte další třídu, která bude obsahovat konfigurační hodnoty, například délku vektoru funkce:
static class Config { public const int FeatureLength = 600; }
Vytvoření mlContextu, vyhledávacího slovníku a akce pro změnu velikosti funkcí
Třída MLContext je výchozím bodem pro všechny operace ML.NET. Inicializace mlContext vytvoří nové ML.NET prostředí, které lze sdílet napříč objekty pracovního postupu vytváření modelu. Je to podobné, koncepčně, jako DBContext v Entity Frameworku.
Console.WriteLine("Hello World!")Nahraďte řádek následujícím kódem, který deklaruje a inicializuje proměnnou mlContext:MLContext mlContext = new MLContext();Vytvořte slovník pro kódování slov jako celá čísla pomocí
LoadFromTextFilemetody pro načtení mapovacích dat ze souboru, jak je vidět v následující tabulce:Slovo Index děti 362 chtít 181 nesprávný 355 účinky 302 pocit 547 Přidejte následující kód pro vytvoření vyhledávací mapy:
var lookupMap = mlContext.Data.LoadFromTextFile(Path.Combine(_modelPath, "imdb_word_index.csv"), columns: new[] { new TextLoader.Column("Words", DataKind.String, 0), new TextLoader.Column("Ids", DataKind.Int32, 1), }, separatorChar: ',' );Přidejte
Actionk změně velikosti pole celých čísel s proměnnou délkou na pole celých čísel s pevnou velikostí pomocí následujících řádků kódu:Action<VariableLength, FixedLength> ResizeFeaturesAction = (s, f) => { var features = s.VariableLengthFeatures; Array.Resize(ref features, Config.FeatureLength); f.Features = features; };
Načtení předem natrénovaného modelu TensorFlow
Přidejte kód pro načtení modelu TensorFlow:
TensorFlowModel tensorFlowModel = mlContext.Model.LoadTensorFlowModel(_modelPath);Po načtení modelu můžete extrahovat jeho vstupní a výstupní schéma. Schémata jsou zobrazena pouze pro zájem a učení. Tento kód nepotřebujete, aby konečná aplikace fungovala:
DataViewSchema schema = tensorFlowModel.GetModelSchema(); Console.WriteLine(" =============== TensorFlow Model Schema =============== "); var featuresType = (VectorDataViewType)schema["Features"].Type; Console.WriteLine($"Name: Features, Type: {featuresType.ItemType.RawType}, Size: ({featuresType.Dimensions[0]})"); var predictionType = (VectorDataViewType)schema["Prediction/Softmax"].Type; Console.WriteLine($"Name: Prediction/Softmax, Type: {predictionType.ItemType.RawType}, Size: ({predictionType.Dimensions[0]})");Vstupní schéma je pole s pevnou délkou celých čísel kódovaných slov. Výstupní schéma je pole s plovoucí maticí pravděpodobností označující, zda je mínění revize záporné nebo kladné . Tyto hodnoty se sčítají na 1, protože pravděpodobnost, že je pozitivní, je doplněk pravděpodobnosti negativního mínění.
Vytvoření kanálu ML.NET
Vytvořte kanál a rozdělte vstupní text na slova pomocí transformace TokenizeIntoWords a rozdělte text na slova jako další řádek kódu:
IEstimator<ITransformer> pipeline = // Split the text into individual words mlContext.Transforms.Text.TokenizeIntoWords("TokenizedWords", "ReviewText")Transformace TokenizeIntoWords používá mezery k analýze textu nebo řetězce na slova. Vytvoří nový sloupec a rozdělí každý vstupní řetězec na vektor podřetězců na základě uživatelem definovaného oddělovače.
Namapujte slova na jejich celočíselné kódování pomocí vyhledávací tabulky, kterou jste deklarovali výše:
// Map each word to an integer value. The array of integer makes up the input features. .Append(mlContext.Transforms.Conversion.MapValue("VariableLengthFeatures", lookupMap, lookupMap.Schema["Words"], lookupMap.Schema["Ids"], "TokenizedWords"))Změňte velikost celočíselného kódování délky proměnné na pevnou délku požadovanou modelem:
// Resize variable length vector to fixed length vector. .Append(mlContext.Transforms.CustomMapping(ResizeFeaturesAction, "Resize"))Klasifikujte vstup pomocí načteného modelu TensorFlow:
// Passes the data to TensorFlow for scoring .Append(tensorFlowModel.ScoreTensorFlowModel("Prediction/Softmax", "Features"))Výstup modelu TensorFlow se nazývá
Prediction/Softmax. Všimněte si, že názevPrediction/Softmaxje určen modelem TensorFlow. Tento název nelze změnit.Vytvořte nový sloupec pro predikci výstupu:
// Retrieves the 'Prediction' from TensorFlow and copies to a column .Append(mlContext.Transforms.CopyColumns("Prediction", "Prediction/Softmax"));Musíte zkopírovat
Prediction/Softmaxsloupec do takového se jménem, které lze použít jako vlastnost ve třídě C#:Prediction. Znak/není povolen v názvu vlastnosti jazyka C#.
Vytvoření modelu ML.NET z předzpracovatelského řetězce
Přidejte kód pro sestavení modelu z pipeline:
// Create an executable model from the estimator pipeline IDataView dataView = mlContext.Data.LoadFromEnumerable(new List<MovieReview>()); ITransformer model = pipeline.Fit(dataView);Model ML.NET se vytvoří z řetězce estimátorů v pipeline voláním metody
Fit. V tomto případě nepřizpůsobujete žádná data k utváření modelu, protože model TensorFlow už byl dříve natrénován. Zadáte prázdný objekt zobrazení dat, který splňuje požadavky metodyFit.
Použití modelu k vytvoření předpovědi
Přidejte metodu
PredictSentimentMovieReviewnad třídu:void PredictSentiment(MLContext mlContext, ITransformer model) { }Přidejte následující kód, který vytvoří
PredictionEnginejako první řádek vPredictSentiment()metodě:var engine = mlContext.Model.CreatePredictionEngine<MovieReview, MovieReviewSentimentPrediction>(model);PredictionEngine je pohodlné rozhraní API, které umožňuje provádět predikce pro jednu instanci dat.
PredictionEnginenení bezpečný pro přístup z více vláken. Je přijatelné použít v jednovláknovém nebo prototypovém prostředí. Pokud chcete zvýšit výkon a bezpečnost vláken v produkčních prostředích, použijtePredictionEnginePoolslužbu, která vytvoříObjectPoolPredictionEngineobjekty pro použití v celé aplikaci. V tomto průvodci se dozvíte, jak používatPredictionEnginePoolwebové rozhraní API ASP.NET Core.Poznámka:
PredictionEnginePoolRozšíření služby je aktuálně ve verzi Preview.Přidejte komentář k otestování předpovědi vytrénovaného modelu v
Predict()metodě vytvořením instanceMovieReview:var review = new MovieReview() { ReviewText = "this film is really good" };Předejte data testovacího komentáře do
Prediction Enginepřidáním následujících řádků kódu do metodyPredictSentiment().var sentimentPrediction = engine.Predict(review);Funkce Predict() vytvoří předpověď na jednom řádku dat:
Vlastnictví Hodnota Typ Prediction [0.5459937, 0.454006255] float[] Pomocí následujícího kódu zobrazte predikci mínění:
Console.WriteLine($"Number of classes: {sentimentPrediction.Prediction?.Length}"); Console.WriteLine($"Is sentiment/review positive? {(sentimentPrediction.Prediction?[1] > 0.5 ? "Yes." : "No.")}");Po volání
PredictSentimentmetody přidejte voláníFit():PredictSentiment(mlContext, model);
Results
Sestavte a spusťte svou aplikaci.
Výsledky by měly být podobné následujícímu. Během zpracování se zobrazí zprávy. Může se zobrazit upozornění nebo zpracování zpráv. Tyto zprávy byly odebrány z následujících výsledků, aby byly přehledné.
Number of classes: 2
Is sentiment/review positive ? Yes
Gratulujeme! Nyní jste úspěšně vytvořili model strojového učení pro klasifikaci a predikci mínění zpráv opětovným použitím předem natrénovaného TensorFlow modelu v ML.NET.
Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples .
V tomto kurzu jste se naučili:
- Načtení předem natrénovaného modelu TensorFlow
- Transformace textu komentáře webu na funkce vhodné pro model
- Použití modelu k vytvoření předpovědi