Main Content

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

Creazione di una rete neurale semplice di Deep Learning per la classificazione

Questo esempio mostra come creare e addestrare una rete neurale convoluzionale semplice per la classificazione tramite Deep Learning.

Le reti neurali convoluzionali sono strumenti essenziali per il Deep Learning e sono particolarmente adatte per il riconoscimento di immagini.

L’esempio mostra come:

  • Caricare ed esplorare i dati delle immagini.

  • Definire l’architettura della rete neurale.

  • Specificare le opzioni di addestramento.

  • Addestrare la rete neurale.

  • Predire le etichette per i nuovi dati e calcolare la precisione della classificazione.

Per un esempio su come creare e addestrare in modo interattivo una rete neurale di classificazione semplice di immagini, vedere Come iniziare con la classificazione delle immagini.

Caricamento ed esplorazione dei dati delle immagini

Caricare i dati delle cifre come datastore di immagini utilizzando la funzione imageDatastore e specificare la cartella che contiene i dati delle immagini. Un datastore di immagini consente di memorizzare i dati delle immagini di grandi dimensioni, compresi quelli che non entrano nella memoria, e di leggere in modo efficiente i batch delle immagini durante l’addestramento di una rete neurale convoluzionale.

unzip("DigitsData.zip");
dataFolder = "DigitsData";
imds = imageDatastore(dataFolder, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

Visualizzare alcune delle immagini presenti nel datastore.

figure
tiledlayout("flow");
perm = randperm(10000,20);
for i = 1:20
    nexttile
    imshow(imds.Files{perm(i)});
end

Calcolare il numero di immagini in ciascuna categoria. labelCount è una tabella che contiene le etichette e il numero di immagini con ciascuna etichetta. Il datastore contiene 1000 immagini per ciascuna cifra da 0 a 9, per un totale di 10000 immagini. È possibile specificare il numero di classi nell’ultimo livello completamente connesso della rete neurale come argomento OutputSize.

classNames = categories(imds.Labels);
labelCount = countEachLabel(imds)
labelCount=10×2 table
    Label    Count
    _____    _____

      0      1000 
      1      1000 
      2      1000 
      3      1000 
      4      1000 
      5      1000 
      6      1000 
      7      1000 
      8      1000 
      9      1000 

È necessario specificare la dimensione delle immagini nel livello di input della rete neurale. Controllare la dimensione della prima immagine in digitData. Ogni immagine ha un formato di 28x28x1 pixel.

img = readimage(imds,1);
size(img)
ans = 1×2

    28    28

Specifica degli insiemi di addestramento e di convalida

Dividere i dati in insiemi di dati di addestramento e di convalida in modo che ciascuna categoria nell’insieme di addestramento contenga 750 immagini e l’insieme di convalida contenga le immagini rimanenti da ciascuna etichetta. splitEachLabel suddivide il datastore imds in due nuovi datastore imdsTrain e imdsValidation.

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,"randomize");

Definizione dell’architettura di una rete neurale

Definire l’architettura della rete neurale convoluzionale.

layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(10)
    softmaxLayer];

Livello di input immagine Un imageInputLayer è il punto in cui si specifica la dimensione dell’immagine che, in questo caso, è 28x28x1. Questi numeri corrispondono all'altezza, alla larghezza e alla dimensione del canale. I dati in cifra sono costituiti da immagini in scala di grigi, quindi la dimensione del canale (canale colore) è 1. Per un’immagine a colori, la dimensione del canale è 3, corrispondente ai valori RGB. Non è necessario mescolare i dati poiché, per impostazione predefinita, trainnet li mescola all’inizio dell’addestramento. trainnet può inoltre mescolare automaticamente i dati all’inizio di ogni epoca durante l’addestramento.

Livello convoluzionale Nel livello convoluzionale, il primo argomento è filterSize, ossia l'altezza e la larghezza dei filtri che la funzione di addestramento utilizza durante la scansione delle immagini. In questo esempio, il numero 3 indica che la dimensione del filtro è 3x3. È possibile specificare dimensioni diverse per l'altezza e la larghezza del filtro. Il secondo argomento è il numero di filtri, numFilters, ossia il numero di neuroni che si collegano alla stessa regione dell'input. Questo parametro determina il numero di mappe di feature. Utilizzare l'argomento nome-valore Padding per aggiungere un riempimento alla mappa di feature di input. Per un livello convoluzionale con un passo predefinito di 1, il riempimento "same" assicura che la dimensione spaziale di output sia uguale a quella di input. È inoltre possibile definire il passo e le velocità di apprendimento per questo livello utilizzando gli argomenti nome-valore di convolution2dLayer.

Livello di normalizzazione batch I livelli di normalizzazione batch normalizzano le attivazioni e i gradienti che si propagano attraverso una rete neurale, rendendo l'addestramento della rete neurale un problema di ottimizzazione più semplice. Utilizzare i livelli di normalizzazione batch tra i livelli convoluzionali e le non linearità, come i livelli ReLU, per accelerare l'addestramento della rete neurale e ridurre la sensibilità all'inizializzazione della rete neurale. Utilizzare batchNormalizationLayer per creare un livello di normalizzazione batch.

Livello ReLU Il livello di normalizzazione batch è seguito da una funzione di attivazione non lineare. La funzione di attivazione più comune è l'unità lineare rettificata (ReLU). Utilizzare reluLayer per creare un livello ReLU.

Livello di raggruppamento massimo I livelli convoluzionali (con funzioni di attivazione) sono talvolta seguiti da un'operazione di sottocampionamento che riduce la dimensione spaziale della mappa di feature e rimuove le informazioni spaziali ridondanti. Il sottocampionamento consente di aumentare il numero di filtri nei livelli convoluzionali più profondi senza aumentare la quantità di calcolo richiesta per ciascun livello. Un modo per effettuare il sottocampionamento consiste nell’utilizzare un raggruppamento massimo, che è possibile creare utilizzando maxPooling2dLayer. Il livello di raggruppamento massimo restituisce i valori massimi delle regioni rettangolari di input, specificati dal primo argomento poolSize. In questo esempio, la dimensione della regione rettangolare è [2,2]. L'argomento nome-valore Stride specifica la dimensione della fase che la funzione di addestramento utilizza durante la scansione dell'input.

Livello completamente connesso I livelli convoluzionali e di sottocampionamento sono seguiti da uno o più livelli completamente connessi. Come suggerisce il nome, un livello completamente connesso è un livello in cui i neuroni si connettono a tutti i neuroni del livello precedente. Questo livello combina tutte le feature apprese dai livelli precedenti in tutta l'immagine per identificare i pattern più grandi. L'ultimo livello completamente connesso combina le feature per classificare le immagini. Pertanto, il parametro OutputSize nell'ultimo livello completamente connesso è uguale al numero di classi nei dati di destinazione. In questo esempio, la dimensione di output è 10, corrispondente alle 10 classi. Utilizzare fullyConnectedLayer per creare un livello completamente connesso.

Livello softmax La funzione di attivazione softmax normalizza l’output del livello completamente connesso. L’output del livello softmax consiste in numeri positivi che si sommano a uno e che possono quindi essere utilizzati come probabilità di classificazione dal livello di classificazione. Creare un livello softmax utilizzando la funzione softmaxLayer dopo l'ultimo livello completamente connesso.

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.

  • Addestrare la rete neurale utilizzando la discesa stocastica del gradiente con momento (SGDM) con una velocità di apprendimento iniziale di 0,01.

  • Impostare il numero massimo di epoche su 4. Un'epoca è un ciclo di addestramento completo sull'intero set di dati di addestramento.

  • Mescolare i dati a ciascuna epoca.

  • Monitorare la precisione della rete neurale durante l'addestramento specificando i dati di convalida e la frequenza di convalida. Il software addestra la rete neurale sui dati di addestramento e calcola la precisione sui dati di convalida a intervalli regolari durante l'addestramento. I dati di convalida non sono utilizzati per aggiornare i pesi della rete neurale.

  • Visualizzare i progressi dell'addestramento in un grafico e monitorare la precisione.

  • Disattivare l’output verboso.

options = trainingOptions("sgdm", ...
    InitialLearnRate=0.01, ...
    MaxEpochs=4, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=30, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

Addestramento della rete neurale tramite i dati di addestramento

Addestrare la rete neurale utilizzando l'architettura definita da layers, i dati di addestramento e le opzioni di addestramento. Per impostazione predefinita, trainnet utilizza una GPU solo se disponibile, altrimenti utilizza una CPU. L’addestramento su GPU richiede Parallel Computing Toolbox™ e un dispositivo GPU supportato. Per informazioni sui dispositivi supportati, vedere GPU Computing Requirements (Parallel Computing Toolbox). Inoltre, è possibile specificare l'ambiente di esecuzione utilizzando l'argomento nome-valore ExecutionEnvironment delle trainingOptions.

Il grafico dei progressi dell’addestramento mostra la perdita e la precisione del mini-batch e la perdita e la precisione della convalida. Per ulteriori informazioni sul grafico dei progressi dell’addestramento, vedere Monitoraggio dei progressi dell’addestramento in Deep Learning. La perdita è la perdita di entropia incrociata. La precisione è la percentuale di immagini che la rete neurale classifica correttamente.

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

Classificazione delle immagini di convalida e calcolo della precisione

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. In caso contrario, la funzione utilizza la CPU.

scores = minibatchpredict(net,imdsValidation);
YValidation = scores2label(scores,classNames);

Calcolare la precisione della classificazione. La precisione è la percentuale di etichette previste correttamente.

TValidation = imdsValidation.Labels;
accuracy = mean(YValidation == TValidation)
accuracy = 0.9928

Vedi anche

| | | |

Argomenti complementari