Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az oktatóanyag bemutatja, hogyan használhat előre betanított TensorFlow-modellt a hangulatok webhely-megjegyzésekbe való besorolásához. A bináris hangulatosztályozó egy C#-konzolalkalmazás, amelyet a Visual Studióval fejlesztettek ki.
Az oktatóanyagban használt TensorFlow-modell betanítása az IMDB-adatbázisból származó filmes felülvizsgálatokkal történt. Miután befejezte az alkalmazás fejlesztését, megadhatja a film felülvizsgálati szövegét, és az alkalmazás meg fogja tudni mondani, hogy a vélemény pozitív vagy negatív hangulatú-e.
Ebben az oktatóanyagban a következőket sajátíthatja el:
- Előre betanított TensorFlow-modell betöltése
- A webhely megjegyzésszövegének átalakítása a modellnek megfelelő funkciókká
- Előrejelzés készítése a modell használatával
Az oktatóanyag forráskódját a dotnet/samples adattárban találja.
Előfeltételek
- A Visual Studio 2022 vagy újabb verziója telepítve van a .NET Desktop Development számítási feladattal.
Beállítás
Az alkalmazás létrehozása
Hozzon létre egy "TextClassificationTF" nevű C#- konzolalkalmazást . Kattintson a Tovább gombra.
Válassza a .NET 8-at a használni kívánt keretrendszerként. Kattintson a Létrehozás gombra.
Hozzon létre egy Data nevű könyvtárat a projektben az adatkészletfájlok mentéséhez.
Telepítse a Microsoft.ML NuGet-csomagot:
Megjegyzés:
Ez a minta az említett NuGet-csomagok legújabb stabil verzióját használja, hacsak másként nem rendelkezik.
A Megoldáskezelőben kattintson a jobb gombbal a projektre, és válassza a NuGet-csomagok kezelése lehetőséget. Válassza a "nuget.org" lehetőséget a csomag forrásaként, majd válassza a Tallózás lapot. Keresse meg a Microsoft.ML, válassza ki a kívánt csomagot, majd válassza a Telepítés lehetőséget. Folytassa a telepítést a választott csomag licencfeltételeinek elfogadásával. Ismételje meg ezeket a lépéseket a Microsoft.ML.TensorFlow, a Microsoft.ML.SampleUtils és a SciSharp.TensorFlow.Redist esetében.
A TensorFlow-modell hozzáadása a projekthez
Megjegyzés:
Az oktatóanyag modellje a dotnet/machinelearning-testdata GitHub-adattárból származik. A modell TensorFlow SavedModel formátumban van.
Töltse le a sentiment_model zip-fájlt, és bontsa ki.
A zip-fájl a következőket tartalmazza:
-
saved_model.pb: maga a TensorFlow-modell. A modell rögzített hosszúságú (600 elemből álló) egész számtömböt használ, amely az IMDB értékelés szövegét reprezentálja, és két valószínűséget ad ki, melyek összege 1: annak a valószínűsége, hogy a bemeneti értékelés pozitív érzelmű, és annak a valószínűsége, hogy a bemeneti értékelés negatív érzelmű. -
imdb_word_index.csv: az egyes szavakból egy egész szám értékre való leképezése. A leképezés a TensorFlow-modell bemeneti funkcióinak létrehozására szolgál.
-
Másolja a legbelső
sentiment_modelkönyvtár tartalmát a TextClassificationTF projektkönyvtárbasentiment_model. Ez a könyvtár tartalmazza az oktatóanyaghoz szükséges modellt és további támogatási fájlokat, ahogyan az alábbi képen látható:
A Megoldáskezelőben kattintson a jobb gombbal a könyvtárban és az alkönyvtárban lévő fájlokra, és válassza a
sentiment_modelTulajdonságok lehetőséget. A Speciális területen módosítsa a Kimeneti könyvtárba másolás értékét Másolás, ha újabb.
Irányelvek és globális változók hozzáadása using
Adja hozzá a következő további
usingirányelveket a Program.cs fájl elejéhez:using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Transforms;Hozzon létre egy globális változót közvetlenül az
usingirányelvek után a mentett modellfájl elérési útjának tárolásához.string _modelPath = Path.Combine(Environment.CurrentDirectory, "sentiment_model");-
_modelPatha betanított modell fájlútvonala.
-
Adatok modellezése
A filmkritikák szabad formájú szövegek. Az alkalmazás több különálló fázisban konvertálja a szöveget a modell által várt bemeneti formátumba.
Az első az, hogy a szöveget külön szavakra osztja, és a megadott leképezési fájl használatával minden szót egy egész szám kódolására képez le. Az átalakítás eredménye egy változó hosszúságú egész számtömb, amelynek hossza a mondatban szereplő szavak számának felel meg.
| Ingatlan | Érték | Típus |
|---|---|---|
| Korrektúraszöveg | ez a film nagyon jó | karakterlánc |
| VariableLengthFeatures | 14,22,9,66,78,... | int[] |
A változóhosszúságú funkciótömböt ezután a program rögzített, 600-ra méretezi át. Ez a TensorFlow-modell által várt hossz.
| Ingatlan | Érték | Típus |
|---|---|---|
| Korrektúraszöveg | ez a film nagyon jó | karakterlánc |
| VariableLengthFeatures | 14,22,9,66,78,... | int[] |
| Features | 14,22,9,66,78,... | int[600] |
Hozzon létre egy osztályt a bemeneti adatokhoz a Program.cs fájl alján:
/// <summary> /// Class to hold original sentiment data. /// </summary> public class MovieReview { public string? ReviewText { get; set; } }A bemeneti adatosztály
MovieReviewfelhasználói megjegyzésekkel (string) rendelkezikReviewText.Hozzon létre egy osztályt a változóhosszúságú funkciókhoz az
MovieReviewosztály után:/// <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; } }A
VariableLengthFeaturestulajdonság VektorTípus attribútummal rendelkezik, amely vektorként jelöli meg. Minden vektorelemnek azonos típusúnak kell lennie. A nagy számú oszlopot tartalmazó adathalmazokban a több oszlop egyetlen vektorként való betöltése csökkenti az adatátjárók számát az adatátalakítások alkalmazásakor.Ezt az osztályt használja a
ResizeFeaturesművelet. A tulajdonságok nevei (ebben az esetben csak egy) jelzik, hogy a DataView mely oszlopai használhatók az egyéni leképezési művelet bemeneteként .Hozzon létre egy osztályt a rögzített hosszúságú funkciókhoz az
VariableLengthosztály után:/// <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; } }Ezt az osztályt használja a
ResizeFeaturesművelet. A tulajdonságok nevei (ebben az esetben csak egy) jelzik, hogy a DataView mely oszlopai használhatók az egyéni leképezési művelet kimeneteként .Vegye figyelembe, hogy a tulajdonság
Featuresnevét a TensorFlow-modell határozza meg. Ezt a tulajdonságnevet nem módosíthatja.Hozzon létre egy osztályt az előrejelzéshez az
FixedLengthosztály után:/// <summary> /// Class to contain the output values from the transformation. /// </summary> public class MovieReviewSentimentPrediction { [VectorType(2)] public float[]? Prediction { get; set; } }MovieReviewSentimentPredictiona modell betanítása után használt előrejelzési osztály.MovieReviewSentimentPredictionegyetlenfloattömbből (Prediction) és attribútumbólVectorTypeáll.Hozzon létre egy másik osztályt a konfigurációs értékek tárolásához, például a funkcióvektor hosszához:
static class Config { public const int FeatureLength = 600; }
Az MLContext, a lekérdezési szótár és a funkciók átméretezésére szolgáló művelet létrehozása
Az MLContext osztály minden ML.NET művelet kiindulópontja. Az inicializálás mlContext új ML.NET környezetet hoz létre, amely megosztható a modelllétrehozás munkafolyamat-objektumai között. Ez fogalmilag hasonló az Entity Frameworkhez DBContext .
Cserélje le a
Console.WriteLine("Hello World!")sort a következő kódra az mlContext változó deklarálásához és inicializálásához:MLContext mlContext = new MLContext();Hozzon létre egy szótárt, amely egész számként kódolja a szavakat a
LoadFromTextFilemódszer segítségével a leképezési adatok fájlból való betöltésére, ahogyan az a következő táblázatban látható.Word Index Gyerekek 362 akar 181 rossz 355 ingóságok 302 érzés 547 Adja hozzá az alábbi kódot a keresési térkép létrehozásához:
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: ',' );Addjon hozzá egy
Action-t, amely a változó hosszúságú szó egész tömböt rögzített méretű egész számtömbbé alakítja az alábbi kódsorok segítségével:Action<VariableLength, FixedLength> ResizeFeaturesAction = (s, f) => { var features = s.VariableLengthFeatures; Array.Resize(ref features, Config.FeatureLength); f.Features = features; };
Az előre betanított TensorFlow-modell betöltése
Kód hozzáadása a TensorFlow-modell betöltéséhez:
TensorFlowModel tensorFlowModel = mlContext.Model.LoadTensorFlowModel(_modelPath);A modell betöltése után kinyerheti annak bemeneti és kimeneti sémáját. A sémák csak érdeklődés és tanulás céljából jelennek meg. A végleges alkalmazás működéséhez nincs szükség erre a kódra:
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]})");A bemeneti séma az egész szám által kódolt szavak rögzített hosszúságú tömbje. A kimeneti séma a valószínűségek lebegőpontos tömbje, amely azt jelzi, hogy egy vélemény hangulata negatív vagy pozitív. Ezek az értékek 1-et tartalmaznak, mivel a pozitívság valószínűsége a negatív hangulat valószínűségének kiegészítése.
A ML.NET folyamat létrehozása
Hozza létre a folyamatot, és ossza fel a bemeneti szöveget szavakra a TokenizeIntoWords átalakítással, hogy a szöveget szavakra bontsa a következő kódsorként:
IEstimator<ITransformer> pipeline = // Split the text into individual words mlContext.Transforms.Text.TokenizeIntoWords("TokenizedWords", "ReviewText")A TokenizeIntoWords átalakítás szóközök használatával bontja fel a szöveget vagy karakterláncot szavakra. Létrehoz egy új oszlopot, és minden bemeneti sztringet feloszt a felhasználó által definiált elválasztó alapján az alsztringek vektorára.
Térképezze fel a szavakat a fent létrehozott keresési táblával az egész szám kódolásukra.
// 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"))Méretezze át a változó hosszúságú egész szám kódolását a modell által igényelt rögzített hosszúságúra:
// Resize variable length vector to fixed length vector. .Append(mlContext.Transforms.CustomMapping(ResizeFeaturesAction, "Resize"))Osztályozza a bemenetet a betöltött TensorFlow-modellel:
// Passes the data to TensorFlow for scoring .Append(tensorFlowModel.ScoreTensorFlowModel("Prediction/Softmax", "Features"))A TensorFlow-modell kimenetének neve
Prediction/Softmax. Vegye figyelembe, hogy a nevetPrediction/Softmaxa TensorFlow-modell határozza meg. Ezt a nevet nem módosíthatja.Hozzon létre egy új oszlopot a kimeneti előrejelzéshez:
// Retrieves the 'Prediction' from TensorFlow and copies to a column .Append(mlContext.Transforms.CopyColumns("Prediction", "Prediction/Softmax"));Egy tulajdonságként használható névvel kell átmásolnia a
Prediction/Softmaxoszlopot egy C# osztályban:Prediction. A/karakter C# tulajdonságnévben nem engedélyezett.
A ML.NET modell létrehozása a folyamatból
Adja hozzá a kódot a modell folyamatból való létrehozásához:
// Create an executable model from the estimator pipeline IDataView dataView = mlContext.Data.LoadFromEnumerable(new List<MovieReview>()); ITransformer model = pipeline.Fit(dataView);Egy ML.NET modell jön létre a folyamat becslési láncából a
Fitmetódus meghívásával. Ebben az esetben nem illeszt be adatokat a modell létrehozásához, mivel a TensorFlow-modell már be van tanítva. A metódus követelményeinekFitmegfelelően üres adatnézet-objektumot ad meg.
Előrejelzés készítése a modell használatával
Adja hozzá a metódust
PredictSentimentazMovieReviewosztály felett:void PredictSentiment(MLContext mlContext, ITransformer model) { }Adja hozzá a következő kódot a
PredictionEnginemetódus első soraként valóPredictSentiment()létrehozásához:var engine = mlContext.Model.CreatePredictionEngine<MovieReview, MovieReviewSentimentPrediction>(model);A PredictionEngine egy egyszerű API, amely lehetővé teszi az előrejelzés végrehajtását egyetlen adatpéldányon.
PredictionEnginenincs szálbiztos. Egyszálas vagy prototípusos környezetben is használható. Az éles környezetekben a jobb teljesítmény és a szálbiztonság érdekében használja aPredictionEnginePoolszolgáltatást, amely objektumokat hoz létreObjectPoolPredictionEngineaz alkalmazás teljes területén való használatra. Ebből az útmutatóból megtudhatja, hogyan használhatóPredictionEnginePoolegy ASP.NET Core Web API-ban.Megjegyzés:
PredictionEnginePoolA szolgáltatásbővítmény jelenleg előzetes verzióban érhető el.Megjegyzés hozzáadása a betanított modell előrejelzésének a metódusban való teszteléséhez a
Predict()következő példányMovieReviewlétrehozásával:var review = new MovieReview() { ReviewText = "this film is really good" };Adja át a teszt megjegyzésadatait a
Prediction Enginemetódus következő kódsorainakPredictSentiment()hozzáadásával:var sentimentPrediction = engine.Predict(review);A Predict() függvény egyetlen adatsorra készít előrejelzést:
Ingatlan Érték Típus előrejelzés [0.5459937, 0.454006255] lebegőpontos[] Hangulat-előrejelzés megjelenítése a következő kóddal:
Console.WriteLine($"Number of classes: {sentimentPrediction.Prediction?.Length}"); Console.WriteLine($"Is sentiment/review positive? {(sentimentPrediction.Prediction?[1] > 0.5 ? "Yes." : "No.")}");Hívás hozzáadása a
PredictSentimentmetódus meghívásaFit()után:PredictSentiment(mlContext, model);
Results
Készítse el és futtassa az alkalmazását.
Az eredményeknek az alábbihoz hasonlónak kell lenniük. A feldolgozás során üzenetek jelennek meg. Megjelenhetnek figyelmeztetések vagy üzenetek feldolgozása. Ezeket az üzeneteket a rendszer eltávolította az alábbi eredményekből az egyértelműség érdekében.
Number of classes: 2
Is sentiment/review positive ? Yes
Gratulálok! Sikeresen létrehozott egy gépi tanulási modellt az üzenetek hangulatának osztályozására és előrejelzésére az ML.NET keretrendszerben egy előre betanított TensorFlow modell újrafelhasználásával.
Az oktatóanyag forráskódját a dotnet/samples adattárban találja.
Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:
- Előre betanított TensorFlow-modell betöltése
- A webhely megjegyzésszövegének átalakítása a modellnek megfelelő funkciókká
- Előrejelzés készítése a modell használatával