Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

Come iniziare a utilizzare il transfer learning

Questo esempio mostra come utilizzare il transfer learning per riaddestrare SqueezeNet, una rete neurale convoluzionale preaddestrata, per classificare un nuovo set di immagini. Prova questo esempio e scopri quanto è semplice iniziare a utilizzare il Deep Learning in MATLAB®.

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.

Estrazione dei dati

Nel workspace, estrai il set di dati MathWorks Merch. Si tratta di un piccolo set di dati contenente 75 immagini di merchandising MathWorks, appartenenti a cinque diverse categorie (berretto, cubo, carte da gioco, cacciavite e torcia).

unzip("MerchData.zip");

Caricamento della rete preaddestrata

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

Scopri il grafico della rete. Per ingrandire l’immagine con il mouse, usa la combinazione Ctrl + rotellina di scorrimento. Per ottenere una panoramica, usa i tasti freccia oppure tieni premuta la rotellina di scorrimento e trascina il mouse. Seleziona un livello per visualizzarne le proprietà. Deseleziona tutti i livelli per visualizzare il riepilogo della rete nel pannello Properties (Proprietà).

Importazione dei dati

Per caricare i dati in Deep Network Designer, nella scheda Data (Dati), fai clic su Import Data > Import Image Data (Importare i dati > Importare i dati delle immagini). Si apre la finestra di dialogo di importazione dei dati delle immagini.

Nell’elenco Data source (Sorgente dati), seleziona Folder (Cartella). Fai clic su Browse (Sfoglia) e seleziona la cartella MerchData estratta.

Suddividi i dati in 70% per l’addestramento e 30% per la convalida.

Specifica le operazioni di aumento da eseguire sulle immagini di addestramento. L’aumento dei dati aiuta la rete ad evitare l’overfitting e a memorizzare i dettagli esatti delle immagini di addestramento. Per questo esempio, applica un riflesso casuale sull’asse x, una rotazione casuale dall’intervallo [-90,90 gradi] e un ridimensionamento casuale dall’intervallo [1,2].

Fai clic su Import per importare i dati in Deep Network Designer.

Modifica di una rete per il transfer learning

Per riaddestrare SqueezeNet alla classificazione di nuove immagini, sostituisci l’ultimo livello convoluzionale bidimensionale e il livello di classificazione finale della rete. In SqueezeNet, questi livelli hanno rispettivamente il nome 'conv10' e 'ClassificationLayer_predictions'.

Nel pannello Designer, trascina un nuovo convolution2dLayer sull’area di disegno. Imposta il valore FilterSize su 1,1 per adattarlo al livello convoluzionale originale. Modifica NumFilters per renderlo il numero di categorie all’interno dei nuovi dati, ad esempio 5.

Modifica le regole di apprendimento in modo tale che l’apprendimento nel nuovo livello sia più veloce che nei livelli trasferiti impostando WeightLearnRateFactor e BiasLearnRateFactor su 10.

Elimina l’ultimo livello convoluzionale bidimensionale e collega al suo posto il nuovo livello.

Sostituisci il livello di output. Scorri fino in fondo alla Layer Library e trascina un nuovo classificationLayer sull’area di disegno. Elimina il livello originale e collega al suo posto il nuovo livello.

Addestramento della rete

Per scegliere le opzioni di addestramento, seleziona la scheda Training (Addestramento) e fai clic su Training Options (Opzioni di addestramento). Imposta la velocità di apprendimento inziale su un valore piccolo per rallentare l’apprendimento nei livelli trasferiti. Nella fase precedente hai aumentato i fattori della velocità di apprendimento per il livello convoluzionale bidimensionale in modo da velocizzare l’apprendimento nei nuovi livelli finali. Questa combinazione di impostazioni della velocità di apprendimento porta ad un apprendimento veloce solo nei nuovi livelli e ad un apprendimento più lento negli altri livelli.

Per questo esempio, imposta InitialLearnRate su 0.0001, ValidationFrequency su 5, MaxEpochs su 8. Dato che sono presenti 55 osservazioni, imposta MiniBatchSize su 11 per suddividere i dati di addestramento in modo uniforme e fare sì che l’intero set di dati sia utilizzato ad ogni epoca.

Per addestrare la rete con le opzioni di addestramento specificate, fai clic su Close (Chiudi) e poi su Train (Addestrare).

Deep Network Designer permette di visualizzare e monitorare i progressi dell’addestramento. È quindi possibile modificare le opzioni di addestramento e riaddestrare la rete, se necessario.

Esportazione dei risultati e generazione del codice MATLAB

Per esportare i risultati dell’addestramento, nella scheda Training (Addestramento), seleziona Export > Export Trained Network and Results (Esportare > Esportare la rete addestrata e i risultati). Deep Network Designer esporta la rete addestrata come variabile trainedNetwork_1 e le informazioni relative all’addestramento come variabile trainInfoStruct_1.

È anche possibile generare un codice MATLAB che ricrea la rete e le opzioni di addestramento utilizzate. Nella scheda Training (Addestramento), seleziona Export > Generate Code for Training (Esportare > Generare codice per addestramento). Esamina il codice MATLAB per scoprire come preparare programmaticamente i dati per l’addestramento, creare l’architettura di rete e addestrare la rete.

Classificazione di una nuova immagine

Carica una nuova immagine da classificare utilizzando la rete addestrata.

I = imread("MerchDataTest.jpg");

Ridimensiona l’immagine di test per adattarla alle dimensioni di input della rete.

I = imresize(I, [227 227]);

Classifica l’immagine di test utilizzando la rete addestrata.

[YPred,probs] = classify(trainedNetwork_1,I);
imshow(I)
label = YPred;
title(string(label) + ", " + num2str(100*max(probs),3) + "%");

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