Main Content

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

alexnet

Rete neurale convoluzionale AlexNet

  • AlexNet network architecture

Descrizione

AlexNet è una rete neurale convoluzionale con 8 livelli di profondità. È possibile caricare una versione preaddestrata della rete, addestrata su oltre un milione di immagini del database di ImageNet [1]. La rete preaddestrata è in grado di classificare le immagini in 1000 categorie di oggetti, come tastiera, mouse, matita e molti animali. Di conseguenza, la rete ha appreso rappresentazioni ricche di feature per un'ampia gamma di immagini. La dimensione di input dell'immagine della rete è 227x227. Per ulteriori reti addestrate in MATLAB®, vedere Reti neurali profonde preaddestrate.

È possibile utilizzare classify per classificare nuove immagini utilizzando la rete AlexNet. Seguire i passaggi di Classificazione di immagini utilizzando GoogLeNet e sostituire GoogLeNet con AlexNet.

Per un’introduzione concreta ai metodi pratici di Deep Learning, vedere Deep Learning Onramp.

esempio

net = alexnet restituisce una rete AlexNet addestrata sul set di dati di ImageNet.

Questa funzione richiede il pacchetto di supporto Deep Learning Toolbox™ Model for AlexNet Network. Se il pacchetto di supporto non è installato, la funzione fornisce un link per il download. In alternativa, vedere Deep Learning Toolbox Model per la rete AlexNet.

Per ulteriori reti addestrate in MATLAB, vedere Reti neurali profonde preaddestrate.

net = alexnet('Weights','imagenet') restituisce una rete AlexNet addestrata sul set di dati di ImageNet. Questa sintassi è equivalente a net = alexnet.

layers = alexnet('Weights','none') restituisce l'architettura della rete AlexNet non addestrata. Il modello non addestrato non richiede il pacchetto di supporto.

Esempi

comprimi tutto

Scaricare e installare il pacchetto di supporto Deep Learning Toolbox Model for AlexNet Network.

Digitare alexnet nella riga di comando.

alexnet

Se il pacchetto di supporto Deep Learning Toolbox Model for AlexNet Network non è installato, la funzione fornisce un link al pacchetto di supporto richiesto nell’Add-On Explorer. Fare clic sul link per installare il pacchetto di supporto, quindi fare clic su Install. Verificare che l’installazione sia stata eseguita correttamente digitando alexnet nella riga di comando.

alexnet
ans = 

  SeriesNetwork with properties:

    Layers: [25×1 nnet.cnn.layer.Layer]

Se il pacchetto di supporto richiesto è installato, la funzione restituisce un oggetto SeriesNetwork.

Visualizzare la rete con Deep Network Designer.

deepNetworkDesigner(alexnet)

Scoprire altre reti neurali preaddestrate in Deep Network Designer facendo clic su New.

Deep Network Designer start page showing available pretrained neural networks

Se è necessario scaricare una rete neurale, fermarsi sulla rete neurale desiderata e fare clic su Install per aprire l’Add-On Explorer.

Questo esempio mostra come perfezionare una rete neurale convoluzionale AlexNet preaddestrata per eseguire la classificazione di una nuova raccolta di immagini.

AlexNet è stata addestrata su oltre un milione di immagini ed è in grado di classificare le immagini in 1000 categorie di oggetti (ad esempio, tastiera, tazza da caffè, matita e molti animali). La rete ha appreso ricche rappresentazioni di feature per un’ampia gamma di immagini. La rete prende un’immagine come input e produce come output un’etichetta per l’oggetto all’interno dell’immagine, insieme alle probabilità che l’oggetto appartenga a ciascuna delle altre categorie di oggetti.

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.

Caricamento dei dati

Decomprimere e caricare le nuove immagini 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.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Dividere i dati in set di dati di addestramento e di convalida. Utilizzare il 70% delle immagini per l’addestramento e il 30% per la convalida. splitEachLabel divide il datastore images in due nuovi datastore.

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

Questo set di dati molto piccolo contiene adesso 55 immagini di addestramento e 20 immagini di convalida. Visualizzare alcune immagini di esempio.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

Caricamento della rete preaddestrata

Caricare la rete neurale AlexNet preaddestrata. Se Deep Learning Toolbox™ Model for AlexNet Network non è installato, il software fornisce un link per il download. AlexNet è addestrata su oltre un milione di immagini ed è in grado di classificare le immagini in 1000 categorie di oggetti, come tastiera, mouse, matita e molti animali. Di conseguenza, il modello ha appreso rappresentazioni ricche di feature per un'ampia gamma di immagini.

net = alexnet;

Utilizzare analyzeNetwork per visualizzare una visualizzazione interattiva dell'architettura di rete e informazioni dettagliate sui livelli della rete.

analyzeNetwork(net)

Il primo livello, ossia il livello di input delle immagini, richiede immagini di input di dimensioni 227x227x3, dove 3 indica il numero di canali del colore.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

Sostituzione dei livelli finali

Gli ultimi tre livelli della rete preaddestrata net sono configurati per 1000 classi. Questi tre livelli devono essere perfezionati per i nuovi problemi di classificazione. Estrarre tutti i livelli dalla rete preaddestrata, tranne gli ultimi tre.

layersTransfer = net.Layers(1:end-3);

Trasferire i livelli alla nuova attività di classificazione sostituendo gli ultimi tre livelli con un livello completamente connesso, un livello softmax e un livello di output della classificazione. Specificare le opzioni del nuovo livello completamente connesso sulla base dei nuovi dati. Impostare il livello completamente connesso in modo che abbia la stessa dimensione del numero di classi dei nuovi dati. Per apprendere più rapidamente nei nuovi livelli rispetto ai livelli trasferiti, aumentare i valori WeightLearnRateFactor e BiasLearnRateFactor del livello completamente connesso.

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

Addestramento della rete

La rete richiede immagini di input di dimensioni 227x227x3, ma le immagini nei datastore di immagini hanno dimensioni diverse. Utilizzare un datastore di immagini aumentate per ridimensionare automaticamente le immagini di addestramento. Specificare ulteriori operazioni di aumento da eseguire sulle immagini di addestramento: capovolgere casualmente le immagini di addestramento lungo l'asse verticale e traslarle casualmente fino a 30 pixel in orizzontale e verticale. L’aumento dei dati aiuta la rete ad evitare l’overfitting e a memorizzare i dettagli esatti delle immagini di addestramento.

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);

Per ridimensionare automaticamente le immagini di convalida senza eseguire un ulteriore aumento dei dati, utilizzare un datastore di immagini aumentate senza specificare alcuna ulteriore operazione di pre-elaborazione.

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

Specificare le opzioni di addestramento. Per il transfer learning, mantenere le feature dei livelli precedenti della rete preaddestrata (i pesi dei livelli trasferiti). Per rallentare l’apprendimento nei livelli trasferiti, impostare la velocità di apprendimento iniziale su un valore ridotto. Nel passaggio precedente, sono stati aumentati i fattori della velocità di apprendimento del livello completamente connesso per accelerare 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. Quando si esegue il transfer learning, non è necessario l’addestramento per un numero elevato di epoche. Un'epoca è un ciclo di addestramento completo sull'intero set di dati di addestramento. Specificare la dimensione del mini-batch e i dati di convalida. Il software convalida la rete ogni ValidationFrequency iterazioni durante l’addestramento.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

Addestrare la rete composta dai livelli trasferiti e da quelli nuovi. 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.

netTransfer = trainNetwork(augimdsTrain,layers,options);

Classificazione delle immagini di convalida

Classificare le immagini di convalida utilizzando la rete ottimizzata.

[YPred,scores] = classify(netTransfer,augimdsValidation);

Visualizzare quattro immagini di convalida di esempio con le etichette previste.

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label));
end

Calcolare la precisione della classificazione sul set di convalida. La precisione è la frazione di etichette che la rete predice correttamente.

YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
accuracy = 1

Per suggerimenti su come migliorare la precisione della classificazione, vedere Deep Learning Tips and Tricks.

Leggere, ridimensionare e classificare un’immagine utilizzando AlexNet. Innanzi tutto, caricare un modello AlexNet preaddestrato.

net = alexnet;

Leggere l’immagine utilizzando imread.

I = imread('peppers.png');
figure
imshow(I)

Il modello preaddestrato necessita che le dimensioni dell’immagine siano uguali a quelle di input della rete. Determinare la dimensione di input della rete utilizzando la proprietà InputSize del primo livello della rete.

sz = net.Layers(1).InputSize
sz = 1×3

   227   227     3

Ridimensionare l'immagine alla dimensione di input della rete.

I = imresize(I,sz(1:2));
figure
imshow(I)

Classificare l’immagine utilizzando classify.

label = classify(net,I)
label = categorical
     bell pepper 

Mostrare l’immagine e il risultato della classificazione insieme.

figure
imshow(I)
title(label)

Questo esempio mostra come estrarre le feature dell'immagine apprese da una rete neurale convoluzionale preaddestrata e come utilizzare tali feature per addestrare un classificatore di immagini. L'estrazione di feature è il modo più semplice e veloce per utilizzare la potenza rappresentativa delle reti profonde preaddestrate. Ad esempio, è possibile addestrare una macchina a vettori di supporto (SVM) utilizzando fitcecoc (Statistics and Machine Learning Toolbox™) sulle feature estratte. Considerando che l’estrazione di feature richiede solo un singolo passaggio attraverso i dati, costituisce un buon punto di partenza se non si dispone di una GPU con cui accelerare l’addestramento della rete.

Caricamento dei dati

Decomprimere e caricare le immagini campione 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 di immagini di grandi dimensioni, compresi quelli che non entrano nella memoria. Dividere i dati in 70% per l’addestramento e 30% per la prova.

unzip('MerchData.zip');

imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

Sono ora presenti 55 immagini di addestramento e 20 immagini di convalida in questo set di dati molto piccolo. Visualizzare alcune immagini di esempio.

numImagesTrain = numel(imdsTrain.Labels);
idx = randperm(numImagesTrain,16);

for i = 1:16
    I{i} = readimage(imdsTrain,idx(i));
end

figure
imshow(imtile(I))

Caricamento della rete preaddestrata

Caricare una rete AlexNet preaddestrata. Se il pacchetto di supporto Deep Learning Toolbox Model for AlexNet Network non è installato, il software fornisce un link per il download. AlexNet è addestrata su oltre un milione di immagini ed è in grado di classificare le immagini in 1000 categorie di oggetti. Ad esempio, tastiera, mouse, matita e molti animali. Di conseguenza, il modello ha appreso rappresentazioni ricche di feature per un'ampia gamma di immagini.

net = alexnet;

Visualizzare l’architettura di rete. La rete dispone di cinque livelli convoluzionali e tre livelli completamente connessi.

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

Il primo livello, ossia il livello di input delle immagini, richiede immagini di input di dimensioni 227x227x3, dove 3 indica il numero di canali del colore.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

Estrazione delle feature dell’immagine

La rete costruisce una rappresentazione gerarchica delle immagini di input. I livelli più profondi contengono feature di livello superiore, costruite utilizzando le feature di livello inferiore dei livelli precedenti. Per ottenere le rappresentazioni delle feature delle immagini di addestramento e di prova, utilizzare activations su livello completamente connesso 'fc7'. Per ottenere una rappresentazione di livello inferiore delle immagini, utilizzare un livello precedente della rete.

La rete richiede immagini di input di dimensioni 227x227x3, ma le immagini nei datastore di immagini hanno dimensioni diverse. Per ridimensionare automaticamente le immagini di addestramento e di prova prima di utilizzarle come input di rete, creare dei datastore di immagini aumentate, specificare la dimensione desiderata dell’immagine e utilizzare tali datastore come argomenti di input di activations.

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

layer = 'fc7';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

Estrarre le etichette delle classi dai dati di addestramento e di prova.

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

Classificatore di immagini adatte

Utilizzare le feature estratte dalle immagini di addestramento come variabili predittive e adattare una macchina a vettori di supporto (SVM) multiclasse utilizzando fitcecoc (Statistics and Machine Learning Toolbox).

mdl = fitcecoc(featuresTrain,YTrain);

Classificazione delle immagini di prova

Classificare le immagini di prova utilizzando il modello SVM addestrato e le feature estratte dalle immagini di prova.

YPred = predict(mdl,featuresTest);

Visualizzare quattro immagini di prova di esempio con le etichette previste.

idx = [1 5 10 15];
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    label = YPred(idx(i));
    
    imshow(I)
    title(label)
end

Calcolare la precisione della classificazione sul set di prova. La precisione è la frazione di etichette che la rete predice correttamente.

accuracy = mean(YPred == YTest)
accuracy = 1

Questa SVM ha un’alta precisione. Se la precisione non è sufficientemente alta con l'estrazione di feature, si può provare con il transfer learning.

Argomenti di output

comprimi tutto

Rete neurale convoluzionale AlexNet preaddestrata, restituita come un oggetto SeriesNetwork.

Architettura della rete neurale convoluzionale AlexNet non addestrata, restituita come un array di Layer.

Suggerimenti

Riferimenti

[1] ImageNet. http://www.image-net.org

[2] Russakovsky, O., Deng, J., Su, H., et al. "ImageNet Large Scale Visual Recognition Challenge." International Journal of Computer Vision (IJCV). Vol 115, Issue 3, 2015, pp. 211–252

[3] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems. 2012.

[4] BVLC AlexNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

Funzionalità estese

Cronologia versioni

Introdotto in R2017a