Hauptinhalt

Erste Schritte mit Transfer Learning

Dieses Beispiel zeigt, wie der Deep Network Designer verwendet wird, um ein Netz für das Transfer Learning vorzubereiten.

Transfer Learning wird in Deep-Learning-Anwendungen häufig eingesetzt. Sie können ein vortrainiertes Netz als Ausgangspunkt zum Erlernen einer neuen Aufgabe verwenden. Die Feinabstimmung eines Netzes mit Transfer Learning ist in der Regel wesentlich schneller und einfacher als das Training eines Netzes von Grund auf mit zufällig initialisierten Gewichtungen. Sie können Merkmale, die mit Transfer Learning erlernt wurden, schnell einer neuen Aufgabe hinzufügen und dabei weniger Trainingsbilder verwenden.

Laden von Bilddaten

Extrahieren Sie im Workspace den MathWorks® Merch-Datensatz. Um auf diese Daten zuzugreifen, öffnen Sie das Beispiel als Live-Skript. Dieser kleine Datensatz enthält 75 Bilder von MathWorks Werbeartikeln, die zu fünf verschiedenen Klassen gehören (Kappe, Würfel, Spielkarten, Schraubenzieher und Taschenlampe).

folderName = "MerchData";
unzip("MerchData.zip",folderName);

Erstellen Sie einen Bild-Datastore. 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 neuronalen Netzes effizient Bildstapel lesen. Legen Sie den Ordner mit den extrahierten Bildern fest und geben Sie an, dass die Namen der Unterordner den Bildbezeichnungen entsprechen.

imds = imageDatastore(folderName, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

Lassen Sie sich einige Beispielbilder anzeigen.

numImages = numel(imds.Labels);
idx = randperm(numImages,16);
I = imtile(imds,Frames=idx);
figure
imshow(I)

Extrahieren Sie die Klassennamen und die Anzahl der Klassen.

classNames = categories(imds.Labels);
numClasses = numel(classNames);

Unterteilen Sie die Daten in Trainings-, Validierungs- und Testdatensätze. Verwenden Sie 70 % der Bilder für das Training, 15 % für die Validierung und 15 % für das Testen. Die Funktion splitEachLabel teilt den Bild-Datastore in drei neue Datastores auf.

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.7,0.15,0.15,"randomized");

Laden des vortrainierten Netzes

Um ein vortrainiertes neuronales Netz für eine neue Aufgabe anzupassen, verwenden Sie die App "Deep Network Designer".

deepNetworkDesigner

Wählen Sie aus der Liste der vortrainierten Netze den Eintrag SqueezeNet aus und klicken Sie auf Open.

The Deep Network Designer start page, showing the mouse hovering over Squeezenet which displays proprties of the model, including its depth (18), parameter memory (4.7 MB), number of parameters (1.24 M), and input size (227-by-227-by-3).

Um das Netz für Transfer Learning zu bearbeiten:

  • Setzen Sie die Anzahl der Klassen auf die neue Anzahl der Klassen, in diesem Beispiel 5.

  • Ändern Sie die Lerngeschwindigkeit der letzten lernbaren Schicht auf 10, sodass das Lernen in der letzten lernbaren Schicht schneller erfolgt als in den transferierten Schichten.

  • Klicken Sie auf Importieren.

Customize pretrained network dialog showing the number of classes set to 5 and the learning rate in the last layer set to 10.

Deep Network Designer zeigt eine verkleinerte Ansicht des gesamten Netzes an.

The designer pane in deep network designer, showing the layers in squeezenet.

Klicken Sie auf Analyze (Analysieren), um zu prüfen, ob das Netz für das Training bereit ist. Der Deep Learning Network Analyzer meldet keine Fehler oder Warnungen, sodass das Netz für das Training bereit ist.

Network Analyzer pane showing that there are no errors or warnings.

Um das Netz zu exportieren, klicken Sie auf Export (Exportieren) und daraufhin auf OK. Die App speichert das Netz in der Variablen net_1.

Dialog with a text field to name the exported network.

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.

options = trainingOptions("adam", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=5, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

Trainieren von neuronalen Netzen

Trainieren Sie das neuronale Netz mit der Funktion trainnet. Da das Ziel die Klassifizierung ist, verwenden Sie den Kreuzentropieverlust.

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

Testen von neuronalen Netzen

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.

inputSize = net.Layers(1).InputSize(1:2);

YTest = minibatchpredict(net,imdsTest);
YTest = scores2label(YTest,classNames);

Bilden Sie die Klassifizierungsgenauigkeit in einem Konfusionsdiagramm ab.

TTest = imdsTest.Labels;
figure
confusionchart(TTest,YTest);

Klassifizieren eines neuen Bilds

Klassifizieren Sie ein Testbild. Lesen Sie ein Bild aus einer JPEG-Datei, ändern Sie die Größe und konvertieren Sie es in den Datentyp single.

im = imread("MerchDataTest.jpg");

im = imresize(im,inputSize(1:2));
X = single(im);

Klassifizieren Sie das Bild. Um eine Vorhersage mit einer einzigen Beobachtung zu treffen, verwenden Sie die Funktion predict.

scores = predict(net,X);
[label,score] = scores2label(scores,classNames);

Lassen Sie sich das Bild mit der vorhergesagten Bezeichnung und den entsprechenden Ergebnissen anzeigen.

figure
imshow(im)
title(string(label) + " (Score: " + gather(score) + ")")

Weitere Informationen zum Transfer Learning und zur Verbesserung der Leistung des Netzes finden Sie unter Retrain Neural Network to Classify New Images.

Referenzen

[1] ImageNet. http://www.image-net.org.

[2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5 MB model size." Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

[3] Iandola, Forrest N. "SqueezeNet." https://github.com/forresti/SqueezeNet.

Siehe auch

| | | |

Themen