Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide, web sitesi yorumlarında duyguları sınıflandırmak için önceden eğitilmiş bir TensorFlow modelinin nasıl kullanılacağı gösterilmektedir. İkili yaklaşım sınıflandırıcısı, Visual Studio kullanılarak geliştirilen bir C# konsol uygulamasıdır.
Bu öğreticide kullanılan TensorFlow modeli, IMDB veritabanındaki film incelemeleri kullanılarak eğitildi. Uygulamayı geliştirmeyi tamamladıktan sonra film inceleme metni sağlayabileceksiniz ve uygulama incelemenin olumlu veya olumsuz yaklaşımı olup olmadığını size söyleyecektir.
Bu eğitimde şunları öğreniyorsunuz:
- Önceden eğitilmiş TensorFlow modeli yükleme
- Web sitesi yorum metnini modele uygun özelliklere dönüştürün
- Tahminde bulunmak için modeli kullanma
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Önkoşullar
- Visual Studio 2022 veya daha yenisi ile .NET Masaüstü Geliştirme iş yükü yüklü.
Kurulum
Uygulamayı oluşturma
"TextClassificationTF" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 8'i seçin. Oluştur düğmesine tıklayın.
Veri kümesi dosyalarınızı kaydetmek için projenizde Data adlı bir dizin oluşturun.
Microsoft.ML NuGet Paketini yükleyin:
Uyarı
Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.
Çözüm Gezgini'nde projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paket kaynağı olarak "nuget.org" öğesini ve ardından Gözat sekmesini seçin. Microsoft.ML arayın, istediğiniz paketi seçin ve ardından Yükle'yi seçin. Seçtiğiniz paketin lisans koşullarını kabul ederek yüklemeye devam edin. Microsoft.ML.TensorFlow, Microsoft.ML.SampleUtils ve SciSharp.TensorFlow.Redist için bu adımları yineleyin.
Projeye TensorFlow modelini ekleme
Uyarı
Bu öğreticinin modeli dotnet/machinelearning-testdata GitHub deposundan alınıyor. Model TensorFlow SavedModel biçimindedir.
sentiment_model zip dosyasını indirin ve sıkıştırmasını açın.
Zip dosyası aşağıdakileri içerir:
-
saved_model.pb: TensorFlow modelinin kendisi. Model, bir IMDB gözden geçirme dizesindeki metni temsil eden sabit uzunlukta (boyut 600) bir tamsayı dizisini alır ve 1'e kadar olan iki olasılık verir: giriş gözden geçirmesinin pozitif yaklaşıma sahip olma olasılığı ve giriş gözden geçirmesinin negatif yaklaşıma sahip olma olasılığı. -
imdb_word_index.csv: tek tek sözcüklerden bir tamsayı değerine eşleme. Eşleme, TensorFlow modelinin giriş özelliklerini oluşturmak için kullanılır.
-
En
sentiment_modeliçteki dizinin içeriğini TextClassificationTF projesentiment_modeldizininize kopyalayın. Bu dizin, aşağıdaki görüntüde gösterildiği gibi bu öğretici için gereken modeli ve ek destek dosyalarını içerir:
Çözüm Gezgini'nde dizindeki ve alt dizindeki dosyaların her birine sağ tıklayın ve
sentiment_modelseçin. Gelişmiş altında, Çıkış Dizinine Kopyala değerini Daha yeniyse Kopyala olarak değiştirin.
Yönergeleri ve genel değişkenleri ekleme using
usingdosyasının en üstüne aşağıdaki ek yönergeleri ekleyin:using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Transforms;Kaydedilen model dosya yolunu tutmak için yönergelerin
usinghemen ardından bir genel değişken oluşturun.string _modelPath = Path.Combine(Environment.CurrentDirectory, "sentiment_model");-
_modelPath, eğitilen modelin dosya yoludur.
-
Verileri modelleme
Film incelemeleri serbest biçim metinleridir. Uygulamanız, metni model tarafından birkaç ayrı aşamada beklenen giriş biçimine dönüştürür.
Birincisi, metni ayrı sözcüklere bölmek ve sağlanan eşleme dosyasını kullanarak her sözcüğü bir tamsayı kodlamasına eşlemektir. Bu dönüşümün sonucu, tümcedeki sözcük sayısına karşılık gelen uzunluğa sahip değişken uzunluklu bir tamsayı dizisidir.
| Mülkiyet | Değer | Türü |
|---|---|---|
| Gözden GeçirMetni | Bu film gerçekten iyi | String |
| VariableLengthFeatures | 14,22,9,66,78,... | int[] |
Değişken uzunluğu özellik dizisi daha sonra sabit uzunluğu 600 olacak şekilde yeniden boyutlandırılır. Bu, TensorFlow modelinin beklediği uzunlukdur.
| Mülkiyet | Değer | Türü |
|---|---|---|
| Gözden GeçirMetni | Bu film gerçekten iyi | String |
| VariableLengthFeatures | 14,22,9,66,78,... | int[] |
| Özellikler | 14,22,9,66,78,... | int[600] |
Program.cs dosyasının en altında giriş verileriniz için bir sınıf oluşturun:
/// <summary> /// Class to hold original sentiment data. /// </summary> public class MovieReview { public string? ReviewText { get; set; } }giriş veri sınıfı,
MovieReviewkullanıcı açıklamaları için (stringReviewText) öğesine sahiptir.Sınıfından sonra
MovieReviewdeğişken uzunluğu özellikleri için bir sınıf oluşturun:/// <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; } }Bu
VariableLengthFeaturesözelliği, onu bir vektör olarak tanımlayan bir VectorType özniteliğine sahiptir. Tüm vektör öğeleri aynı türde olmalıdır. Çok sayıda sütun içeren veri kümelerinde, birden çok sütunu tek bir vektör olarak yüklemek, veri dönüştürmeleri uyguladığınızda veri geçişi sayısını azaltır.Bu sınıf eylemde
ResizeFeatureskullanılır. Özel eşleme eyleminin girişi olarak DataView'daki hangi sütunların kullanılabileceğini belirtmek için özelliklerinin adları (bu durumda yalnızca bir sütun) kullanılır.Sabit uzunluk özellikleri için sınıfından
VariableLengthsonra bir sınıf oluşturun:/// <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; } }Bu sınıf eylemde
ResizeFeatureskullanılır. Özel eşleme eyleminin çıktısı olarak DataView'da hangi sütunların kullanılabileceğini belirtmek için özelliklerinin adları (bu durumda yalnızca bir sütun) kullanılır.Özelliğin
Featuresadının TensorFlow modeli tarafından belirlendiğini unutmayın. Bu özellik adını değiştiremezsiniz."Öngörü için
FixedLengthsınıfından sonra bir sınıf oluşturun:"/// <summary> /// Class to contain the output values from the transformation. /// </summary> public class MovieReviewSentimentPrediction { [VectorType(2)] public float[]? Prediction { get; set; } }MovieReviewSentimentPrediction, model eğitiminden sonra kullanılan tahmin sınıfıdır.MovieReviewSentimentPredictiontekfloatbir dizi (Prediction) ve birVectorTypeözniteliği vardır.Özellik vektör uzunluğu gibi yapılandırma değerlerini tutmak için başka bir sınıf oluşturun:
static class Config { public const int FeatureLength = 600; }
Özellikleri yeniden boyutlandırmak için MLContext, arama sözlüğü ve eylem oluşturma
MLContext sınıfı, tüm ML.NET işlemleri için bir başlangıç noktasıdır. Başlatma işlemi mlContext , model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekine DBContext benzer, kavramsal olarak.
mlContext değişkenini
Console.WriteLine("Hello World!")bildirmek ve başlatmak için satırını aşağıdaki kodla değiştirin:MLContext mlContext = new MLContext();Aşağıdaki tabloda görüldüğü gibi, eşleme verilerini bir dosyadan yüklemek için yöntemini kullanarak
LoadFromTextFilesözcükleri tamsayı olarak kodlamak için bir sözlük oluşturun:Kelime Index çocuklar 362 istemek 181 yanlış 355 Efekt -leri 302 his 547 Arama eşlemesini oluşturmak için aşağıdaki kodu ekleyin:
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: ',' );Değişken uzunluklu tamsayı dizisini aşağıdaki kod satırları ile sabit boyutlu bir tamsayı dizisine dönüştürmek için bir
Actionekleyin.Action<VariableLength, FixedLength> ResizeFeaturesAction = (s, f) => { var features = s.VariableLengthFeatures; Array.Resize(ref features, Config.FeatureLength); f.Features = features; };
Önceden eğitilmiş TensorFlow modelini yükle
TensorFlow modelini yüklemek için kod ekleyin:
TensorFlowModel tensorFlowModel = mlContext.Model.LoadTensorFlowModel(_modelPath);Model yüklendikten sonra giriş ve çıkış şemasını ayıklayabilirsiniz. Şemalar yalnızca ilgi çekici ve öğrenme amacıyla görüntülenir. Son uygulamanın çalışması için bu koda ihtiyacınız yoktur:
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]})");Giriş şeması, tamsayı kodlanmış sözcüklerin sabit uzunlukta dizisidir. Çıkış şeması, incelemenin yaklaşımının negatif mi yoksa pozitif mi olduğunu gösteren bir float olasılık dizisidir. Duygunun negatif olma olasılığının tamamlayıcısı pozitif olma olasılığı olduğu için, bu değerler toplamda 1 eder.
ML.NET işlem hattını oluşturma
İşlem hattını oluşturun ve TokenizeIntoWords dönüşümünü kullanarak giriş metnini sözcüklere bölerek metni bir sonraki kod satırı olarak sözcüklere ayırın:
IEstimator<ITransformer> pipeline = // Split the text into individual words mlContext.Transforms.Text.TokenizeIntoWords("TokenizedWords", "ReviewText")TokenizeIntoWords dönüşümü, metin/dizeyi sözcükler halinde ayrıştırmak için boşluklar kullanır. Yeni bir sütun oluşturur ve her giriş dizesini kullanıcı tanımlı ayırıcıya göre bir alt dize vektörine böler.
Yukarıda bildirdiğiniz arama tablosunu kullanarak sözcükleri tamsayı kodlamalarına eşleyin:
// 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"))Değişken uzunluğu tamsayı kodlamalarını modelin gerektirdiği sabit uzunlukta olacak şekilde yeniden boyutlandırın:
// Resize variable length vector to fixed length vector. .Append(mlContext.Transforms.CustomMapping(ResizeFeaturesAction, "Resize"))Girişi yüklenen TensorFlow modeliyle sınıflandırın:
// Passes the data to TensorFlow for scoring .Append(tensorFlowModel.ScoreTensorFlowModel("Prediction/Softmax", "Features"))TensorFlow modelinin çıkışı
Prediction/Softmaxolarak adlandırılır. AdınPrediction/SoftmaxTensorFlow modeli tarafından belirlendiğini unutmayın. Bu adı değiştiremezsiniz.Çıkış tahmini için yeni bir sütun oluşturun:
// Retrieves the 'Prediction' from TensorFlow and copies to a column .Append(mlContext.Transforms.CopyColumns("Prediction", "Prediction/Softmax"));Sütunu C# sınıfında özellik olarak kullanılabilecek bir ada sahip bir sütuna kopyalamanız
Prediction/Softmaxgerekir:Prediction./C# özellik adında karaktere izin verilmez.
İşlem hattından ML.NET modeli oluşturma
modeli işlem hattından oluşturmak için kodu ekleyin:
// Create an executable model from the estimator pipeline IDataView dataView = mlContext.Data.LoadFromEnumerable(new List<MovieReview>()); ITransformer model = pipeline.Fit(dataView);yöntemi çağrılarak
Fitişlem hattındaki tahmin aracı zincirinden bir ML.NET modeli oluşturulur. Bu durumda, TensorFlow modeli daha önce eğitilmiş olduğundan modeli oluşturmak için herhangi bir veri sığdırmamış olursunuz. Yönteminin gereksinimleriniFitkarşılamak için boş bir veri görünümü nesnesi sağlarsınız.
Tahminde bulunmak için modeli kullanma
PredictSentimentyöntemini sınıfınMovieReviewüstüne ekleyin:void PredictSentiment(MLContext mlContext, ITransformer model) { }yönteminin ilk satırı
PredictionEngineolarak oluşturmakPredictSentiment()için aşağıdaki kodu ekleyin:var engine = mlContext.Model.CreatePredictionEngine<MovieReview, MovieReviewSentimentPrediction>(model);PredictionEngine, tek bir veri örneği üzerinde tahmin gerçekleştirmenizi sağlayan kullanışlı bir API'dir.
PredictionEngineiş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarda kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği içinPredictionEnginePoolhizmetini kullanın. Bu hizmet, uygulamanız genelinde kullanılmak üzere birPredictionEnginenesneObjectPoololuşturur. ASP.NET Core Web API'sinde kullanmaPredictionEnginePoolhakkında bu kılavuza bakın.Uyarı
PredictionEnginePoolhizmet uzantısı şu anda önizleme aşamasındadır.Predict()yönteminde,MovieReviewörneğini oluşturarak eğitilen modelin tahminini test etmek için bir yorum ekleyin.var review = new MovieReview() { ReviewText = "this film is really good" };yöntemine sonraki kod
Prediction Enginesatırlarını ekleyerek test açıklaması verileriniPredictSentiment()öğesine geçirin:var sentimentPrediction = engine.Predict(review);Predict() işlevi tek bir veri satırında tahminde bulunur:
Mülkiyet Değer Türü Prediction [0.5459937, 0.454006255] float[] Aşağıdaki kodu kullanarak yaklaşım tahminini görüntüleyin:
Console.WriteLine($"Number of classes: {sentimentPrediction.Prediction?.Length}"); Console.WriteLine($"Is sentiment/review positive? {(sentimentPrediction.Prediction?[1] > 0.5 ? "Yes." : "No.")}");yöntemini çağırdıktan
PredictSentimentsonra çağrısıFit()ekleyin:PredictSentiment(mlContext, model);
Results
Uygulamanızı derleyin ve çalıştırın.
Sonuçlarınız aşağıdakine benzer olmalıdır. İşleme sırasında iletiler görüntülenir. Uyarılar görebilir veya iletileri işleyebilirsiniz. Bu iletiler netlik için aşağıdaki sonuçlardan kaldırılmıştır.
Number of classes: 2
Is sentiment/review positive ? Yes
Tebrikler! Artık ML.NET'de önceden eğitilmiş TensorFlow bir modeli yeniden kullanarak iletilerin yaklaşımını sınıflandırmak ve tahmin etmek için başarıyla bir makine öğrenmesi modeli oluşturdunuz.
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Bu öğreticide şunların nasıl yapılacağını öğrendiniz:
- Önceden eğitilmiş TensorFlow modeli yükleme
- Web sitesi yorum metnini modele uygun özelliklere dönüştürün
- Tahminde bulunmak için modeli kullanma