Main Content

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

Classificazione di pattern con una rete neurale superficiale

Oltre al function fitting, le reti neurali sono efficaci anche nel riconoscimento di pattern.

Ad esempio, supponiamo di voler classificare un tumore come benigno o maligno in base all’uniformità delle dimensioni delle cellule, allo spessore del nodulo, alla mitosi, ecc. Ci sono 699 casi di esempio per i quali si conoscono 9 feature e la classificazione corretta come benigno o maligno.

Come nel caso del function fitting, esistono due modi di risolvere questo problema:

Generalmente è meglio iniziare con l’app e quindi utilizzarla per generare automaticamente gli script della riga di comando. Prima di utilizzare uno dei metodi, definisci il problema selezionando un set di dati. Ciascuna delle app per reti neurali ha accesso a numerosi set di dati campione che si possono utilizzare per sperimentare con il toolbox (vedere Set di dati campione per reti neurali superficiali). Se è presente un problema specifico da risolvere, è possibile caricare i propri dati nel workspace. Il prossimo capitolo descrive il formato dei dati.

Suggerimento

Per costruire e addestrare reti profonde in modo interattivo, usa Deep Network Designer.

Definizione di un problema

Per definire un problema di riconoscimento di pattern, disponi un insieme di vettori di input (predittori) come colonne all’interno di una matrice. Quindi disponi un altro insieme di vettori di risposta che indicano le categorie a cui sono assegnate le osservazioni.

Quando sono presenti solo due categorie, ogni risposta ha solo due elementi, 0 e 1, ad indicare a quale categoria appartiene l’osservazione corrispondente. Ad esempio, è possibile definire un problema di classificazione a due categorie come segue:

predictors = [7 10 3 1 6; 5 8 1 1 6; 6 7 1 1 6];
responses = [0 0 1 1 0; 1 1 0 0 1];
I dati consistono in cinque osservazioni, con tre feature ciascuna, classificate in una di due categorie.

Quando i predittori devono essere classificati in N categorie diverse, le risposte hanno N elementi. Per ogni risposta, un elemento è 1 e gli atri sono 0. Ad esempio, le righe che seguono mostrano come definire un problema di classificazione che suddivide gli angoli di u cubo 5x5x5 in tre categorie:

  • L’origine (il primo vettore di input) in una categoria

  • L’angolo più lontano dall’origine (l’ultimo vettore di input) in una seconda categoria

  • Tutti gli altri punti in una terza categoria

predictors  = [0 0 0 0 5 5 5 5; 0 0 5 5 0 0 5 5; 0 5 0 5 0 5 0 5];
responses = [1 0 0 0 0 0 0 0; 0 1 1 1 1 1 1 0; 0 0 0 0 0 0 0 1];
I dati consistono in otto osservazioni, con tre feature ciascuna, classificate in una di tre categorie.

La prossima sezione mostra come addestrare una rete a riconoscere i pattern con l’app Neural Net Pattern Recognition. Questo esempio si basa su un set di dati esemplificativo fornito in dotazione al toolbox.

Classificazione di pattern con l’app Neural Net Pattern Recognition

Questo esempio mostra come addestrare una rete neurale superficiale per classificare i pattern con l’app Neural Net Pattern Recognition.

Apri l’app Neural Net Pattern Recognition tramite nprtool.

nprtool

Selezione dei dati

L’app Neural Net Pattern Recognition contiene dei dati esemplificativi che ti aiuteranno ad iniziare ad addestrare una rete neurale.

Per importare i dati esemplificativi per la classificazione del vetro, seleziona Import > Import Glass Data Set (Importare > Importare set di dati vetro). È possibile utilizzare questi dati per addestrare una rete neurale alla classificazione di vetro come finestra o non-finestra, usando le proprietà della chimica del vetro. Se si importano dati propri da un file o da workspace, occorre specificare i predittori e le risposte e se le osservazioni siano distribuite in righe o colonne.

Le informazioni sui dati importati compaiono nel Model Summary (Riepilogo modello). Questo set di dati contiene 214 osservazioni, con 9 feature ciascuna. Ogni osservazione viene assegnata ad una di queste due classi: finestra o non-finestra.

Suddividi i dati in set di addestramento, convalida e prova. Mantieni le impostazioni predefinite. I dati si suddividono in:

  • 70% per l’addestramento.

  • 15% per convalidare che la rete stia generalizzando e per interrompere l’addestramento prima di un overfitting.

  • 15% per testare in maniera indipendente la generalizzazione della rete.

Per ulteriori informazioni sulla suddivisione dei dati, vedere Divide Data for Optimal Neural Network Training.

Creazione della rete

La rete è una rete feed-forward a due livelli con funzione di trasferimento sigmoidale nel livello nascosto e una funzione di trasferimento softmax nel livello di output. Le dimensioni del livello nascosto corrispondono al numero di neuroni nascosti. Il valore predefinito per le dimensioni è 10. È possibile vedere l’architettura di rete nel pannello Network. Il numero di neuroni di output è impostato su 2, che corrisponde al numero di categorie specificate dai dati di risposta.

Addestramento della rete

Per addestrare la rete, fai clic su Train (Addestrare).

Nel pannello Training (Addestramento) si possono vedere i progressi dell’addestramento. L’addestramento continua fino al raggiungimento di uno dei criteri di arresto. In questo esempio, l’addestramento continua fino a quando l’errore di convalida aumenta per sei iterazioni consecutive (“Criterio di convalida soddisfatto”).

Analisi dei risultati

Il Model Summary (Riepilogo modello) contiene informazioni sull’algoritmo di addestramento e i risultati dell’addestramento per ogni set di dati.

È possibile analizzare ulteriormente i risultati generando dei grafici. Per tracciare le matrici di confusione, nella sezione Plots (Grafici), fai clic su Confusion Matrix (Matrice di confusione). Gli output della rete sono molto accurati, come si può vedere dai numeri elevati di classificazioni corrette nei quadrati verdi (diagonale) e dai numeri ridotti di classificazioni errate nei quadrati rossi (fuori dalla diagonale).

Visualizza la curva ROC per ottenere un’ulteriore verifica della performance della rete. Nella sezione Plots (Grafici), fai clic su ROC Curve (Curva ROC).

Le linee colorate su ogni asse rappresentano le curve ROC. La curva ROC è un grafico dell’incidenza di veri positivi (sensibilità) rispetto all’incidenza di falsi positivi (1 - specificità) al variare della soglia. Un test perfetto mostrerebbe i punti nell’angolo in alto a sinistra, con il 100% di sensibilità e il 100% di specificità. Per questo problema, la performance della rete è ottima.

Se non si è soddisfatti delle prestazioni della rete, si può procedere in uno dei seguenti modi:

  • Addestrare nuovamente la rete.

  • Aumentare il numero di neuroni nascosti.

  • Usare un set più ampio di dati di addestramento.

Se la performance sul set di addestramento è buona ma la performance sul set di test è scarsa, questo può indicare un overfitting del modello. Ridurre il numero di neuroni può ridurre l’overfitting.

Si può anche valutare la performance della rete su un ulteriore set di test. Per caricare ulteriori dati di test con cui valutare la rete, nella sezione Test, fai clic su Test. Il Model Summary (Riepilogo modello) mostra i risultati di test aggiuntivi. È possibile generare anche dei grafici per analizzare i risultati di test aggiuntivi.

Generazione di codice

Seleziona Generate Code > Generate Simple Training Script (Generare codice > Generare script di addestramento semplice) per creare un codice MATLAB in grado di riprodurre le fasi precedenti dalla riga di comando. La creazione di codice MATLAB può essere utile se si desidera imparare come utilizzare la funzionalità della riga di comando del toolbox per personalizzare il processo di addestramento. In Classificazione di pattern con le funzioni della riga di comando, potrai esaminare più dettagliatamente gli script generati.

Esportazione della rete

Una volta addestrata, la rete può essere esportata nel workspace o in Simulink®. È anche possibile distribuire la rete con MATLAB Compiler™ e altri strumenti di generazione di codice MATLAB. Per esportare la rete addestrata e i risultati, seleziona Export Model > Esport to Workspace (Esportare modello > Esportare in Workspace).

Classificazione di pattern con le funzioni della riga di comando

Il modo più semplice per scoprire come utilizzare la funzionalità della riga di comando del toolbox consiste nel generare degli script dalle app e poi modificarli per personalizzare l’addestramento della rete. Ad esempio, osserva il semplice script creato nella sezione precedente con l’uso dell’app Neural Net Pattern Recognition.

% Solve a Pattern Recognition Problem with a Neural Network
% Script generated by Neural Pattern Recognition app
% Created 22-Mar-2021 16:50:20
%
% This script assumes these variables are defined:
%
%   glassInputs - input data.
%   glassTargets - target data.

x = glassInputs;
t = glassTargets;

% Choose a Training Function
% For a list of all training functions type: help nntrain
% 'trainlm' is usually fastest.
% 'trainbr' takes longer but may be better for challenging problems.
% 'trainscg' uses less memory. Suitable in low memory situations.
trainFcn = 'trainscg';  % Scaled conjugate gradient backpropagation.

% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize, trainFcn);

% Setup Division of Data for Training, Validation, Testing
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

% Train the Network
[net,tr] = train(net,x,t);

% Test the Network
y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)
tind = vec2ind(t);
yind = vec2ind(y);
percentErrors = sum(tind ~= yind)/numel(tind);

% View the Network
view(net)

% Plots
% Uncomment these lines to enable various plots.
%figure, plotperform(tr)
%figure, plottrainstate(tr)
%figure, ploterrhist(e)
%figure, plotconfusion(t,y)
%figure, plotroc(t,y)

È possibile salvare lo script ed eseguirlo successivamente dalla riga di comando per riprodurre i risultati della precedente sessione di addestramento. Si può anche modificare lo script per personalizzare il processo di addestramento. In questo caso, segui ogni passaggio all’interno dello script.

Selezione dei dati

Lo script presuppone che i vettori di previsione e di risposta siano già caricati nel workspace. Se i dati non sono caricati, li si può caricare nel seguente modo:

load glass_dataset
Questo comando carica i predittori glassInputs e le risposte glassTargets nel workspace.

Questo set di dati è uno dei set di dati campione inclusi nel toolbox. Per informazioni sui set di dati disponibili, vedere Set di dati campione per reti neurali superficiali. Inoltre, è possibile vedere un elenco di tutti i set di dati disponibili immettendo il comando help nndatasets. È possibile caricare le variabili da uno qualunque di questi set di dati utilizzando i propri nomi di variabile. Ad esempio, il comando

[x,t] = glass_dataset;
caricherà i predittori per il vetro nell’array x e le risposte per il vetro nell’array t.

Scelta dell’algoritmo di addestramento

Definisci l’algoritmo di addestramento.

trainFcn = 'trainscg';  % Scaled conjugate gradient backpropagation.

Creazione della rete

Crea la rete. La rete predefinita per problemi di pattern recognition (classificazione), patternnet, è una rete feed-forward con la funzione di trasferimento sigmoidale predefinita nel livello nascosto e una funzione di trasferimento softmax nel livello di output. La rete ha un solo livello nascosto con dieci neuroni (default).

La rete ha due neuroni di output perché sono presenti due valori di risposta (categorie) associati ad ogni vettore di input. Ogni neurone di output rappresenta una categoria. Quando un vettore di input nella categoria corretta viene applicato alla rete, il neurone corrispondente dovrebbe produrre un 1 e gli altri neuroni dovrebbero produrre uno 0.

hiddenLayerSize = 10;
net = patternnet(hiddenLayerSize, trainFcn);

Nota

Più neuroni richiedono più calcolo e tendono all’overfitting dei dati quando il numero è impostato su un valore troppo alto, ma permettono alla rete di risolvere problemi più complicati. Più livelli richiedono più calcolo, ma il loro utilizzo potrebbe consentire alla rete di risolvere problemi più complessi in modo più efficiente. Per utilizzare più di un livello nascosto, inserisci le dimensioni dei livelli nascosti come elementi di un array nel comando patternnet.

Suddivisione dei dati

Imposta la suddivisione dei dati.

net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;

Con queste impostazioni, i vettori di previsione e i vettori di risposta vengono suddivisi su base casuale, con il 70% per l’addestramento, il 15% per la convalida e il 15% per le attività di test. Per ulteriori informazioni sulla procedura di suddivisione dei dati, vedere Divide Data for Optimal Neural Network Training.

Addestramento della rete

Addestra la rete.

[net,tr] = train(net,x,t);

Durante l’addestramento si apre la finestra di avanzamento dell’addestramento. È possibile interrompere l’addestramento in qualunque momento facendo clic sul pulsante di stop .

Neural network training progress window

L’addestramento è terminato quando l’errore di convalida è aumentato per sei iterazioni consecutive, cosa che si è verificata all’iterazione 14.

Facendo clic su Performance nella finestra di addestramento, compare un grafico degli errori di addestramento, degli errori di convalida e degli errori di test, come si può osservare nella figura che segue.

Cross entropy error against number of epochs for the training, validation, and test data. The best validation performance is 0.058432 at epoch 8.

In questo esempio, il risultato è ragionevole dato che l’errore di entropia incrociata finale è piccolo.

Test della rete

Esegui il test della rete. Una volta addestrata la rete è possibile utilizzarla per calcolare gli output della rete. Il seguente codice calcola gli output, gli errori e la performance complessiva della rete.

y = net(x);
e = gsubtract(t,y);
performance = perform(net,t,y)
performance =

    0.0659

Inoltre, è possibile calcolare la frazione delle osservazioni classificate in modo erroneo. In questo esempio, il modello ha un tasso di errata classificazione molto basso.

tind = vec2ind(t);
yind = vec2ind(y);
percentErrors = sum(tind ~= yind)/numel(tind)
percentErrors =

    0.0514

È possibile calcolare la performance della rete anche solamente sulla base del set di test, utilizzando gli indici di test che si trovano nel registro dell’addestramento.

tInd = tr.testInd;
tstOutputs = net(x(:,tInd));
tstPerform = perform(net,t(tInd),tstOutputs)
tstPerform =

    2.0163

Visualizzazione della rete

Visualizza il diagramma della rete.

view(net)

Graphical representation of the pattern recognition network. The network has input size 9, output size 2, and a single hidden layer of size 10.

Analisi dei risultati

Utilizza la funzione plotconfusion per tracciare la matrice di confusione. È possibile tracciare la matrice di confusione per ciascuno dei set di dati facendo clic su Confusion nella finestra di addestramento.

figure, plotconfusion(t,y)

Confusion matrix of the output and target classes. The network classifies 203 inputs correctly and 11 inputs incorrectly.

Le celle verdi sulla diagonale mostrano il numero di casi classificati correttamente, mentre le celle rosse fuori dalla diagonale mostrano i casi classificati in modo errato. I risultati indicano un riconoscimento ottimo. Nel caso in cui siano necessari risultati ancora più accurati, si potrebbe tentare uno dei seguenti approcci:

  • Reimpostare i pesi e i bias iniziali della rete su nuovi valori con init e ripetere l’addestramento.

  • Aumentare il numero di neuroni nascosti.

  • Usare un set più ampio di dati di addestramento.

  • Aumentare il numero di valori di input, se sono disponibili informazioni più pertinenti.

  • Provare un algoritmo di addestramento diverso (vedere Training Algorithms).

In questo caso, i risultati della rete sono soddisfacenti e a questo punto si può utilizzare la rete su nuovi dati di input.

Fasi successive

Per acquisire maggiore esperienza nelle operazioni della riga di comando, ecco alcune attività da provare:

  • Durante l’addestramento, apri una finestra con un grafico (ad esempio il grafico della confusione) e osserva come si anima.

  • Crea dei grafici dalla riga di comando con funzioni come plotroc e plottrainstate.

Ogni volta che una rete neurale viene addestrata può arrivare a una soluzione diversa a causa dei valori casuali dei pesi e dei bias iniziali e delle diverse suddivisioni dei dati tra set di addestramento, convalida e test. Di conseguenza, diverse reti neurali addestrate sullo stesso problema possono avere output diversi per lo stesso input. Per assicurarsi di riscontrare una precisione soddisfacente nella rete, occorre ripetere l’addestramento varie volte.

Esistono varie altre tecniche per migliorare le soluzioni iniziali qualora si desideri una precisione maggiore. Per ulteriori informazioni, vedere Improve Shallow Neural Network Generalization and Avoid Overfitting.

Vedi anche

| | | |

Argomenti complementari