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 Creazione di una rete di classificazione di immagini semplice con Deep Network Designer.

Caricamento ed esplorazione dei dati delle immagini

Caricare i dati campione delle cifre come un datastore di immagini. imageDatastore etichetta automaticamente le immagini in base ai nomi delle cartelle e memorizza i dati come un oggetto ImageDatastore. 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.

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
    'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true,'LabelSource','foldernames');

Visualizzare alcune delle immagini presenti nel datastore.

figure;
perm = randperm(10000,20);
for i = 1:20
    subplot(4,5,i);
    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.

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 digitData in due nuovi datastore trainDigitData e valDigitData.

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
    classificationLayer];

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, trainNetwork li mescola all’inizio dell’addestramento. trainNetwork 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 la coppia 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 della coppia 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 della coppia 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.

Livello di classificazione Il livello finale è il livello di classificazione. Questo livello utilizza le probabilità restituite dalla funzione di attivazione softmax per ciascun input onde assegnare l’input a una delle classi mutuamente esclusive e calcolare la perdita. Per creare un livello di classificazione, utilizzare classificationLayer.

Specificazione delle opzioni di addestramento

Dopo aver definito la struttura della rete neurale, specificare le opzioni di addestramento. 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. Monitorare la precisione della rete neurale durante l'addestramento specificando i dati di convalida e la frequenza di convalida. Mescolare i dati a ciascuna epoca. 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. Attivare il grafico dei progressi dell'addestramento e disattivare l’output della finestra di comando.

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

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, trainNetwork 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, si può specificare l’ambiente di esecuzione tramite l’argomento nome-valore dell’'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 = trainNetwork(imdsTrain,layers,options);

Classificazione delle immagini di convalida e calcolo della precisione

Prevedere le etichette dei dati di convalida utilizzando la rete neurale addestrata e calcolare la precisione della convalida finale. La precisione è la frazione di etichette che la rete neurale prevede correttamente. In questo caso, oltre il 99% delle etichette predette corrisponde alle etichette reali dell’insieme di convalida.

YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;

accuracy = sum(YPred == YValidation)/numel(YValidation)
accuracy = 0.9988

Vedi anche

| | |

Argomenti complementari