Hauptinhalt

imagePretrainedNetwork

Vortrainiertes neuronales Netz für Bilder

Seit R2024a

    Beschreibung

    Die Funktion imagePretrainedNetwork lädt ein vortrainiertes neuronales Netz und passt optional die neuronale Netzarchitektur für Transfer Learning und Feinabstimmung an.

    [net,classNames] = imagePretrainedNetwork gibt ein vortrainiertes neuronales Netz SqueezeNet und die Netzklassennamen zurück. Dieses Netz wurde mit dem ImageNet-Datensatz für 1000 Klassen trainiert.

    Beispiel

    [net,classNames] = imagePretrainedNetwork(name) gibt das angegebene vortrainierte neuronale Netz und dessen Klassennamen zurück.

    [net,classNames] = imagePretrainedNetwork(___,Name=Value) gibt Optionen anhand von einem oder mehreren Namen-Wert-Argumenten an und akzeptiert zudem eine beliebige Kombination aus Eingangsargumenten aus den vorherigen Syntaxen. Weights="none" legt beispielsweise fest, das neuronale Netz nicht initialisiert und ohne vortrainierte Gewichte zurückzugeben.

    Beispiele

    alle reduzieren

    Laden Sie ein vortrainiertes neuronales Netz SqueezeNet und die Netzklassennamen in den Workspace.

    [net,classNames] = imagePretrainedNetwork;

    Zeigen Sie die Netzeigenschaften an.

    net
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    Zeigen Sie die ersten Klassennamen an.

    head(classNames)
        "tench"
        "goldfish"
        "great white shark"
        "tiger shark"
        "hammerhead"
        "electric ray"
        "stingray"
        "cock"
    

    Laden Sie ein vortrainiertes neuronales Netz SqueezeNet in den Workspace.

    [net,classNames] = imagePretrainedNetwork;

    Lesen Sie ein Bild aus einer PNG-Datei aus und klassifizieren Sie es. Um das Bild zu klassifizieren, konvertieren Sie es zunächst zum Datentyp single.

    im = imread("peppers.png");
    figure
    imshow(im)

    Figure contains an axes object. The hidden axes object contains an object of type image.

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

    Lassen Sie sich das Bild mit der vorhergesagten Bezeichnung und dem entsprechenden Score anzeigen.

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

    Figure contains an axes object. The hidden axes object with title bell pepper (Score: 0.89394) contains an object of type image.

    Sie können ein vortrainiertes Netz für neue Datensätze umtrainieren, indem Sie das neuronale Netz an die neue Aufgabe anpassen und die gelernten Gewichte als Ausgangspunkt verwenden. Um das Netz an die neuen Daten anzupassen, ersetzen Sie die letzten Schichten (auch als „Network Head“ bezeichnet), sodass es die Vorhersage-Scores für die Klassen der neuen Aufgabe ausgibt.

    Laden von Trainingsdaten

    Extrahieren Sie den MathWorks™ Merch-Datensatz. Dies ist ein kleiner Datensatz mit 75 Bildern von MathWorks Werbeartikeln, die zu fünf verschiedenen Klassen gehören. 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)

    Zeigen Sie die Klassennamen und die Anzahl der Klassen an.

    classNames = categories(imds.Labels)
    classNames = 5×1 cell
        {'MathWorks Cap'          }
        {'MathWorks Cube'         }
        {'MathWorks Playing Cards'}
        {'MathWorks Screwdriver'  }
        {'MathWorks Torch'        }
    
    
    numClasses = numel(classNames)
    numClasses = 
    5
    

    Unterteilen Sie die Daten in Trainings- und Validierungsdatensä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,"randomized");

    Laden des vortrainierten Netzes

    Laden Sie ein vortrainiertes neuronales Netz SqueezeNet in den Workspace. Um ein neuronales Netz zurückzugeben, das für die neuen Daten umtrainiert werden kann, geben Sie die Anzahl der Klassen an.

    net = imagePretrainedNetwork(NumClasses=numClasses)
    net = 
      dlnetwork with properties:
    
             Layers: [68×1 nnet.cnn.layer.Layer]
        Connections: [75×2 table]
         Learnables: [52×3 table]
              State: [0×3 table]
         InputNames: {'data'}
        OutputNames: {'prob_flatten'}
        Initialized: 1
    
      View summary with summary.
    
    

    Rufen Sie die Eingangsgröße des neuronalen Netzes aus der Eingangsschicht ab.

    inputSize = net.Layers(1).InputSize
    inputSize = 1×3
    
       227   227     3
    
    

    Die lernbare Schicht im Network Head (der letzten Schicht mit lernbaren Parametern) muss neu trainiert werden. Die Schicht ist üblicherweise eine vollständig vernetzte Schicht oder Faltungsschicht mit einer Ausgabegröße, die der Anzahl Klassen entspricht.

    Um die Anzahl der Aktualisierungen dieser Schicht zu steigern und die Konvergenz zu beschleunigen, steigern Sie den Lerngeschwindigkeitsfaktor der lernbaren Parameter mithilfe der setLearnRateFactor-Funktion. Setzen Sie die Lerngeschwindigkeitsfaktoren der lernbaren Parameter auf 10.

    net = setLearnRateFactor(net,"conv10/Weights",10);
    net = setLearnRateFactor(net,"conv10/Bias",10);

    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.

    Verwenden Sie für dieses Beispiel diese Optionen:

    • Trainieren Sie mithilfe des Adam-Optimierers.

    • Um die Anzahl der Aktualisierungen der vortrainierten Gewichte zu reduzieren, verwenden Sie eine geringere Lerngeschwindigkeit. Setzen Sie die Lerngeschwindigkeit auf 0.0001.

    • Validieren Sie das Netz alle fünf Iterationen mithilfe der Validierungsdaten. Erhöhen Sie diesen Wert bei größeren Datensätzen, um zu verhindern, dass die Validierung das Training verlangsamt.

    • 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, ...
        ValidationData=augimdsValidation, ...
        ValidationFrequency=5, ...
        Plots="training-progress", ...
        Metrics="accuracy", ...
        Verbose=false);

    Trainieren von neuronalen Netzen

    Trainieren Sie das neuronale Netz mit der Funktion trainnet. Verwenden Sie zur Klassifizierung 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(augimdsTrain,net,"crossentropy",options);

    Testen von neuronalen Netzen

    Testen Sie das neuronale Netz mit der Funktion testnet. Evaluieren Sie die Genauigkeit der Single-Label-Klassifizierung. Die Genauigkeit ist der Prozentsatz der richtigen Vorhersagen. Standardmäßig verwendet die testnet-Funktion eine GPU, sofern vorhanden. Um die Ausführungsumgebung manuell auszuwählen, verwenden Sie das Argument ExecutionEnvironment der testnet-Funktion.

    accuracy = testnet(net,augimdsTest,"accuracy")
    accuracy = 
    100
    

    Vorhersagen treffen

    Lesen Sie ein Testbild aus und zeigen Sie es an.

    im = imread("MerchDataTest.jpg");
    figure
    imshow(im)

    Verwenden Sie das neuronale Netz, um eine Vorhersage zu treffen. Um eine Vorhersage an einem einzelnen Bild vorzunehmen, konvertieren Sie das Bild zum Datentyp single und verwenden Sie die Funktion predict. Um eine Grafikkarte zu verwenden, so verfügbar, konvertieren Sie die Daten zunächst zu gpuArray. Um Vorhersagen mit mehreren Bildern vorzunehmen, verwenden Sie die minibatchpredict-Funktion.

    X = single(im);
    
    if canUseGPU
        X = gpuArray(X);
    end
    
    scores = predict(net,X);
    label = scores2label(scores,classNames);

    Zeigen Sie das Bild und die Vorhersage an.

    figure
    imshow(im)
    title("Prediction: " + string(label))

    Eingabeargumente

    alle reduzieren

    Name des vortrainierten neuronalen Netzes, angegeben als einer der folgenden Werte:

    imagePretrainedNetwork ModellnamenargumentName des neuronalen NetzesTiefeParameterspeicherParameter (Millionen)Bild-EingangsgrößeEingabewertbereichEingabeschicht-NormalisierungErforderliches Supportpaket
    "squeezenet"SqueezeNet [2] 18

    4,7 MB

    1.24

    227x227

    [0, 255]"zerocenter"Keine
    "googlenet"GoogLeNet [3][4]22

    27 MB

    7.0

    224x224

    [0, 255]"zerocenter"

    Deep Learning Toolbox™ Model for GoogLeNet Network

    "googlenet-places365"

    24 MB

    6.3

    224x224

    [0, 255]"zerocenter"
    "inceptionv3"Inception-v3 [5]48

    91 MB

    23.9

    299x299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-v3 Network
    "densenet201"DenseNet-201 [6]201

    77 MB

    20.0

    224x224

    [0, 255]"zscore"Deep Learning Toolbox Model for DenseNet-201 Network
    "mobilenetv2"MobileNet-v2 [7]53

    14 MB

    3.5

    224x224

    [0, 255]"zscore"Deep Learning Toolbox Model for MobileNet-v2 Network
    "resnet18"ResNet-18 [8]18

    45 MB

    11.7

    224x224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-18 Network
    "resnet50"ResNet-50 [8]50

    98 MB

    25.6

    224x224

    [0, 255]"zscore"Deep Learning Toolbox Model for ResNet-50 Network
    "resnet101"ResNet-101 [8]101

    171 MB

    44.6

    224x224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for ResNet-101 Network
    "xception"Xception [9]71

    88 MB

    22.9299x299[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Xception Network
    "inceptionresnetv2"Inception-ResNet-v2 [10]164

    213 MB

    55.9

    299x299

    [0, 255]"rescale-symmetric"Deep Learning Toolbox Model for Inception-ResNet-v2 Network
    "shufflenet"ShuffleNet [11]505,5 MB1.4224x224[0, 255]"zscore"Deep Learning Toolbox Model for ShuffleNet Network
    "nasnetmobile"NASNet-Mobile [12]*20 MB 5.3224x224[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Mobile Network
    "nasnetlarge"NASNet-Large [12]*340 MB88.9331x331[0, 255]"rescale-symmetric"Deep Learning Toolbox Model for NASNet-Large Network
    "darknet19"DarkNet-19 [13]1980 MB20.8256x256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-19 Network
    "darknet53"DarkNet-53 [13]53159 MB41.6256x256[0, 255]"rescale-zero-one"Deep Learning Toolbox Model for DarkNet-53 Network
    "efficientnetb0"EfficientNet-b0 [14]8220 MB5.3

    224x224

    [0, 255]"zscore"Deep Learning Toolbox Model for EfficientNet-b0 Network
    "alexnet"AlexNet [15]8

    233 MB

    61.0

    227x227

    [0, 255]"zerocenter"Deep Learning Toolbox Model for AlexNet Network
    "vgg16"VGG-16 [16]16

    528 MB

    138

    224x224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-16 Network
    "vgg19"VGG-19 [16]19

    548 MB

    144

    224x224

    [0, 255]"zerocenter"Deep Learning Toolbox Model for VGG-19 Network

    Hinweis

    Wenn Sie die Option Weights auf "none" setzen, muss für die meisten Modelle kein Supportpaket heruntergeladen werden.

    Name-Wert-Argumente

    alle reduzieren

    Sie können optionale Argumentpaare als Name1=Value1,...,NameN=ValueN angeben, wobei Name der Name des Arguments und Value der entsprechende Wert ist. Namen-Wert-Argumente müssen nach anderen Argumenten erscheinen, die Reihenfolge der Paare ist jedoch nicht relevant.

    Beispiel: net = imagePretrainedNetwork("googlenet",NumClasses=10) gibt ein vortrainiertes neuronales Netz GoogLeNet zurück, das für eine 10-Klassen-Klassifizierungsaufgabe umtrainiert werden kann.

    Anzahl der Klassen für Klassifizierungsaufgaben, angegeben als positive Ganzzahl oder [].

    Ist NumClasses eine Ganzzahl, passt die Funktion imagePretrainedNetwork das vortrainierte neuronale Netz für Klassifizierungsaufgaben mit der angegebenen Anzahl Klassen an, indem die lernbare Schicht im Classification Head des Netzes ersetzt wird.

    Wenn Sie die Option NumClasses angeben, muss NumResponses [] sein und die Funktion darf das Argument classNames nicht ausgeben.

    Datentypen: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Anzahl der Antworten für Regressionsaufgaben, angegeben als positive Ganzzahl oder [].

    Ist NumResponses eine Ganzzahl, passt die Funktion imagePretrainedNetwork das vortrainierte neuronale Netz für Regressionsaufgaben mit der angegebenen Anzahl Antworten an, indem der Classification Head des Netzes durch einen Head für Regressionsaufgaben ersetzt wird.

    Wenn Sie die Option NumResponses angeben, muss NumClasses [] sein und die Funktion darf das Argument classNames nicht ausgeben.

    Datentypen: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

    Gewichte des neuronalen Netzes, angegeben als einer der folgenden Werte:

    • "pretrained" – Gibt das neuronale Netz mit dessen vortrainierten Gewichten zurück.

    • "none" – Gibt nur die nicht initialisierte neuronale Netzarchitektur zurück. In diesem Fall müssen Sie für die meisten Netze kein Supportpaket herunterladen.

    Klassennamen-Typ, angegeben als einer der folgenden Werte:

    • "string" – Gibt die Klassennamen als String-Array zurück.

    • "cell" – Gibt die Klassennamen als Zellen-Array mit Zeichenvektoren zurück. Verwenden Sie diese Option zur Codegenerierung.

    Ausgangsargumente

    alle reduzieren

    Neuronales Netz, zurückgegeben als dlnetwork-Objekt.

    Klassennamen, zurückgegeben als String-Array oder Zellen-Array mit Zeichenvektoren.

    Die Funktion gibt nur Klassennamen zurück, wenn die Werte NumClasses und NumResponses beide [] sind. Der Datentyp von classNames hängt vom Argument ClassNamesTypes ab.

    Datentypen: string | cell

    Tipps

    • Um neuronale 2D- und 3D-ResNet-Netzarchitekturen zu erstellen und anzupassen, verwenden Sie die Funktionen resnetNetwork bzw. resnet3dNetwork.

    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.5MB Model Size.” Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

    [3] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. “Going Deeper with Convolutions.” In 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 1–9. Boston, MA, USA: IEEE, 2015. https://doi.org/10.1109/CVPR.2015.7298594.

    [4] Places. http://places2.csail.mit.edu/

    [5] Szegedy, Christian, Vincent Vanhoucke, Sergey Ioffe, Jon Shlens, and Zbigniew Wojna. “Rethinking the Inception Architecture for Computer Vision.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2818–26. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.308.

    [6] Huang, Gao, Zhuang Liu, Laurens Van Der Maaten, and Kilian Q. Weinberger. “Densely Connected Convolutional Networks.” In 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2261–69. Honolulu, HI: IEEE, 2017. https://doi.org/10.1109/CVPR.2017.243.

    [7] Sandler, Mark, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, and Liang-Chieh Chen. “MobileNetV2: Inverted Residuals and Linear Bottlenecks.” In 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition, 4510–20. Salt Lake City, UT: IEEE, 2018. https://doi.org/10.1109/CVPR.2018.00474.

    [8] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. “Deep Residual Learning for Image Recognition.” In 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 770–78. Las Vegas, NV, USA: IEEE, 2016. https://doi.org/10.1109/CVPR.2016.90.

    [9] Chollet, François. “Xception: Deep Learning with Depthwise Separable Convolutions.” Preprint, submitted in 2016. https://doi.org/10.48550/ARXIV.1610.02357.

    [10] Szegedy, Christian, Sergey Ioffe, Vincent Vanhoucke, and Alexander Alemi. “Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning.” Proceedings of the AAAI Conference on Artificial Intelligence 31, no. 1 (February 12, 2017). https://doi.org/10.1609/aaai.v31i1.11231.

    [11] Zhang, Xiangyu, Xinyu Zhou, Mengxiao Lin, and Jian Sun. “ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices.” Preprint, submitted July 4, 2017. http://arxiv.org/abs/1707.01083.

    [12] Zoph, Barret, Vijay Vasudevan, Jonathon Shlens, and Quoc V. Le. “Learning Transferable Architectures for Scalable Image Recognition.” Preprint, submitted in 2017. https://doi.org/10.48550/ARXIV.1707.07012.

    [13] Redmon, Joseph. “Darknet: Open Source Neural Networks in C.” https://pjreddie.com/darknet.

    [14] Tan, Mingxing, and Quoc V. Le. “EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks.” Preprint, submitted in 2019. https://doi.org/10.48550/ARXIV.1905.11946.

    [15] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Communications of the ACM 60, no. 6 (May 24, 2017): 84–90. https://doi.org/10.1145/3065386.

    [16] Simonyan, Karen, and Andrew Zisserman. “Very Deep Convolutional Networks for Large-Scale Image Recognition.” Preprint, submitted in 2014. https://doi.org/10.48550/ARXIV.1409.1556.

    Erweiterte Fähigkeiten

    alle erweitern

    Versionsverlauf

    Eingeführt in R2024a