Hauptinhalt

Vorbereiten des Netzes auf Transfer Learning mithilfe von Deep Network Designer

Dieses Beispiel zeigt, wie Sie mit dem Deep Network Designer ein Netz interaktiv auf Transfer Learning vorbereiten können.

Beim Transfer Learning wird ein zuvor trainiertes Deep-Learning-Netz für das Erlernen einer neuen Aufgabe abgestimmt. Die Anwendung des Transfer Learning ist in der Regel schneller und einfacher als das Training eines Netzes von Grund auf. Sie können gelernte Merkmale schnell auf eine neue Aufgabe übertragen und dabei eine geringere Datenmenge verwenden.

Extrahieren von Daten

Extrahieren Sie den Datensatz „MathWorks Merch“. Hierbei handelt es sich um einen kleinen Datensatz, der 75 Bilder von MathWorks Merchandising-Artikeln enthält, die zu fünf verschiedenen Klassen gehören (Kappe, Würfel, Spielkarten, Schraubendreher und Taschenlampe). Die Daten sind so angeordnet, dass die Bilder sich in Unterordnern befinden, die den fünf Klassen entsprechen.

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)
numClasses = 
5

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 auf zwei neue Datastores auf.

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

Auswählen eines vortrainierten Netzes

Um Deep Network Designer zu öffnen, klicken Sie in der Registerkarte Apps unter Machine Learning and Deep Learning auf das App-Symbol. Alternativ können Sie die App über die Befehlszeile öffnen:

deepNetworkDesigner

Deep Network Designer bietet eine Auswahl an vortrainierten Bildklassifizierungsnetzen, die eine Vielzahl von Merkmalen für eine große Bandbreite von Bildern erlernt haben. Für Transfer Learning ist es ideal, wenn Ihre Bilder den Bildern ähneln, die ursprünglich zum Trainieren des Netzes verwendet wurden. Wenn es sich bei Ihren Trainingsbildern um natürliche Bilder wie die Bilder in der ImageNet-Datenbank handelt, sind alle vortrainierten Netze gut geeignet. Eine Liste aller verfügbaren Netze und Hinweise zum Vergleich der Netze finden Sie unter Pretrained Deep Neural Networks.

Wenn sich Ihre Daten stark von den ImageNet-Daten unterscheiden (wenn Sie beispielsweise sehr kleine Bilder, Spektrogramme oder Nicht-Bild-Daten haben), könnte es ratsam sein, ein neues Netz zu trainieren. Ein Beispiel für das Training eines Netzes von Grund auf finden Sie unter Get Started with Time Series Forecasting.

SqueezeNet benötigt kein zusätzliches Supportpaket. Wenn etwaige erforderliche Supportpakete für andere vortrainierte Netze nicht installiert sind, stellt die App Ihnen die Option Install zur Verfügung.

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

Untersuchen des Netzes

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

Untersuchen Sie das Netzdiagramm. Wenn Sie die Ansicht mithilfe der Maus vergrößern möchten, halten Sie die Strg-Taste gedrückt und bewegen Sie das Mausrad. Verwenden Sie zum Schwenken die Pfeiltasten oder halten Sie das Mausrad gedrückt, während Sie die Maus verschieben. Wählen Sie eine Schicht aus, um ihre Eigenschaften anzuzeigen. Heben Sie die Auswahl aller Schichten auf, um die Netzzusammenfassung im Fensterbereich Properties anzuzeigen.

Wählen Sie die Bild-Eingangsschicht 'input' aus. Sie können sehen, dass die Eingangsgröße dieses Netzes 227x227x3 Pixel beträgt.

Speichern Sie die Eingangsgröße in der Variable inputSize.

inputSize = [227 227 3];

Vorbereiten des Netzes für das Training

Um ein vortrainiertes Netz für das Transfer Learning zu verwenden, müssen Sie die Anzahl der Klassen an den neuen Datensatz anpassen. Finden Sie zunächst die letzte lernfähige Schicht im Netz. Bei SqueezeNet ist die letzte lernfähige Schicht die letzte Faltungsschicht 'conv10'. Wählen Sie die Schicht 'conv10'. 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). Auf diese Weise werden die Schichteigenschaften entsperrt, damit Sie diese an Ihre neue Aufgabe anpassen können.

Vor R2023b: Um das Netz an die neuen Daten anzupassen, müssen Sie die Schichten ersetzen, statt sie zu entsperren. Legen Sie in der neuen 2D-Faltungsschicht für „FilterSize“ (Filtergröße) den Wert [1 1] fest.

Die Eigenschaft NumFilters legt die Anzahl an Klassen für Klassifizierungsprobleme fest. Ändern Sie NumFilters auf die Anzahl der Klassen in den neuen Daten, in diesem Beispiel also 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.

Überprüfen des Netzes

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.

Vorbereiten von Daten für das Training

Die Bilder im Datastore können unterschiedliche Größen aufweisen. Um die Größe der Trainingsbilder automatisch zu ändern, verwenden Sie einen erweiterten Bild-Datastore. Durch Data Augmentation kann zudem verhindert werden, dass das Netz eine Überanpassung vornimmt und sich die exakten Details der Trainingsbilder merkt. Geben Sie die folgenden Augmentationsoperationen für die Trainingsbilder an: Zufälliges Spiegeln der Trainingsbilder an der vertikalen Achse und zufälliges horizontales und vertikales Verschieben der Bilder um bis zu 30 Pixel.

pixelRange = [-30 30];

imageAugmenter = imageDataAugmenter( ...
    RandXReflection=true, ...
    RandXTranslation=pixelRange, ...
    RandYTranslation=pixelRange);

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    DataAugmentation=imageAugmenter);

Um die Größe der Validierungs- und Testbilder ohne eine weitere Data Augmentation automatisch zu ändern, verwenden sie einen erweiterten Bild-Datastore, ohne weitere Vorverarbeitungs-Operationen anzugeben.

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

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 mithilfe des Adam-Optimierers.

  • Legen Sie für die anfängliche Lerngeschwindigkeit einen kleinen Wert fest, um das Lernen in den transferierten Schichten zu verlangsamen.

  • Geben Sie eine kleine Anzahl Epochen an. Eine Epoche ist ein vollständiger Trainingszyklus am gesamten Trainingsdatensatz. Bei Transfer Learning ist kein Training über eine große Anzahl Epochen hinweg erforderlich.

  • Legen Sie die Validierungsdaten und eine Validierungsfrequenz fest, sodass die Genauigkeit der Validierungsdaten einmal pro Epoche berechnet wird.

  • Geben Sie die Mini-Batch-Größe an, d. h. wie viele Bilder pro Iteration verwendet werden sollen. Um sicherzustellen, dass der gesamte Datensatz bei jeder Epoche verwendet wird, legen Sie die Mini-Batch-Größe so fest, dass die Anzahl der Trainings-Samples gleichmäßig aufgeteilt wird.

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

  • Deaktivieren Sie die ausführliche Ausgabe.

options = trainingOptions("adam", ...
    InitialLearnRate=0.0001, ...
    MaxEpochs=8, ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=5, ...
    MiniBatchSize=11, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

Trainieren von neuronalen Netzen

Trainieren Sie das neuronale Netz mit der Funktion trainnet. Verwenden Sie für Klassifizierungsaufgaben den Kreuzentropieverlust. Standardmäßig verwendet die trainnet-Funktion eine GPU, sofern vorhanden. Die Verwendung einer GPU erfordert eine Parallel Computing Toolbox™-Lizenz und ein unterstütztes GPU-Gerät. Informationen zu unterstützten Geräten finden Sie unter GPU Computing Requirements (Parallel Computing Toolbox). Andernfalls verwendet die trainnet-Funktion die CPU. Um die Ausführungsumgebung festzulegen, verwenden Sie die Trainingsoption ExecutionEnvironment.

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.

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

Bilden Sie die Klassifizierungsgenauigkeit in einem Konfusionsdiagramm ab.

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

Vorhersagen mit neuen Daten treffen

Klassifizieren Sie ein Bild. 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. Um eine GPU zu verwenden, konvertieren Sie die Daten zunächst in gpuArray.

if canUseGPU
    X = gpuArray(X);
end
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) + ")")

Siehe auch

Themen