Aracılığıyla paylaş


Öğ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

Kurulum

Uygulama oluşturma

  1. "TextClassificationTF" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.

  2. Kullanılacak çerçeve olarak .NET 6'yı seçin. Oluştur düğmesine tıklayın.

  3. Veri kümesi dosyalarınızı kaydetmek için projenizde Data adlı bir dizin oluşturun.

  4. 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.

  1. 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.
  2. En sentiment_model içteki dizinin içeriğini TextClassificationTF proje sentiment_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:

    dizin içeriğini sentiment_model

  3. Çözüm Gezgini dizininde ve alt dizinindeki dosyaların her birine sağ tıklayıp Özellikler'isentiment_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

  1. 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;
    
  2. 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]
  1. 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ı yorumları için bir string öğesine sahiptir (ReviewText).

  2. 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.

  3. 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.

  4. 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 tek float bir diziye (Prediction) ve bir VectorType özniteliğe sahiptir.

  5. Ö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.

  1. 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();
    
  2. 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: ','
        );
    
  3. 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

  1. 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

  1. 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.

  2. 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"))
    
  3. 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"))
    
  4. 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ın Prediction/Softmax TensorFlow modeli tarafından belirlendiğini unutmayın. Bu adı değiştiremezsiniz.

  5. Çı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

  1. 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 gereksinimlerini Fit karşılamak için boş bir veri görünümü nesnesi sağlarız.

Tahminde bulunmak için modeli kullanma

  1. PredictSentiment yöntemini sınıfının üstüne MovieReview ekleyin:

    void PredictSentiment(MLContext mlContext, ITransformer model)
    {
    
    }
    
  2. yönteminin ilk satırı PredictSentiment() olarak oluşturmak PredictionEngine 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ın PredictionEnginePoolPredictionEngine tamamında kullanmak üzere bir ObjectPool nesne oluşturan hizmetini kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

    Not

    PredictionEnginePool hizmet uzantısı şu anda önizleme aşamasındadır.

  3. bir örneği oluşturarak yönteminde eğitilen modelin tahminini Predict()MovieReviewtest etmek için bir açıklama ekleyin:

    var review = new MovieReview()
    {
        ReviewText = "this film is really good"
    };
    
  4. yöntemine sonraki kod satırlarını ekleyerek test açıklaması verilerini Prediction Engine öğesine PredictSentiment() geçirin:

    var sentimentPrediction = engine.Predict(review);
    
  5. Predict() işlevi tek bir veri satırı üzerinde tahminde bulunur:

    Özellik Değer Tür
    Tahmin [0.5459937, 0.454006255] float[]
  6. 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.")}");
    
  7. 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