Hauptinhalt

Erstellen eines einfachen neuronalen Deep-Learning-Netzes für die Klassifizierung

Dieses Beispiel veranschaulicht, wie Sie ein einfaches Convolutional Neural Network für die Deep-Learning-Klassifizierung erstellen und trainieren können.

Convolutional Neural Networks sind wichtige Werkzeuge für das Deep Learning und eignen sich vor allem für die Bilderkennung.

Das Beispiel veranschaulicht, wie Sie vorgehen müssen:

  • Laden und Untersuchen der Bilddaten.

  • Definieren der Architektur des neuronalen Netzes.

  • Angeben der Trainingsoptionen.

  • Trainieren des neuronalen Netzes.

  • Vorhersage der Bezeichnungen neuer Daten und Berechnung der Klassifizierungsgenauigkeit.

Ein Beispiel für das interaktive Erstellen und Trainieren eines einfachen neuronalen Netzes für die Bildklassifizierung finden Sie unter Erste Schritte in der Bildklassifizierung.

Laden und Untersuchen von Bilddaten

Laden Sie die Zifferndaten mithilfe der imageDatastore-Funktion als Bild-Datastore und legen Sie den Ordner mit den Bilddaten fest. Mit einem Bild-Datastore können Sie große Sammlungen von Bilddaten speichern, einschließlich Daten, die nicht in den Speicher passen, und beim Training eines Convolutional Neural Network effizient Bildstapel lesen.

unzip("DigitsData.zip");
dataFolder = "DigitsData";
imds = imageDatastore(dataFolder, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

Zeigen Sie einige der Bilder im Datastore an.

figure
tiledlayout("flow");
perm = randperm(10000,20);
for i = 1:20
    nexttile
    imshow(imds.Files{perm(i)});
end

Berechnen Sie die Anzahl der Bilder in jeder Kategorie. labelCount ist eine Tabelle, die die Kennzeichnungen sowie die Anzahl Bilder mit jeder Kennzeichnung enthält. Der Datastore enthält 1000 Bilder für jede der Ziffern 0-9, also insgesamt 10.000 Bilder. Sie können die Anzahl Klassen in der letzten vollständig verbundenen Schicht Ihres neuronalen Netzes als OutputSize-Argument festlegen.

classNames = categories(imds.Labels);
labelCount = countEachLabel(imds)
labelCount=10×2 table
    Label    Count
    _____    _____

      0      1000 
      1      1000 
      2      1000 
      3      1000 
      4      1000 
      5      1000 
      6      1000 
      7      1000 
      8      1000 
      9      1000 

Sie müssen die Größe der Bilder in der Eingangsschicht des neuronalen Netzes festlegen. Sehen Sie die Größe des ersten Bildes in digitData an. Jedes Bild besteht aus 28x28x1 Pixeln.

img = readimage(imds,1);
size(img)
ans = 1×2

    28    28

Festlegen von Trainings- und Validierungsdatensätzen

Unterteilen Sie die Daten in Trainings- und Validierungsdatensätze, sodass jede Kategorie in der Trainingsmenge 750 Bilder enthält, während die Validierungsmenge die verbleibenden Bilder der einzelnen Bezeichnungen enthält. splitEachLabel unterteilt den Datastore imds in zwei neue Datastores: imdsTrain und imdsValidation.

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,"randomize");

Definieren der Architektur des neuronalen Netzes

Definieren Sie die Architektur des Convolutional Neural Network.

layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(10)
    softmaxLayer];

Bild-Eingangsschicht Mit der imageInputLayer legen Sie die Bildgröße fest, bei der er sich in diesem Fall um 28x28x1 handelt. Diese Werte entsprechen der Höhe, Breite und Kanalgröße. Die Zifferndaten bestehen aus Graustufenbildern, die Kanalgröße (Farbkanal) ist also 1. Bei einem Farbbild ist die Kanalgröße 3, dies entspricht den RGB-Werten. Sie müssen die Daten nicht mischen, da trainnet die Daten standardmäßig am Anfang des Trainings mischt. trainnet kann die Daten zudem während des Trainings am Anfang jeder Epoche mischen.

Faltungsschicht In der Faltungsschicht ist das erste Argument filterSize; hierbei handelt es sich um die Höhe und Breite der Filter, die die Trainingsfunktion beim Scannen der Bilder verwendet. In diesem Beispiel gibt die Zahl 3 an, dass die Filtergröße 3x3 ist. Sie können für die Höhe und Breite des Filters verschiedene Größen festlegen. Das zweite Argument ist die Anzahl der Filter numFilters; hierbei handelt es sich um die Anzahl Neuronen, die mit derselben Eingangsregion verbunden werden. Dieser Parameter legt die Anzahl an Merkmalskarten fest. Verwenden Sie das Namen-Wert-Argument Padding, um die Eingangs-Merkmalskarte aufzufüllen. Bei einer Faltungsschicht mit Standard-Schrittweite 1 gewährleistet ein Auffüllen mit "same", dass die räumliche Ausgangsgröße der Eingangsgröße entspricht. Zudem können Sie die Schrittweite und Lerngeschwindigkeit dieser Schicht mit den Namen-Wert-Argumenten von convolution2dLayer festlegen.

Batch-Normalisierungsschicht Batch-Normalisierungsschichten normalisieren die Aktivierungen und Gradienten, die sich durch ein neuronales Netz fortpflanzen und vereinfachen die Optimierung des Trainings eines neuronalen Netzes. Mit Batch-Normalisierungsschichten zwischen Faltungsschichten und Nichtlinearitäten wie ReLU-Schichten können Sie das Training des neuronalen Netzes beschleunigen und die Empfindlichkeit gegenüber der Initialisierung des neuronalen Netzes reduzieren. Verwenden Sie batchNormalizationLayer, um eine Batch-Normalisierungsschicht zu erstellen.

ReLU-Schicht Auf die Batch-Normalisierungsschicht folgt eine nichtlineare Aktivierungsfunktion. Die gebräuchlichste Aktivierungsfunktion ist die Rectified Linear Unit (ReLU). Verwenden Sie reluLayer, um eine ReLU-Schicht zu erstellen.

Max-Pooling-Schicht Auf Faltungsschichten (mit Aktivierungsfunktionen) folgt gelegentlich eine Downsampling-Operation, die die räumliche Größe der Merkmalskarte reduziert und redundante räumliche Informationen entfernt. Mittels Downsampling kann die Anzahl Filter in den tieferen Faltungsschichten gesteigert werden, ohne den pro Schicht erforderlichen Rechenaufwand zu erhöhen. Eine Downsampling-Methode ist die Verwendung von Max-Pooling, das Sie über maxPooling2dLayer erstellen können. Die Max-Pooling-Schicht gibt die Höchstwerte rechteckiger Eingangsregionen aus, festgelegt durch das erste Argument poolSize. In diesem Beispiel beträgt die Größe der rechteckigen Region [2,2]. Das Namen-Wert-Argument Stride legt die Schrittgröße der Trainingsfunktion beim Scannen des Eingangs fest.

Vollständig verbundene Schicht Auf die gefalteten und Downsampling-Schichten folgen eine oder mehrere vollständig verbundene Schichten. Wie der Name schon sagt, handelt es sich bei einer vollständig verbundenen Schicht um eine Schicht, deren Neuronen mit allen Neuronen der Vorgängerschicht verbunden werden. Diese Schicht kombiniert alle von den vorherigen Schichten über das Bild hinweg erlernten Merkmale, um größere Muster zu identifizieren. Die letzte vollständig verbundene Schicht kombiniert die Merkmale, um die Bilder zu klassifizieren. Dementsprechend entspricht der Parameter OutputSize in der letzten vollständig verbundenen Schicht der Anzahl Klassen in den Zieldaten. In diesem Beispiel ist die Ausgangsgröße 10, was den 10 Klassen entspricht. Verwenden Sie fullyConnectedLayer, um eine vollständig verbundene Schicht zu erstellen.

Softmax-Schicht Die Softmax-Aktivierungsfunktion normalisiert die Ausgabe der vollständig verbundenen Schicht. Die Ausgabe der Softmax-Schicht besteht aus positiven Zahlen, die in der Summe 1 ergeben; dies können daraufhin von der Klassifizierungsschicht als Klassifizierungs-Wahrscheinlichkeiten verwendet werden. Erstellen Sie mit der softmaxLayer-Funktion nach der letzten vollständig verbundenen Schicht eine Softmax-Schicht.

Festlegen von Trainingsoptionen

Legen Sie die Trainingsoptionen fest. Die Auswahl aus diesen Optionen erfordert eine empirische Analyse. Um verschiedene Konfigurationen von Trainingsoptionen durch Experimente zu untersuchen, können Sie die App Experiment Manager verwenden.

  • Trainieren Sie das neuronale Netz mithilfe eines stochastischen Gradientenabstiegs mit Momentum (SGDM) mit einer anfänglichen Lerngeschwindigkeit von 0,01.

  • Legen Sie für dieses Beispiel die maximale Anzahl der Epochen auf 4 fest. Eine Epoche ist ein vollständiger Trainingszyklus am gesamten Trainingsdatensatz.

  • Mischen Sie die Daten jede Epoche.

  • Geben Sie Validierungsdaten und Validierungsfrequenz an, um die Genauigkeit des neuronalen Netzes während des Trainings zu überwachen. Die Software trainiert das neuronale Netz mit den Trainingsdaten und berechnet die Genauigkeit der Validierungsdaten während des Trainings in regelmäßigen Intervallen. Die Validierungsdaten werden nicht zur Aktualisierung der Gewichtungen des neuronalen Netzes verwendet.

  • Zeigen Sie den Trainingsfortschritt in einem Diagramm an und überwachen Sie die Genauigkeit.

  • Deaktivieren Sie die ausführliche Ausgabe.

options = trainingOptions("sgdm", ...
    InitialLearnRate=0.01, ...
    MaxEpochs=4, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=30, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

Trainieren eines neuronalen Netzes mit Trainingsdaten

Trainieren Sie das neuronale Netz anhand der von layers festgelegten Architektur, den Trainingsdaten und den Trainingsoptionen. Standardmäßig verwendet trainnet eine Grafikkarte, sofern verfügbar, anderenfalls wird ein Prozessor verwendet. Das Training mit einer Grafikkarte erfordert die Parallel Computing Toolbox™ und eine unterstützte Grafikkarte. Informationen zu unterstützten Geräten finden Sie unter GPU Computing Requirements (Parallel Computing Toolbox). Sie können auch die Ausführungsumgebung angeben, indem Sie das Name-Wert-Argument ExecutionEnvironment von trainingOptions verwenden.

Das Trainingsfortschritt-Diagramm zeigt Mini-Batch-Verlust und -Genauigkeit sowie Validierungsverlust und -Genauigkeit an. Weitere Informationen zum Trainingsfortschritt-Diagramm finden Sie unter Überwachen des Deep-Learning-Trainingsfortschritts. Der Verlust ist der Kreuzentropieverlust. Die Genauigkeit ist der Prozentsatz an Bildern, die vom neuronalen Netz korrekt klassifiziert werden.

net = trainnet(imdsTrain,layers,"crossentropy",options);

Klassifizieren von Validierungsbildern und Berechnen der Genauigkeit

Klassifizieren Sie die Testbilder. Um Vorhersagen mit mehreren Beobachtungen zu treffen, verwenden Sie die Funktion minibatchpredict. Zur Umwandlung der Vorhersageergebnisse in Bezeichnungen verwenden Sie die Funktion scores2label. Die Funktion minibatchpredict verwendet automatisch eine GPU, sofern vorhanden. Andernfalls verwendet die Funktion die CPU.

scores = minibatchpredict(net,imdsValidation);
YValidation = scores2label(scores,classNames);

Berechnen Sie die Klassifizierungsgenauigkeit. Die Genauigkeit ist der Prozentsatz der richtig vorhergesagten Bezeichnungen.

TValidation = imdsValidation.Labels;
accuracy = mean(YValidation == TValidation)
accuracy = 0.9928

Siehe auch

| | | |

Themen