Creazione di una rete 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 di rete.
Specificare le opzioni di addestramento.
Addestrare la rete.
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 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 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. 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 rete
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, rendendo l'addestramento della rete 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 e ridurre la sensibilità all'inizializzazione della rete. 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, specificare le opzioni di addestramento. Addestrare la rete 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 durante l'addestramento specificando i dati di convalida e la frequenza di convalida. Mescolare i dati a ciascuna epoca. Il software addestra la rete 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. 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 tramite i dati di addestramento
Addestrare la rete 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 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 addestrata e calcolare la precisione della convalida finale. La precisione è la frazione di etichette che la rete predice 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
trainNetwork
| trainingOptions
| analyzeNetwork
| Deep Network Designer