Contenuto principale

Come iniziare a utilizzare il transfer learning

Questo esempio mostra come utilizzare Deep Network Designer per preparare una rete al transfer learning.

Il transfer learning è ampiamente utilizzato nelle applicazioni di Deep Learning. Si può prendere una rete preaddestrata e utilizzarla come punto di partenza per l’apprendimento di una nuova attività. Solitamente, eseguire il fine-tuning di una rete tramite il transfer learning è molto più veloce e semplice che addestrare una rete con pesi inizializzati da zero su base casuale. È possibile trasferire rapidamente le feature apprese a una nuova attività utilizzando un numero minore di immagini di addestramento.

Caricamento dei dati delle immagini

Nel workspace, estrarre il set di dati MathWorks® Merch. Per accedere a questi dati, aprire l'esempio come script live. Si tratta di un piccolo set di dati contenente 75 immagini di merchandising MathWorks che appartengono a cinque diverse categorie (berretto, cubo, carte da gioco, cacciavite e torcia).

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

Creare un datastore di immagini. Un datastore di immagini consente di memorizzare grandi raccolte di dati delle immagini, compresi quelli che non entrano nella memoria e di leggere in modo efficiente i batch delle immagini durante l'addestramento di una rete neurale. Specificare la cartella con le immagini estratte e specificare che i nomi delle sottocartelle corrispondono alle etichette delle immagini.

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

Visualizzare alcune immagini di esempio.

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

Estrarre i nomi e il numero delle classi.

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

Suddividere i dati in set di addestramento, convalida e test. Utilizzare il 70% delle immagini per l'addestramento, il 15% per la convalida e il 15% per i test. La funzione splitEachLabel divide il datastore delle immagini in tre nuovi datastore.

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

Caricamento della rete preaddestrata

Per adattare una rete neurale preaddestrata a una nuova attività, utilizzare l'app Deep Network Designer.

deepNetworkDesigner

Seleziona SqueezeNet dall’elenco di reti preaddestrate e fai clic su Open (Aprire).

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

Per modificare la rete per il transfer learning:

  • Impostare il numero di classi sul nuovo numero di classi, 5 in questo esempio.

  • Impostare la velocità di apprendimento nell'ultimo livello apprendibile su 10 in modo che l'apprendimento sia più rapido nell'ultimo livello apprendibile rispetto ai livelli trasferiti.

  • Fare clic su Import (Importa).

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 visualizza una vista ridotta dell’intera rete.

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

Per verificare che la rete sia pronta per l’addestramento, fare clic su Analyze (Analizza). Il Deep Learning Network Analyzer non riporta errori o avvisi, quindi la rete è pronta per l'addestramento.

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

Per esportare la rete, fare clic su Export (Esporta), quindi su OK. L'applicazione salva la rete nella variabile net_1.

Dialog with a text field to name the exported network.

Specificazione delle opzioni di addestramento

Specificare le opzioni di addestramento. La scelta tra le opzioni richiede un'analisi empirica. Per scoprire le diverse configurazioni delle opzioni di addestramento eseguendo esperimenti, è possibile utilizzare l'applicazione Experiment Manager.

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

Addestramento di reti neurali

Addestrare la rete neurale utilizzando la funzione trainnet. Poiché l'obiettivo è la classificazione, utilizzare la perdita di entropia incrociata.

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

Test della rete neurale

Classificare le immagini di test. Per fare previsioni con osservazioni multiple, utilizzare la funzione minibatchpredict. Per convertire i punteggi di previsione in etichette, utilizzare la funzione scores2label. La funzione minibatchpredict utilizza automaticamente una GPU, se disponibile.

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

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

Visualizzare la precisione della classificazione in un grafico di confusione.

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

Classificazione di una nuova immagine

Classificare un'immagine di test. Leggere un'immagine da un file JPEG, ridimensionarla e convertirla nel tipo di dati single.

im = imread("MerchDataTest.jpg");

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

Classificare l'immagine. Per fare una previsione con una singola osservazione, utilizzare la funzione predict.

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

Visualizzare l'immagine con l'etichetta prevista e il punteggio corrispondente.

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

Per saperne di più sul transfer learning e su come migliorare le prestazioni della rete, vedere Retrain Neural Network to Classify New Images.

Riferimenti

[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.

Vedi anche

| | | |

Argomenti