Main Content

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

Transfer Learning con Deep Network Designer

Questo esempio mostra come eseguire il transfer learning in modo interattivo utilizzando l’app Deep Network Designer.

Il transfer learning consiste nel prendere una rete preaddestrata di Deep Learning e perfezionarla per apprendere una nuova attività. Il transfer learning è di solito più veloce e semplice rispetto all'addestramento di una rete da zero. È possibile trasferire rapidamente le feature apprese a una nuova attività utilizzando un numero minore di dati.

Utilizzare Deep Network Designer per eseguire il transfer learning per la classificazione delle immagini seguendo queste fasi:

  1. Aprire l’app Deep Network Designer e scegliere una rete preaddestrata.

  2. Importare il nuovo set di dati.

  3. Sostituire i livelli finali con nuovi livelli adattati al nuovo set di dati.

  4. Impostare le velocità di apprendimento in modo tale che l’apprendimento nei nuovi livelli sia più veloce che nei livelli trasferiti.

  5. Addestrare la rete utilizzando Deep Network Designer, oppure esportare la rete per l’addestramento sulla riga di comando.

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

Selezione di una rete preaddestrata

Per aprire Deep Network Designer, nella scheda Apps (App), in Machine Learning and Deep Learning (Machine Learning e Deep Learning), fare clic sull’icona dell’app. In alternativa, è possibile aprire l’applicazione dalla riga di comando:

deepNetworkDesigner

Deep Network Designer fornisce una selezione di reti di classificazione delle immagini preaddestrate che hanno appreso ricche rappresentazioni di feature per un’ampia gamma di immagini. Il Transfer Learning funziona meglio se le immagini sono simili a quelle usate originariamente per addestrare la rete. Se le immagini di addestramento sono immagini naturali come quelle nel database di ImageNet, una qualsiasi delle reti preaddestrate è adatta. Per un elenco delle reti disponibili e per il loro confronto, vedere Reti neurali profonde preaddestrate.

Se i dati sono molto diversi da quelli di ImageNet, ad esempio in caso di immagini minuscole, spettrogrammi o dati non di immagine, potrebbe essere meglio addestrare una nuova rete. Per esempi che mostrano come addestrare una rete da zero, vedere Creazione di una rete di classificazione di sequenze semplice con Deep Network Designer e .

SqueezeNet non richiede un pacchetto di supporto ulteriore. Per altre reti preaddestrate, se non si dispone del pacchetto di supporto necessario installato, l’applicazione fornisce l’opzione Install (Installa).

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

Scoperta della rete

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

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.

Aumento dell’immagine

Si può scegliere di applicare l’aumento dell’immagine ai dati di addestramento. L’app Deep Network Designer fornisce le seguenti opzioni di aumento:

  • Riflesso casuale sull’asse x

  • Riflesso casuale sull’asse y

  • Rotazione casuale

  • Ridimensionamento casuale

  • Traslazione orizzontale casuale

  • Traslazione verticale casuale

È possibile aumentare in modo efficace la quantità di dati di addestramento applicando ai dati un aumento casuale. Ciò permette anche di addestrare reti che siano invarianti alle distorsioni nei dati dell’immagine. Ad esempio, è possibile aggiungere rotazioni casuali alle immagini di input affinché una rete sia invariante alla presenza di rotazioni nelle immagini di input.

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

Dati di convalida

È anche possibile scegliere i dati di convalida suddividendoli dai dati di addestramento, conosciuta come convalida dei dati di controllo, oppure importandoli da un’altra sorgente. La convalida stima le performance del modello sui nuovi dati rispetto ai dati di addestramento e permette di monitorare le performance e di proteggere dal sovraadattamento.

Per questo esempio, utilizzare il 30% delle immagini per la convalida.

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

Visualizzazione dei dati

Utilizzando Deep Network Designer è possibile ispezionare visivamente la distribuzione dei dati di addestramento e di convalida nella scheda Data (Dati). Si può osservare che in questo esempio sono presenti cinque categorie nel set di dati. Si possono anche visualizzare osservazioni casuali per ciascuna classe.

Preparazione della rete per l’addestramento

Modificare la rete nel pannello Designer per specificare un nuovo numero di classi nei dati. Per preparare la rete al transfer learning, sostituire l'ultimo livello apprendibile e il livello di classificazione finale.

Sostituzione dell'ultimo livello apprendibile

Per utilizzare una rete preaddestrata per il transfer learning, è necessario modificare il numero di classi affinché corrisponda al nuovo set di dati. Per prima cosa, individuare l'ultimo livello apprendibile della rete. Per SqueezeNet, l'ultimo livello apprendibile è l’ultimo livello convoluzionale denominato 'conv10'. In questo caso, sostituire il livello convoluzionale con un nuovo livello convoluzionale con un numero di filtri pari al numero di classi.

Trascinare un nuovo convolution2dLayer sull’area di disegno. Imposta il valore FilterSize su 1,1 per adattarlo al livello convoluzionale originale.

La proprietà NumFilters definisce il numero di classi per i problemi di classificazione. Cambiare NumFilters sul numero di classi nei nuovi dati, in questo esempio 5.

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

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

Sostituzione del livello di output

Per il transfer learning, è necessario sostituire il livello di output. Scorri fino in fondo alla Layer Library e trascina un nuovo classificationLayer sull’area di disegno. Eliminare il livello di classificazione originale e collegare al suo posto il nuovo livello.

Per un nuovo livello di output, non è necessario impostare l’OutputSize. Al momento dell'addestramento, Deep Network Designer imposta automaticamente le classi di output del livello dai dati.

Verifica della rete

Per verificare che la rete sia pronta per l’addestramento, fare clic su Analyze (Analizza). Se Deep Learning Network Analyzer riscontra zero errori, la rete modificata è pronta all’addestramento.

Addestramento della rete

In Deep Network Designer, è possibile addestrare le reti importate o create nell’app.

Per addestrare la rete con le impostazioni predefinite, nella scheda Training (Addestramento), fai clic su Train (Addestrare). Le opzioni di addestramento predefinite sono più adatte ai grandi set di dati; per i set di dati piccoli ridurre la dimensione del mini-batch e la frequenza di convalida.

Per un maggiore controllo sull’addestramento, fai clic su Training Options (Opzioni di addestramento) e scegli le impostazioni con cui eseguire l’addestramento.

  • Imposta la velocità di apprendimento inziale su un valore piccolo per rallentare l’apprendimento nei livelli trasferiti.

  • Specificare la frequenza di convalida in modo tale che la precisione sui dati di convalida venga calcolata una volta ogni epoca.

  • Specificare un numero di epoche ridotto. Un'epoca è un ciclo di addestramento completo sull'intero set di dati di addestramento. Per il transfer learning non è necessario l’addestramento per un numero elevato di epoche.

  • Specificare la dimensione del mini-batch, ossia quante immagini utilizzare in ogni iterazione. Per garantire che l’intero set di dati sia utilizzato ad ogni epoca, impostare la dimensione del mini-batch per suddividere in modo uniforme il numero di campioni di addestramento.

Per questo esempio, imposta InitialLearnRate su 0.0001, MaxEpochs su 8 e ValidationFrequency su 5. Dato che sono presenti 55 osservazioni, impostare 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 ulteriori informazioni sulla selezione delle opzioni di addestramento, vedere trainingOptions.

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.

Per salvare il grafico di addestramento come immagine, fare clic su Export Training Plot (Esporta grafico di addestramento).

Esportazione dei risultati e generazione del codice MATLAB

Per esportare l’architettura di rete con i pesi addestrati, nella scheda Training (Addestramento), selezionare Export > Export Trained Network and Results (Esporta > Esporta 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.

trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
               TrainingLoss: [3.1028 3.7235 3.5007 1.2493 1.5267 1.4770 1.2506 1.5767 1.0273 1.1279 0.6417 0.7218 0.7767 0.4651 0.7253 0.5403 0.5126 0.3012 0.6455 0.3326 0.2897 0.4604 0.3298 0.1844 0.2311 0.1436 0.1762 0.2212 0.0945 0.3570 0.1205 … ]
           TrainingAccuracy: [36.3636 27.2727 27.2727 45.4545 36.3636 36.3636 63.6364 36.3636 63.6364 63.6364 81.8182 81.8182 72.7273 90.9091 72.7273 90.9091 81.8182 100 81.8182 100 100 81.8182 81.8182 100 100 100 90.9091 100 100 81.8182 100 100 100 … ]
             ValidationLoss: [3.4224 NaN NaN NaN 1.6053 NaN NaN NaN NaN 0.8457 NaN NaN NaN NaN 0.4648 NaN NaN NaN NaN 0.4317 NaN NaN NaN NaN 0.3389 NaN NaN NaN NaN 0.3652 NaN NaN NaN NaN 0.4322 NaN NaN NaN NaN 0.4720]
         ValidationAccuracy: [30 NaN NaN NaN 30 NaN NaN NaN NaN 70 NaN NaN NaN NaN 85 NaN NaN NaN NaN 80 NaN NaN NaN NaN 85 NaN NaN NaN NaN 85 NaN NaN NaN NaN 85 NaN NaN NaN NaN 90]
              BaseLearnRate: [1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 … ]
        FinalValidationLoss: 0.4720
    FinalValidationAccuracy: 90
     OutputNetworkIteration: 40

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

Durante l’addestramento, Deep Network Designer ridimensiona le immagini per adattarle alle dimensioni di input della rete. Per visualizzare le dimensioni di input della rete, andare al pannello Designer e selezionare imageInputLayer (primo livello). Le dimensioni di input di questa rete sono 227x227.

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) + "%");

Vedi anche

Argomenti complementari