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

Guardare il video per una dettagliata spiegazione visiva dell’esempio.

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 Classification Data (Importa dati > Importa dati di classificazione 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, modificare 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, 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). Questo sblocca le proprietà del livello in modo da poterle adattare alla nuova attività.

Prima della release R2023b: Per modificare le proprietà del livello, è necessario sostituire i livelli invece di sbloccarli. Nel nuovo livello convoluzionale bidimensionale, impostare FilterSize su [1 1].

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.

Configurare il livello di output. Selezionare il livello di classificazione ClassificationLayer_predictions e fare clic su Unlock Layer (Sblocca livello), quindi fare clic su Unlock Anyway (Sblocca comunque). Per il livello di output sbloccato, non è necessario impostare OutputSize. Al momento dell'addestramento, Deep Network Designer imposta automaticamente le classi di output del livello dai dati.

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, MaxEpochs su 8 e ValidationFrequency su 5. 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 OK e poi su Train (Addestra).

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