Main Content

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 Arbeitsbereich 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 Bilddatenspeicher. Mit einem Bilddatenspeicher 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.

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

Bearbeiten des Netzes für Transfer Learning

Um SqueezeNet für die Klassifizierung neuer Bilder neu zu trainieren, bearbeiten Sie die letzte 2-D Convolutional Layer (Faltungsschicht) des Netzes, conv10.

Wählen Sie im Fensterbereich Designer die Schicht conv10 aus. Klicken Sie am unteren Rand des Fensterbereichs Properties auf Unlock Layer (Schicht entsperren). Klicken Sie im daraufhin angezeigten Dialogfeld mit der Warnung auf Unlock Anyway (Trotzdem entsperren). Dadurch werden die Schichteigenschaften freigeschaltet, sodass Sie sie an Ihre neue Aufgabe anpassen können.

Setzen Sie die Eigenschaft NumFilters auf die neue Anzahl der Klassen – in diesem Beispiel 5. Ändern Sie die Lerngeschwindigkeiten so, dass das Lernen in der neuen Schicht schneller erfolgt als in den transferierten Schichten, indem Sie WeightLearnRateFactor und BiasLearnRateFactor auf 10 festlegen.

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. Um das Netz zu exportieren, klicken Sie auf Export (Exportieren). Die App speichert das Netz in der Variablen net_1.

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);

augimdsTrain = augmentedImageDatastore(inputSize,imdsTest);

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

| | | |

Verwandte Themen