Öğretici: ML.NET'de önceden eğitilmiş bir TensorFlow modeli kullanarak film incelemelerinin yaklaşımını analiz etme
Bu öğreticide, web sitesi yorumlarında yaklaşımı 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ından 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 öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Önceden eğitilmiş bir TensorFlow modelini yükleme
- Web sitesi yorum metnini modele uygun özelliklere dönüştürme
- Tahminde bulunmak için modeli kullanma
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Önkoşullar
- ".NET Masaüstü Geliştirme" iş yükü yüklü Visual Studio 2022.
Kurulum
Uygulama oluşturma
"TextClassificationTF" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 6'yı 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:
Not
Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.
Çözüm Gezgini'da 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 düğmesini 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.
TensorFlow modelini projeye ekleme
Not
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 toplam 1 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_model
içteki dizinin içeriğini TextClassificationTF projesentiment_model
dizininize 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 dizininde ve alt dizinindeki dosyaların her birine sağ tıklayıp Özellikler'i
sentiment_model
seçin. Gelişmiş'in altında, Çıktı Dizinine Kopyala değerini daha yeniyse Kopyala olarak değiştirin.
Using deyimleri ve genel değişkenler ekleme
Aşağıdaki ek
using
deyimleri Program.cs dosyasının en üstüne ekleyin:using Microsoft.ML; using Microsoft.ML.Data; using Microsoft.ML.Transforms;
Kaydedilen model dosya yolunu tutmak için using deyimlerinden hemen sonra 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çimli metindir. 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.
Özellik | Değer | Tür |
---|---|---|
Gözden GeçirMetni | Bu film gerçekten iyi | string |
VariableLengthFeatures | 14,22,9,66,78,... | int[] |
Değişken uzunluk özellik dizisi daha sonra sabit uzunluğu 600 olacak şekilde yeniden boyutlandırılır. Bu, TensorFlow modelinin beklediği uzunlukdur.
Özellik | 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ı,
MovieReview
kullanıcı yorumları için birstring
öğesine sahiptir (ReviewText
).Sınıfından sonra
MovieReview
değ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; } }
özelliği,
VariableLengthFeatures
vektör olarak belirlemeye ilişkin 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ütunun tek bir vektör olarak yüklenmesi, veri dönüştürmeleri uyguladığınızda veri geçişi sayısını azaltır.Bu sınıf eylemde
ResizeFeatures
kullanı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 uzunluklu özellikler için sınıfından
VariableLength
sonra 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
ResizeFeatures
kullanılır. Özel eşleme eyleminin çıktısı 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.Özelliğin
Features
adının TensorFlow modeli tarafından belirlendiğini unutmayın. Bu özellik adını değiştiremezsiniz.Sınıfından sonra
FixedLength
tahmin için 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.MovieReviewSentimentPrediction
tekfloat
bir diziye (Prediction
) ve birVectorType
özniteliğe sahiptir.Ö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
LoadFromTextFile
sözcükleri tamsayı olarak kodlamak için bir sözlük oluşturun:Word Dizin oluşturma Çocuklar 362 Istiyor 181 Yanlış 355 effects 302 Duygu 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: ',' );
Action
Değişken uzunluktaki sözcük tamsayı dizisini, sonraki kod satırlarıyla sabit boyutlu bir tamsayı dizisine yeniden boyutlandırmak için bir ekleyin: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ükleme
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 alanına ve öğrenmeye yönelik olarak 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ı, bir incelemenin yaklaşımının negatif mi yoksa pozitif mi olduğunu gösteren bir float olasılık dizisidir. Pozitif olma olasılığı, yaklaşımın negatif olma olasılığının tamamlayıcısı olduğundan, bu değerler 1'e kadar toplamı alır.
ML.NET işlem hattını oluşturma
Ardışık düzeni 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ü, metni/dizeyi sözcükler halinde ayrıştırmak için boşluk 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 uzunluklu 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 modeli çıkışı olarak adlandırılır
Prediction/Softmax
. AdınPrediction/Softmax
TensorFlow 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/Softmax
gerekir: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
Fit
işlem hattındaki tahmin araçları 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ırmayacağız. Yönteminin gereksinimleriniFit
karşılamak için boş bir veri görünümü nesnesi sağlarız.
Tahminde bulunmak için modeli kullanma
PredictSentiment
yöntemini sınıfının üstüneMovieReview
ekleyin:void PredictSentiment(MLContext mlContext, ITransformer model) { }
yönteminin ilk satırı
PredictSentiment()
olarak oluşturmakPredictionEngine
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.
PredictionEngine
iş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarında kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği için, uygulamanızınPredictionEnginePool
PredictionEngine
tamamında kullanmak üzere birObjectPool
nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanmaPredictionEnginePool
hakkında bu kılavuza bakın.Not
PredictionEnginePool
hizmet uzantısı şu anda önizleme aşamasındadır.bir örneği oluşturarak yönteminde eğitilen modelin tahminini
Predict()
MovieReview
test etmek için bir açıklama ekleyin:var review = new MovieReview() { ReviewText = "this film is really good" };
yöntemine sonraki kod satırlarını ekleyerek test açıklaması verilerini
Prediction Engine
öğesinePredictSentiment()
geçirin:var sentimentPrediction = engine.Predict(review);
Predict() işlevi tek bir veri satırı üzerinde tahminde bulunur:
Özellik Değer Tür Tahmin [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
Fit()
sonra çağrısıPredictSentiment
ekleyin:PredictSentiment(mlContext, model);
Sonuçlar
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 bir makine öğrenmesi modelini başarıyla oluşturdunuz.
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Bu öğreticide, şunların nasıl yapıldığını öğrendiniz:
- Önceden eğitilmiş bir TensorFlow modelini yükleme
- Web sitesi yorum metnini modele uygun özelliklere dönüştürün
- Tahminde bulunmak için modeli kullanma
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin