Tutorial: Generieren eines ML.NET-Bildklassifizierungsmodells aus einem vortrainierten TensorFlow-ModellTutorial: Generate an ML.NET image classification model from a pre-trained TensorFlow model

Erfahren Sie, wie Sie das erworbene Wissen aus einem vorhandenen TensorFlow-Modell in ein neues ML.NET-Bildklassifizierungsmodell übertragen können.Learn how to transfer the knowledge from an existing TensorFlow model into a new ML.NET image classification model.

Das TensorFlow-Modell wurde trainiert, um Bilder in tausend Kategorien zu klassifizieren.The TensorFlow model was trained to classify images into a thousand categories. Das ML.NET-Modell nutzt einen Teil des TensorFlow-Modells in seiner Pipeline, um ein Modell zur Klassifizierung von Bildern in 3 Kategorien zu trainieren.The ML.NET model makes use of part of the TensorFlow model in its pipeline to train a model to classify images into 3 categories.

Das von Grund auf neue Trainieren eines Modells zur Bildklassifizierung erfordert das Einstellen von Millionen von Parametern, zahlreiche bezeichnete Trainingsdaten und eine große Menge an Computeressourcen (Hunderte von GPU-Stunden).Training an Image Classification model from scratch requires setting millions of parameters, a ton of labeled training data and a vast amount of compute resources (hundreds of GPU hours). Transfer Learning ist zwar nicht so effektiv wie das von Grund auf neue Trainieren eines benutzerdefinierten Modells, doch damit können Sie diesen Prozess durch die Arbeit mit Tausenden von Bildern im Vergleich zur Arbeit mit Millionen bezeichneter Bilder abkürzen und relativ schnell ein benutzerdefiniertes Modell erstellen (innerhalb einer Stunde auf einem Computer ohne eine GPU).While not as effective as training a custom model from scratch, transfer learning allows you to shortcut this process by working with thousands of images vs. millions of labeled images and build a customized model fairly quickly (within an hour on a machine without a GPU). In diesem Tutorial wird dieser Prozess noch weiter herunterskaliert, indem nur ein Dutzend Trainingsbilder verwendet werden.This tutorial scales that process down even further, using only a dozen training images.

In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:In this tutorial, you learn how to:

  • Das Problem verstehenUnderstand the problem
  • Integrieren des vortrainierten TensorFlow-Modells in die ML.NET-PipelineIncorporate the pre-trained TensorFlow model into the ML.NET pipeline
  • Trainieren und Auswerten des ML.NET-ModellsTrain and evaluate the ML.NET model
  • Klassifizieren eines TestbildsClassify a test image

Sie finden den Quellcode für dieses Tutorial im Repository dotnet/samples.You can find the source code for this tutorial at the dotnet/samples repository. Hinweis: Die .NET-Projektkonfiguration, die für dieses Tutorial verwendet wird, ist standardmäßig auf .NET Core 2.2 ausgerichtet.Note that by default, the .NET project configuration for this tutorial targets .NET core 2.2.

Was ist Übertragungslernen?What is transfer learning?

Übertragungslernen ist der Prozess der Verwendung von Wissen, das bei der Lösung eines Problems erworben wurde, und der Anwendung dieses Wissens auf ein anderes, aber verwandtes Problem.Transfer learning is the process of using knowledge gained while solving one problem and applying it to a different but related problem.

Für dieses Tutorial verwenden Sie einen Teil eines TensorFlow-Modells – trainiert, um Bilder in tausend Kategorien zu klassifizieren – in einem ML.NET-Modell, das Bilder in drei Kategorien klassifiziert.For this tutorial, you use part of a TensorFlow model - trained to classify images into a thousand categories - in an ML.NET model that classifies images into 3 categories.

Erforderliche KomponentenPrerequisites

Auswählen der richtigen Machine Learning-AufgabeSelect the right machine learning task

Deep LearningDeep learning

Deep Learning ist eine Teilmenge von Machine Learning, die Bereiche wie maschinelles Sehen und Spracherkennung revolutioniert.Deep learning is a subset of Machine Learning, which is revolutionizing areas like Computer Vision and Speech Recognition.

Deep Learning-Modelle werden mithilfe großer Mengen bezeichneter Daten und neuronaler Netze trainiert, die mehrere Lernebenen enthalten.Deep learning models are trained by using large sets of labeled data and neural networks that contain multiple learning layers. Deep Learning:Deep learning:

  • Bietet bei einigen Aufgaben eine bessere Leistung als maschinelles Sehen.Performs better on some tasks like Computer Vision.
  • Erfordert große Mengen an Trainingsdaten.Requires huge amounts of training data.

Bildklassifizierung ist eine gängige Machine Learning-Aufgabe, mit der automatisch Bilder in mehrere Kategorien klassifiziert werden können, beispielsweise:Image Classification is a common Machine Learning task that allows us to automatically classify images into categories such as:

  • Erkennen, ob ein Bild ein menschliches Gesicht enthält oder nicht.Detecting a human face in an image or not.
  • Unterscheiden zwischen Katzen und Hunden.Detecting cats vs. dogs.

Es lässt sich auch wie in den folgenden Bildern bestimmen, ob ein Bild ein Lebensmittel, ein Spielzeug oder ein Gerät zeigt:Or as in the following images, determining if an image is a(n) food, toy, or appliance:

Pizzabild Teddybärbild Toasterbildpizza image teddy bear image toaster image

Hinweis

Die vorherigen Abbildungen stammen aus Wikimedia-Commons und unterliegen folgendem Urheberrecht:The preceding images belong to Wikimedia Commons and are attributed as follows:

Das Inception model ist darauf trainiert, Bilder in tausend Kategorien zu klassifizieren, jedoch müssen Sie für dieses Tutorial Bilder in eine kleinere Kategoriegruppe und nur in diese Kategorien klassifizieren.The Inception model is trained to classify images into a thousand categories, but for this tutorial, you need to classify images in a smaller category set, and only those categories. Geben Sie den transfer-Teil von transfer learning ein.Enter the transfer part of transfer learning. Sie können die Fähigkeit des Inception model zum Erkennen und Klassifizieren von Bildern auf die neuen begrenzten Kategorien Ihrer benutzerdefinierten Bildklassifizierung übertragen.You can transfer the Inception model's ability to recognize and classify images to the new limited categories of your custom image classifier.

  • LebensmittelFood
  • SpielzeugToy
  • GerätAppliance

Dieses Tutorial verwendet das TensorFlow-Deep Learning-Modell Inception, ein beliebtes Bilderkennungsmodell, das mit dem Dataset ImageNet trainiert wurde.This tutorial uses the TensorFlow Inception model deep learning model, a popular image recognition model trained on the ImageNet dataset. Das TensorFlow-Modell klassifiziert ganze Bilder in tausend Klassen wie „Regenschirm“, „Trikot“ und „Geschirrspüler“.The TensorFlow model classifies entire images into a thousand classes, such as “Umbrella”, “Jersey”, and “Dishwasher”.

Da das Inception model bereits anhand von Tausenden anderer Bilder vortrainiert wurde, enthält es intern die zur Bildidentifizierung erforderlichen Bildmerkmale.Because the Inception model has already been pre trained on thousands of different images, internally it contains the image features needed for image identification. Wir können diese internen Bildmerkmale im Modell verwenden, um ein neues Modell mit weitaus weniger Klassen zu trainieren.We can make use of these internal image features in the model to train a new model with far fewer classes.

Wie im folgenden Diagramm dargestellt, fügen Sie einen Verweis auf die ML.NET-NuGet-Pakete in Ihrer .NET Core- oder .NET Framework-Anwendung hinzu.As shown in the following diagram, you add a reference to the ML.NET NuGet packages in your .NET Core or .NET Framework applications. Im Hintergrund beinhaltet und verweist ML.NET auf die native TensorFlow-Bibliothek, mit der Sie Code schreiben können, der eine vorhandene trainierte TensorFlow-Modelldatei lädt.Under the covers, ML.NET includes and references the native TensorFlow library that allows you to write code that loads an existing trained TensorFlow model file.

TensorFlow-Transformation – ML.NET Arch-Diagramm

MultiklassenklassifizierungMulticlass classification

Nachdem wir das TensorFlow-Inception-Modell verwendet haben, um Merkmale zu extrahieren, die als Eingabe für einen klassischen Machine Learning-Algorithmus geeignet sind, fügen wir einen ML.NET-Multiklassenklassifizierer hinzu.After using the TensorFlow inception model to extract features suitable as input for a classical machine learning algorithm, we add an ML.NET multi-class classifier.

Der in diesem Fall verwendete Trainingsmechanismus ist der multinomiale logistische Regressionsalgorithmus.The specific trainer used in this case is the multinomial logistic regression algorithm.

Der von diesem Trainingsmechanismus implementierte Algorithmus eignet sich gut für Probleme mit einer Vielzahl von Merkmalen, was bei einem Deep Learning-Modell der Fall ist, das mit Bilddaten arbeitet.The algorithm implemented by this trainer performs well on problems with a large number of features, which is the case for a deep learning model operating on image data.

DatenData

Es gibt zwei Datenquellen: die .tsv-Datei und die Bilddateien.There are two data sources: the .tsv file, and the image files. Die tags.tsv-Datei enthält zwei Spalten: die erste ist als ImagePath definiert und die zweite das Label für das Bild.The tags.tsv file contains two columns: the first one is defined as ImagePath and the second one is the Label corresponding to the image. Die folgende Beispieldatei verfügt nicht über eine Kopfzeile und sieht wie folgt aus:The following example file doesn't have a header row, and looks like this:

broccoli.jpg    food
pizza.jpg   food
pizza2.jpg  food
teddy2.jpg  toy
teddy3.jpg  toy
teddy4.jpg  toy
toaster.jpg appliance
toaster2.png    appliance

Die Trainings- und Testbilder befinden sich in dem Assetsordner, den Sie in einer ZIP-Datei herunterladen.The training and testing images are located in the assets folders that you'll download in a zip file. Diese Bilder gehören zu Wikimedia Commons.These images belong to Wikimedia Commons.

Wikimedia-Commons, das Repository für kostenlose Medien.Wikimedia Commons, the free media repository. Abgerufen am 17. Oktober 2018 um 10:48 Uhr aus: https://commons.wikimedia.org/wiki/Pizza https://commons.wikimedia.org/wiki/Toaster https://commons.wikimedia.org/wiki/Teddy_bearRetrieved 10:48, October 17, 2018 from: https://commons.wikimedia.org/wiki/Pizza https://commons.wikimedia.org/wiki/Toaster https://commons.wikimedia.org/wiki/Teddy_bear

SetupSetup

Erstellen eines ProjektsCreate a project

  1. Erstellen Sie eine .NET Core-Konsolenanwendung mit dem Namen „TransferLearningTF“.Create a .NET Core Console Application called "TransferLearningTF".

  2. Installieren des Microsoft.ML NuGet-Pakets:Install the Microsoft.ML NuGet Package:

    • Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie NuGet-Pakete verwalten aus.In Solution Explorer, right-click on your project and select Manage NuGet Packages.
    • Wählen Sie „nuget.org“ als Paketquelle aus, wählen Sie die Registerkarte „Durchsuchen“ aus, und suchen Sie nach Microsoft.ML.Choose "nuget.org" as the Package source, select the Browse tab, search for Microsoft.ML.
    • Klicken Sie auf die Dropdownliste Version, und wählen Sie das Paket mit der Version 1.4.0 in der Liste aus. Klicken Sie dann auf die Schaltfläche Installieren.Click on the Version drop-down, select the 1.4.0 package in the list, and select the Install button.
    • Klicken Sie im Dialogfeld Vorschau der Änderungen auf die Schaltfläche OK.Select the OK button on the Preview Changes dialog.
    • Wählen Sie die Schaltfläche Ich stimme zu im Dialogfeld Zustimmung zur Lizenz, wenn Sie mit den Lizenzbedingungen für die aufgeführten Pakete einverstanden sind.Select the I Accept button on the License Acceptance dialog if you agree with the license terms for the packages listed.
    • Wiederholen Sie diese Schritte für Microsoft.ML.ImageAnalytics v1.4.0, SciSharp.TensorFlow.Redist v1.15.0 und Microsoft.ML.TensorFlow v1.4.0.Repeat these steps for Microsoft.ML.ImageAnalytics v1.4.0, SciSharp.TensorFlow.Redist v1.15.0 and Microsoft.ML.TensorFlow v1.4.0.

Herunterladen von RessourcenDownload assets

  1. Laden Sie die ZIP-Datei des Projektassetverzeichnisses herunter, und entzippen Sie sie.Download The project assets directory zip file, and unzip.

  2. Kopieren Sie das assets-Verzeichnis in Ihr TransferLearningTF-Projektverzeichnis.Copy the assets directory into your TransferLearningTF project directory. Dieses Verzeichnis und seine Unterverzeichnisse enthalten die für dieses Tutorial erforderlichen Daten und Unterstützungsdateien (mit Ausnahme des Inception-Modells, das Sie im nächsten Schritt herunterladen und hinzufügen).This directory and its subdirectories contain the data and support files (except for the Inception model, which you'll download and add in the next step) needed for this tutorial.

  3. Laden Sie das Inception-Modell herunter, und entzippen Sie es.Download the Inception model, and unzip.

  4. Kopieren Sie den Inhalt des gerade entzippten inception5h-Verzeichnisses in Ihr TransferLearningTF-Projektverzeichnis assets/inception.Copy the contents of the inception5h directory just unzipped into your TransferLearningTF project assets/inception directory. Dieses Verzeichnis enthält das Modell und die zusätzlich für dieses Tutorial erforderlichen Unterstützungsdateien wie in der folgenden Abbildung gezeigt:This directory contains the model and additional support files needed for this tutorial, as shown in the following image:

    Inhalt des Inception-Verzeichnisses

  5. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf alle Dateien im Assetverzeichnis und den Unterverzeichnissen, und wählen Sie Eigenschaften aus.In Solution Explorer, right-click each of the files in the asset directory and subdirectories and select Properties. Ändern Sie unter Erweitert den Wert von In Ausgabeverzeichnis kopieren in Kopieren, wenn neuer.Under Advanced, change the value of Copy to Output Directory to Copy if newer.

Erstellen von Klassen und Definieren von PfadenCreate classes and define paths

  1. Fügen Sie am Anfang der Datei Program.cs folgende zusätzliche using-Anweisungen hinzu:Add the following additional using statements to the top of the Program.cs file:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Microsoft.ML;
    using Microsoft.ML.Data;
    
  2. Fügen Sie den folgenden Code der Zeile direkt über der Main-Methode hinzu, um die Ressourcenpfade anzugeben:Add the following code to the line right above the Main method to specify the asset paths:

    static readonly string _assetsPath = Path.Combine(Environment.CurrentDirectory, "assets");
    static readonly string _imagesFolder = Path.Combine(_assetsPath, "images");
    static readonly string _trainTagsTsv = Path.Combine(_imagesFolder, "tags.tsv");
    static readonly string _testTagsTsv = Path.Combine(_imagesFolder, "test-tags.tsv");
    static readonly string _predictSingleImage = Path.Combine(_imagesFolder, "toaster3.jpg");
    static readonly string _inceptionTensorFlowModel = Path.Combine(_assetsPath, "inception", "tensorflow_inception_graph.pb");
    
  3. Erstellen Sie anschließend Klassen für Ihre Eingabedaten und Vorhersagen.Create classes for your input data, and predictions.

    public class ImageData
    {
        [LoadColumn(0)]
        public string ImagePath;
    
        [LoadColumn(1)]
        public string Label;
    }
    

    ImageData ist die Eingabebilddaten-Klasse mit den folgenden String-Feldern:ImageData is the input image data class and has the following String fields:

    • ImagePath enthält den Bilddateinamen.ImagePath contains the image file name.
    • Label enthält einen Wert für die Bildbezeichnung.Label contains a value for the image label.
  4. Fügen Sie dem Projekt eine neue Klasse für ImagePrediction hinzu:Add a new class to your project for ImagePrediction:

    public class ImagePrediction : ImageData
    {
        public float[] Score;
    
        public string PredictedLabelValue;
    }
    

    ImagePrediction ist die Bildvorhersageklasse und hat die folgenden Felder:ImagePrediction is the image prediction class and has the following fields:

    • Score enthält den Zuverlässigkeitsprozentsatz für eine bestimmte Bildklassifizierung.Score contains the confidence percentage for a given image classification.
    • PredictedLabelValue enthält einen Wert für die vorhergesagte Bildklassifizierungsbezeichnung.PredictedLabelValue contains a value for the predicted image classification label.

    Die ImagePrediction-Klasse wird für die Vorhersage verwendet, nachdem das Modell trainiert wurde.ImagePrediction is the class used for prediction after the model has been trained. Sie besitzt einen string (ImagePath) für den Bildpfad.It has a string (ImagePath) for the image path. Mit Label wird das Modell wiederverwendet und trainiert.The Label is used to reuse and train the model. Das PredictedLabelValue wird während der Vorhersage und Evaluierung verwendet.The PredictedLabelValue is used during prediction and evaluation. Für die Evaluierung werden eine Eingabe mit Trainingsdaten, die vorhergesagten Werte und das Modell verwendet.For evaluation, an input with training data, the predicted values, and the model are used.

Initialisieren von Variablen in MainInitialize variables in Main

  1. Initialisieren Sie die mlContext-Variable mit einer neuen Instanz von MLContext.Initialize the mlContext variable with a new instance of MLContext. Ersetzen Sie die Zeile Console.WriteLine("Hello World!") mit dem folgenden Code in der Main-Methode:Replace the Console.WriteLine("Hello World!") line with the following code in the Main method:

    MLContext mlContext = new MLContext();
    

    Die MLContext-Klasse ist der Startpunkt für alle ML.NET-Vorgänge. Durch das Initialisieren von mlContext wird eine neue ML.NET-Umgebung erstellt, die für mehrere Objekte des Modellerstellungsworkflows verwendet werden kann.The MLContext class is a starting point for all ML.NET operations, and initializing mlContext creates a new ML.NET environment that can be shared across the model creation workflow objects. Die Klasse ähnelt dem Konzept von DBContext in Entity Framework.It's similar, conceptually, to DBContext in Entity Framework.

Erstellen einer Struktur für Inception-ModellparameterCreate a struct for Inception model parameters

  1. Das Inception-Modell verfügt über mehrere Parameter, die Sie übergeben müssen.The Inception model has several parameters you need to pass in. Erstellen Sie unmittelbar nach der Main()-Methode eine Struktur, um Anzeigenamen mit dem folgenden Code die Parameterwerte zuzuordnen:Create a struct to map the parameter values to friendly names with the following code, just after the Main() method:

    private struct InceptionSettings
    {
        public const int ImageHeight = 224;
        public const int ImageWidth = 224;
        public const float Mean = 117;
        public const float Scale = 1;
        public const bool ChannelsLast = true;
    }
    

Erstellen einer Anzeigehilfsprogramm-MethodeCreate a display utility method

Da Sie die Bilddaten und die zugehörigen Vorhersagen mehr als einmal anzeigen werden, erstellen Sie eine Anzeigehilfsmethode, um die Anzeige der Bild- und Vorhersageergebnisse zu verarbeiten.Since you'll display the image data and the related predictions more than once, create a display utility method to handle displaying the image and prediction results.

  1. Erstellen Sie die DisplayResults()-Methode mit dem folgenden Code direkt nach der InceptionSettings-Struktur:Create the DisplayResults() method, just after the InceptionSettings struct, using the following code:

    private static void DisplayResults(IEnumerable<ImagePrediction> imagePredictionData)
    {
    
    }
    
  2. Geben Sie den Text der DisplayResults-Methode ein:Fill in the body of the DisplayResults method:

    foreach (ImagePrediction prediction in imagePredictionData)
    {
        Console.WriteLine($"Image: {Path.GetFileName(prediction.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score.Max()} ");
    }
    

Erstellen einer Hilfsprogrammmethode für die TSV-DateiCreate a .tsv file utility method

  1. Erstellen Sie die ReadFromTsv()-Methode mit dem folgenden Code direkt nach der DisplayResults()-Methode:Create the ReadFromTsv() method, just after the DisplayResults() method, using the following code:

    public static IEnumerable<ImageData> ReadFromTsv(string file, string folder)
    {
    
    }
    
  2. Geben Sie den Text der ReadFromTsv-Methode ein:Fill in the body of the ReadFromTsv method:

    return File.ReadAllLines(file)
     .Select(line => line.Split('\t'))
     .Select(line => new ImageData()
     {
         ImagePath = Path.Combine(folder, line[0])
     });
    

    Der Code analysiert die tags.tsv-Datei, um den Dateipfad für die ImagePath-Eigenschaft dem Namen der Bilddatei hinzuzufügen und ihn und das Label in ein ImageData-Objekt zu laden.The code parses through the tags.tsv file to add the file path to the image file name for the ImagePath property and load it and the Label into an ImageData object.

Erstellen einer Methode zum Treffen einer VorhersageCreate a method to make a prediction

  1. Erstellen Sie die ClassifySingleImage()-Methode mit dem folgenden Code direkt vor der DisplayResults()-Methode:Create the ClassifySingleImage() method, just before the DisplayResults() method, using the following code:

    public static void ClassifySingleImage(MLContext mlContext, ITransformer model)
    {
    
    }
    
  2. Erstellen Sie ein ImageData-Objekt, das den vollqualifizierten Pfad und Bilddateinamen für den einzelnen ImagePath enthält.Create an ImageData object that contains the fully qualified path and image file name for the single ImagePath. Fügen Sie der ClassifySingleImage()-Methode folgenden Code als nächste Zeilen hinzu:Add the following code as the next lines in the ClassifySingleImage() method:

    var imageData = new ImageData()
    {
        ImagePath = _predictSingleImage
    };
    
  3. Treffen Sie eine einzelne Vorhersage, indem Sie den folgenden Code als nächste Zeile in der ClassifySingleImage-Methode hinzufügen:Make a single prediction, by adding the following code as the next line in the ClassifySingleImage method:

    // Make prediction function (input = ImageData, output = ImagePrediction)
    var predictor = mlContext.Model.CreatePredictionEngine<ImageData, ImagePrediction>(model);
    var prediction = predictor.Predict(imageData);
    

    Um die Vorhersage zu erhalten, verwenden Sie die Predict()-Methode.To get the prediction, use the Predict() method. Die PredictionEngine ist eine Hilfs-API, mit der Sie eine Vorhersage für eine einzelne Instanz der Daten treffen können.The PredictionEngine is a convenience API, which allows you to perform a prediction on a single instance of data. PredictionEngine ist nicht threadsicher.PredictionEngine is not thread-safe. Die Verwendung in Singlethread-oder Prototypumgebungen ist zulässig.It's acceptable to use in single-threaded or prototype environments. Zur Verbesserung der Leistung und Threadsicherheit in Produktionsumgebungen verwenden Sie den PredictionEnginePool-Dienst, der einen ObjectPool aus PredictionEngine-Objekten für die Verwendung in Ihrer gesamten Anwendung erstellt.For improved performance and thread safety in production environments, use the PredictionEnginePool service, which creates an ObjectPool of PredictionEngine objects for use throughout your application. Informationen zur Verwendung von PredictionEnginePool in einer ASP.NET Core-Web-API finden Sie in dieser Anleitung.See this guide on how to use PredictionEnginePool in an ASP.NET Core Web API.

    Hinweis

    Die PredictionEnginePool-Diensterweiterung ist derzeit als Vorschauversion verfügbar.PredictionEnginePool service extension is currently in preview.

  4. Zeigen Sie das Vorhersageergebnis als nächste Codezeile in der ClassifySingleImage()-Methode an:Display the prediction result as the next line of code in the ClassifySingleImage() method:

    Console.WriteLine($"Image: {Path.GetFileName(imageData.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score.Max()} ");
    

Erstellen der ML.NET-ModellpipelineConstruct the ML.NET model pipeline

Eine ML.NET-Modellpipeline ist eine Kette von Kalkulatoren.An ML.NET model pipeline is a chain of estimators. Beachten Sie, dass während der Pipelineerstellung keine Ausführung erfolgt.Note that no execution happens during pipeline construction. Die Kalkulatorobjekte werden erstellt, aber nicht ausgeführt.The estimator objects are created but not executed.

  1. Hinzufügen einer Methode zum Generieren des ModellsAdd a method to generate the model

    Diese Methode ist das Herzstück des Tutorials.This method is the heart of the tutorial. Sie erstellt eine Pipeline für das Modell und trainiert die Pipeline, um das ML.NET-Modell zu generieren.It creates a pipeline for the model, and trains the pipeline to produce the ML.NET model. Außerdem wertet sie das Modell anhand einiger zuvor unbekannter Testdaten aus.It also evaluates the model against some previously unseen test data.

    Erstellen Sie die GenerateModel()-Methode mithilfe des folgenden Codes unmittelbar nach der InceptionSettings-Struktur und direkt vor der DisplayResults()-Methode:Create the GenerateModel() method, just after the InceptionSettings struct and just before the DisplayResults() method, using the following code:

    public static ITransformer GenerateModel(MLContext mlContext)
    {
    
    }
    
  2. Fügen Sie die Kalkulatoren zum Laden, Ändern der Größe und Extrahieren der Pixel aus den Bilddaten hinzu:Add the estimators to load, resize and extract the pixels from the image data:

    IEstimator<ITransformer> pipeline = mlContext.Transforms.LoadImages(outputColumnName: "input", imageFolder: _imagesFolder, inputColumnName: nameof(ImageData.ImagePath))
                    // The image transforms transform the images into the model's expected format.
                    .Append(mlContext.Transforms.ResizeImages(outputColumnName: "input", imageWidth: InceptionSettings.ImageWidth, imageHeight: InceptionSettings.ImageHeight, inputColumnName: "input"))
                    .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", interleavePixelColors: InceptionSettings.ChannelsLast, offsetImage: InceptionSettings.Mean))
    

    Die Bilddaten müssen in das Format verarbeitet werden, das vom TensorFlow-Modell erwartet wird.The image data needs to be processed into the format that the TensorFlow model expects. In diesem Fall werden die Bilder in den Arbeitsspeicher geladen, die Größe in eine konsistente Größe geändert, und die Pixel werden in einen numerischen Vektor extrahiert.In this case, the images are loaded into memory, resized to a consistent size, and the pixels are extracted into a numeric vector.

  3. Fügen Sie den Kalkulator zum Laden des TensorFlow-Modells hinzu, und versehen Sie es mit einem Score:Add the estimator to load the TensorFlow model, and score it:

    .Append(mlContext.Model.LoadTensorFlowModel(_inceptionTensorFlowModel).
        ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2_pre_activation" }, inputColumnNames: new[] { "input" }, addBatchDimensionInput: true))
    

    Diese Phase in der Pipeline lädt das TensorFlow-Modell in den Arbeitsspeicher und verarbeitet dann den Vektor der Pixelwerte über das TensorFlow-Modellnetzwerk.This stage in the pipeline loads the TensorFlow model into memory, then processes the vector of pixel values through the TensorFlow model network. Das Anwenden von Eingaben auf ein Deep Learning-Modell und das Generieren einer Ausgabe mithilfe des Modells wird als Scoring bezeichnet.Applying inputs to a deep learning model, and generating an output using the model, is referred to as Scoring. Wenn Sie das Modell in seiner Gesamtheit verwenden, führt das Scoring zu einem Rückschluss oder einer Vorhersage.When using the model in its entirety, scoring makes an inference, or prediction.

    In diesem Fall verwenden Sie das gesamte TensorFlow-Modell mit Ausnahme der letzten Schicht, bei der es sich um die Schicht handelt, die den Rückschluss ausführt.In this case, you use all of the TensorFlow model except the last layer, which is the layer that makes the inference. Die Ausgabe der vorletzten Schicht wird als softmax_2_preactivation bezeichnet.The output of the penultimate layer is labeled softmax_2_preactivation. Die Ausgabe dieser Schicht ist praktisch ein Vektor von Merkmalen, die die ursprünglichen Eingabebilder charakterisieren.The output of this layer is effectively a vector of features that characterize the original input images.

    Dieser vom TensorFlow-Modell generierte Merkmalsvektor wird als Eingabe in einen ML.NET-Trainingsalgorithmus verwendet.This feature vector generated by the TensorFlow model will be used as input to an ML.NET training algorithm.

  4. Fügen Sie den Kalkulator hinzu, um die Zeichenfolgenbezeichnungen in den Trainingsdaten ganzzahligen Schlüsselwerten zuzuordnen:Add the estimator to map the string labels in the training data to integer key values:

    .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "LabelKey", inputColumnName: "Label"))
    

    Der ML.NET-Trainingsmechanismus, der als nächstes angefügt wird, erfordert, dass seine Bezeichnungen im key-Format und nicht in beliebigen Zeichenfolgen vorliegen.The ML.NET trainer that is appended next requires its labels to be in key format rather than arbitrary strings. Ein Schlüssel ist eine Zahl, die eine 1:1-Zuordnung zu einem Zeichenfolgenwert aufweist.A key is a number that has a one to one mapping to a string value.

  5. Fügen Sie den ML.NET-Trainingsalgorithmus hinzu:Add the ML.NET training algorithm:

    .Append(mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(labelColumnName: "LabelKey", featureColumnName: "softmax2_pre_activation"))
    
  6. Fügen Sie den Kalkulator hinzu, um den vorhergesagten Schlüsselwert erneut einer Zeichenfolge zuzuordnen:Add the estimator to map the predicted key value back into a string:

    .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabelValue", "PredictedLabel"))
    .AppendCacheCheckpoint(mlContext);
    

Trainieren des ModellsTrain the model

  1. Laden Sie die Trainingsdaten mithilfe des LoadFromTextFile-Wrappers.Load the training data using the LoadFromTextFile wrapper. Fügen Sie der GenerateModel()-Methode folgenden Code als nächste Zeile hinzu:Add the following code as the next line in the GenerateModel() method:

    IDataView trainingData = mlContext.Data.LoadFromTextFile<ImageData>(path:  _trainTagsTsv, hasHeader: false);
    

    Daten werden in ML.NET als IDataView-Klasse dargestellt.Data in ML.NET is represented as an IDataView class. Mit IDataView können Tabellendaten (Zahlen und Text) flexibel und effizient beschrieben werden.IDataView is a flexible, efficient way of describing tabular data (numeric and text). Daten können aus einer Textdatei oder in Echtzeit (z. B. aus einer SQL-Datenbank oder aus Protokolldateien) in ein IDataView-Objekt geladen werden.Data can be loaded from a text file or in real time (for example, SQL database or log files) to an IDataView object.

  2. Trainieren Sie das Modell mit den zuvor geladenen Daten:Train the model with the data loaded above:

    ITransformer model = pipeline.Fit(trainingData);
    

    Die Fit()-Methode trainiert Ihr Modell, indem das Trainingsdataset auf die Pipeline angewendet wird.The Fit() method trains your model by applying the training dataset to the pipeline.

Auswerten der Genauigkeit des ModellsEvaluate the accuracy of the model

  1. Laden und transformieren Sie die Testdaten, indem Sie der nächsten Zeile der GenerateModel-Methode den folgenden Code hinzufügen:Load and transform the test data, by adding the following code to the next line of the GenerateModel method:

    IDataView testData = mlContext.Data.LoadFromTextFile<ImageData>(path: _testTagsTsv, hasHeader: false);
    IDataView predictions = model.Transform(testData);
    
    // Create an IEnumerable for the predictions for displaying results
    IEnumerable<ImagePrediction> imagePredictionData = mlContext.Data.CreateEnumerable<ImagePrediction>(predictions, true);
    DisplayResults(imagePredictionData);
    

    Es gibt einige Beispielbilder, die Sie zum Auswerten des Modells verwenden können.There are a few sample images that you can use to evaluate the model. Wie die Trainingsdaten müssen diese in eine IDataView geladen werden, damit Sie vom Modell transformiert werden können.Like the training data, these need to be loaded into an IDataView, so that they can be transformed by the model.

  2. Fügen Sie der GenerateModel()-Methode den folgenden Code hinzu, um das Modell auszuwerten:Add the following code to the GenerateModel() method to evaluate the model:

    MulticlassClassificationMetrics metrics =
        mlContext.MulticlassClassification.Evaluate(predictions,
          labelColumnName: "LabelKey",
          predictedLabelColumnName: "PredictedLabel");
    

    Nachdem Sie die Vorhersage festgelegt haben, führt die Evaluate()-Methode Folgendes aus:Once you have the prediction set, the Evaluate() method:

    • Bewerten des Modells (Vergleichen der vorhergesagten Werte mit dem Testdataset labels).Assesses the model (compares the predicted values with the test dataset labels).
    • Rückgabe der Modellleistungsmetriken.Returns the model performance metrics.
  3. Anzeigen der ModellgenauigkeitsmetrikenDisplay the model accuracy metrics

    Verwenden Sie den folgenden Code, um die Metriken anzuzeigen, die Ergebnisse freizugeben und dann mit ihnen zu arbeiten:Use the following code to display the metrics, share the results, and then act on them:

    Console.WriteLine($"LogLoss is: {metrics.LogLoss}");
    Console.WriteLine($"PerClassLogLoss is: {String.Join(" , ", metrics.PerClassLogLoss.Select(c => c.ToString()))}");
    

    Für die Bildklassifizierung werden die folgenden Metriken ausgewertet:The following metrics are evaluated for image classification:

    • Log-loss – siehe Protokollverlust.Log-loss - see Log Loss. Der Protokollverlust sollte so nahe wie möglich bei 0 liegen.You want Log-loss to be as close to zero as possible.
    • Per class Log-loss.Per class Log-loss. Der Protokollverlust pro Klasse sollte so nahe wie möglich bei 0 liegen.You want per class Log-loss to be as close to zero as possible.
  4. Fügen Sie den folgenden Code hinzu, um das trainierte Modell als nächste Zeile zurückzugeben:Add the following code to return the trained model as the next line:

    return model;
    

Führen Sie die Anwendung aus!Run the application!

  1. Fügen Sie in der Main-Methode nach der Erstellung der MLContext-Klasse den Aufruf von GenerateModel hinzu:Add the call to GenerateModel in the Main method after the creation of the MLContext class:

    ITransformer model = GenerateModel(mlContext);
    
  2. Fügen Sie den Aufruf der ClassifySingleImage()-Methode der Main-Methode als nächste Codezeile hinzu:Add the call to the ClassifySingleImage() method as the next line of code in the Main method:

    ClassifySingleImage(mlContext, model);
    
  3. Führen Sie die Konsolen-App aus (STRG+F5).Run your console app (Ctrl + F5). Ihre Ergebnisse sollten der folgenden Ausgabe ähneln.Your results should be similar to the following output. Möglicherweise werden Warnungen oder Verarbeitungsnachrichten angezeigt. Diese wurden jedoch aus Gründen der Übersichtlichkeit aus den folgenden Ergebnissen entfernt.You may see warnings or processing messages, but these messages have been removed from the following results for clarity.

    =============== Training classification model ===============
    Image: broccoli2.jpg predicted as: food with score: 0.8955513
    Image: pizza3.jpg predicted as: food with score: 0.9667718
    Image: teddy6.jpg predicted as: toy with score: 0.9797683
    =============== Classification metrics ===============
    LogLoss is: 0.0653774699265059
    PerClassLogLoss is: 0.110315812569315 , 0.0204391272836966 , 0
    =============== Making single image classification ===============
    Image: toaster3.jpg predicted as: appliance with score: 0.9646884
    

Herzlichen Glückwunsch!Congratulations! Sie haben durch Anwenden von Übertragungslernen auf ein TensorFlow-Modell in ML.NET erfolgreich ein Machine Learning-Modell für die Bildklassifizierung erstellt.You've now successfully built a machine learning model for image classification by applying transfer learning to a TensorFlow model in ML.NET.

Sie finden den Quellcode für dieses Tutorial im Repository dotnet/samples.You can find the source code for this tutorial at the dotnet/samples repository.

In diesem Tutorial haben Sie gelernt, wie die folgenden Aufgaben ausgeführt werden:In this tutorial, you learned how to:

  • Das Problem verstehenUnderstand the problem
  • Integrieren des vortrainierten TensorFlow-Modells in die ML.NET-PipelineIncorporate the pre-trained TensorFlow model into the ML.NET pipeline
  • Trainieren und Auswerten des ML.NET-ModellsTrain and evaluate the ML.NET model
  • Klassifizieren eines TestbildsClassify a test image

Sehen Sie sich im GitHub-Repository für Machine Learning-Beispiele nach einem Beispiel für erweiterte Bildklassifizierung um, damit Sie es untersuchen können.Check out the Machine Learning samples GitHub repository to explore an expanded image classification sample.