Main Content

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

Deep Network Designer visualizza una vista ridotta dell’intera rete.

Modifica di una rete per il transfer learning

Per riaddestrare SqueezeNet alla classificazione di nuove immagini, modificare l'ultimo livello convoluzionale bidimensionale della rete conv10.

Nel pannello Designer, selezionare il livello conv10. Nella parte inferiore del pannello Properties (Proprietà), fare clic su Unlock Layer (Sblocca livello). Nella finestra di dialogo che mostra l'avviso, fare clic su Unlock Anyway (Sblocca comunque). In questo modo si sbloccano le proprietà del livello in modo da poterle adattare alla nuova attività.

Impostare la proprietà NumFilters sul nuovo numero di classi, in questo esempio 5. Modificare le velocità di apprendimento in modo tale che l'apprendimento nel nuovo livello sia più veloce che nei livelli trasferiti impostando WeightLearnRateFactor e BiasLearnRateFactor su 10.

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. Per esportare la rete, fare clic su Export (Esporta). L'applicazione salva la rete nella variabile net_1.

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

augimdsTrain = augmentedImageDatastore(inputSize,imdsTest);

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 complementari