Esplorare l’estrazione delle caratteristiche con le CNN

Esplorando l'estrazione delle caratteristiche con le CNN

Utilizzo di una rete neurale convoluzionale per verificare la specializzazione nell’estrazione delle caratteristiche

(Sinistra) Esempio di estrazione delle caratteristiche da un'immagine di un leone utilizzando l'architettura CNN vgg19 (immagine dell'autore). (Destra) Immagine originale del leone (dominio pubblico, disponibile su Pexels).

Le reti neurali convoluzionali sono gli elementi di base per le attività di classificazione delle immagini attraverso l’apprendimento automatico. Tuttavia, un’altra attività molto utile che svolgono prima della classificazione è l’estrazione delle caratteristiche rilevanti da un’immagine. L’estrazione delle caratteristiche è il modo in cui le CNN riconoscono i pattern chiave di un’immagine al fine di classificarla. Questo articolo mostrerà un esempio di come eseguire l’estrazione delle caratteristiche utilizzando TensorFlow e l’API funzionale Keras. Prima, però, per formalizzare questi concetti delle CNN, dobbiamo parlare dello spazio pixel.

Contesto

Spazio pixel

Lo spazio pixel è esattamente ciò che suggerisce il nome: è lo spazio in cui l’immagine viene convertita in una matrice di valori, in cui ogni valore corrisponde a un singolo pixel. Pertanto, l’immagine originale che vediamo, quando viene alimentata alla CNN, viene convertita in una matrice di numeri. Nelle immagini in scala di grigi, questi numeri di solito variano da 0 (nero) a 255 (bianco), e i valori intermedi sono sfumature di grigio. In questo articolo, tutte le immagini sono state normalizzate, ovvero ogni pixel è stato diviso per 255 in modo che il suo valore si trovi nell’intervallo [0, 1].

CNN e spazio pixel

Cosa fa una CNN con l’immagine in rappresentazione pixel è applicare filtri e processarla al fine di estrarre i pixel rilevanti per prendere la “decisione” finale, che è quella di classificare quell’immagine in una determinata classe. Ad esempio, nell’immagine in cima alla pagina, quella CNN ha prestato molta attenzione alla bocca, alla lingua, agli occhi del leone (e ai forti contorni in generale), e queste caratteristiche vengono estratte ulteriormente man mano che si va più in profondità nella rete neurale. Pertanto, è sufficiente dire che più una CNN è specializzata in termini di classificazione, più è professionale nell’identificare le caratteristiche chiave di un’immagine.

L’obiettivo

Detto questo, l’obiettivo è semplice: vedere il livello di specializzazione di una CNN in termini di estrazione delle caratteristiche.

Il metodo

Per fare ciò, ho addestrato due CNN con la stessa architettura, ma con dimensioni di addestramento diverse: una con 50.000 immagini (questa è il punto di riferimento, la migliore), e l’altra con 10.000 immagini (questa è quella di confronto). Dopo di ciò, ho diviso i livelli della CNN per verificare cosa l’algoritmo sta osservando e come interpreta l’immagine alimentata ad esso.

Dataset

Il dataset utilizzato per questo progetto è il dataset di immagini cifar10, ampiamente utilizzato, una raccolta di immagini che fa parte del pubblico dominio. Il dataset è composto da 60.000 immagini suddivise in 10 classi, di cui 10.000 immagini sono utilizzate come set di validazione. Le immagini sono di dimensioni 32×32 pixel e hanno 3 canali di colore (RGB).

Per evitare perdite di dati, ho mantenuto un’immagine da utilizzare come immagine di test per il riconoscimento delle caratteristiche, quindi questa immagine non è stata utilizzata in nessuno dei due addestramenti. Vi presento il nostro esemplare di prova: la rana.

La rana.

Implementazione in TensorFlow

L’implementazione è mostrata nel frammento di codice sottostante. Per suddividere correttamente i livelli della CNN è necessario utilizzare l’API funzionale di Keras in TensorFlow invece dell’API sequenziale. Funziona come un cascata, dove il secondo livello viene chiamato sul precedente.

import tensorflow as tffrom tensorflow.keras.models import Modelfrom tensorflow.keras.layers import Input, Conv2D, MaxPool2D, Dense, Dropout, Flattenfrom tensorflow.keras.callbacks import ModelCheckpoint, EarlyStoppingdef get_new_model(input_shape):  '''  Questa funzione restituisce una CNN compilata con le specifiche fornite sopra.  '''    #Definizione dell'architettura della CNN  input_layer = Input(shape=input_shape, name='input')  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_1')(input_layer)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_2')(h)  h = MaxPool2D(pool_size=(2,2), name='pool_1')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_3')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_4')(h)  h = MaxPool2D(pool_size=(2,2), name='pool_2')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_5')(h)  h = Conv2D(filters=16, kernel_size=(3,3),              activation='relu', padding='same', name='conv2d_6')(h)      h = Dense(64, activation='relu', name='dense_1')(h)  h = Dropout(0.5, name='dropout_1')(h)  h = Flatten(name='flatten_1')(h)  output_layer = Dense(10, activation='softmax', name='dense_2')(h)  #Per generare il modello, passiamo il livello di input e il livello di output  model = Model(inputs=input_layer, outputs=output_layer, name='model_CNN')  #Successivamente applichiamo il metodo di compilazione  model.compile(optimizer='adam',                loss='categorical_crossentropy',                metrics=['accuracy'])    return model

Le specifiche dell’architettura sono mostrate di seguito nella Fig. 1.

Fig. 1: Riepilogo della CNN utilizzata. Immagine dell'autore.

L’ottimizzatore utilizzato è Adam, la funzione di perdita è la categorical cross-entropy e la metrica utilizzata per la valutazione è semplicemente l’accuratezza, poiché l’insieme di dati è perfettamente bilanciato.

Suddivisione delle CNN

Ora possiamo suddividere alcuni livelli strategici delle due CNN per verificare il livello di elaborazione delle immagini. L’implementazione del codice è mostrata di seguito:

benchmark_layers = model_benchmark.layersbenchmark_input = model_benchmark.inputlayer_outputs_benchmark = [layer.output for layer in benchmark_layers]features_benchmark = Model(inputs=benchmark_input, outputs=layer_outputs_benchmark)

Cosa succede qui è quanto segue: nella prima riga si accede a ogni livello del modello e nella seconda riga si restituisce il livello di input dell’intera CNN. Quindi, nella terza riga, creiamo una lista che mostra gli output di ogni livello e, infine, creiamo un nuovo modello, i cui output sono gli output dei livelli. In questo modo possiamo dare un’occhiata a cosa succede tra i livelli.

È stato scritto un codice molto simile per accedere ai livelli del nostro modello fittizio, quindi verrà omesso qui. Ora procediamo a osservare le immagini della nostra rana, elaborate all’interno di diversi livelli delle nostre CNN.

Primo livello di convoluzione

Fittizio

La Fig. 2 mostra le immagini dei 16 filtri del livello di convoluzione (conv2d_1). Possiamo vedere che le immagini non sono super elaborate e che c’è molta ridondanza. Si potrebbe sostenere che questo è solo il primo livello di convoluzione, il che spiega il fatto che l’elaborazione non è così intensiva, ed è un’osservazione corretta. Per affrontare questo problema, daremo uno sguardo al primo livello di benchmark.

Fig. 2: Primo livello convolutivo del classificatore fittizio. Immagine dell'autore.

Modello di confronto

Il classificatore di confronto mostra un’immagine molto più elaborata, al punto che la maggior parte di queste immagini non è più riconoscibile. Ricorda: questo è solo il primo livello convolutivo.

Fig. 3: Primo livello convolutivo del classificatore di confronto. Immagine dell'autore.

Ultimo livello convolutivo

Fittizio

Come previsto, l’immagine non è più riconoscibile, poiché siamo passati attraverso 6 livelli convolutivi fino a questo punto, e 2 livelli di pooling, il che spiega le dimensioni inferiori delle immagini. Vediamo com’è l’ultimo livello del modello di confronto.

Fig. 4: Ultimo livello convolutivo del classificatore fittizio. Immagine dell'autore.

Modello di confronto

Questo è ancora più elaborato, al punto che la maggior parte dei pixel è nera, il che mostra che sono stati selezionati gli elementi importanti e il resto dell’immagine è essenzialmente scartato.

Fig. 5: Ultimo livello convolutivo del classificatore di confronto. Immagine dell'autore.

Come si collega questo con l’informazione?

Possiamo vedere che i gradi di elaborazione sono molto diversi per la stessa porzione della rete. L’analisi qualitativa indica che il modello di confronto è più aggressivo nell’estrazione di informazioni utili dall’input. Questo è particolarmente evidente nel confronto del primo livello convolutivo: l’output dell’immagine della rana è molto meno distorto e molto più riconoscibile nel modello fittizio rispetto al modello di confronto.

Ciò suggerisce che il modello di confronto è più efficiente nel eliminare gli elementi dell’immagine che non sono utili nella previsione della classe, mentre il classificatore fittizio, incerto su come procedere, considera più caratteristiche. Possiamo vedere nella Fig. 6 che il modello di confronto (in blu) scarta più pixel colorati rispetto al modello fittizio (in rosso), il che mostra una coda più lunga nella distribuzione dei colori.

Fig. 6: Distribuzione di probabilità per i pixel nell'ultimo livello. Possiamo vedere che i pixel del modello di confronto (in blu) sono più ravvicinati allo zero, mentre i pixel del modello fittizio (in rosso) mostrano una coda più lunga.

Se osserviamo la distribuzione dei pixel della nostra immagine originale della rana, abbiamo la Fig. 7, che mostra una distribuzione molto più simmetrica, centrata più o meno intorno a 0.4.

Fig. 7: Distribuzione dei colori della nostra immagine originale della rana. Immagine dell'autore.

Dal punto di vista della teoria dell’informazione, le differenze nelle distribuzioni di probabilità tra l’immagine originale e le immagini risultanti dopo i layer convoluzionali rappresentano un enorme guadagno di informazioni.

Osservando la Fig. 6 e confrontandola con la Fig. 7, siamo molto più certi di quali pixel troveremo nella prima rispetto alla seconda. Quindi, c’è un guadagno di informazione. Questa è una breve ed esplorazione qualitativa della Teoria dell’Informazione e apre una porta su un’ampia area. Per ulteriori informazioni sull’Informazione (gioco di parole inteso), consulta questo post.

E infine, un modo per considerare l’incertezza nella risposta dei classificatori è osservare la distribuzione di probabilità sulle classi. Questo è l’output della funzione di softmax, alla fine della nostra CNN. La Fig. 8 (a sinistra) mostra che il benchmark è molto più certo della classe, con una distribuzione che si concentra sulla classe dei rane; mentre la Fig. 8 (a destra) mostra un classificatore fittizio confuso, con la probabilità più alta nella classe sbagliata.

Fig. 8: Distribuzioni di probabilità assegnate da ciascun classificatore. Immagine dell'autore.

Questa analisi mostra un risultato atteso: i set di addestramento più grandi producono algoritmi migliori per la cattura delle caratteristiche.

Il notebook per questo progetto è disponibile qui.

Riferimenti

[1] Krizhevsky, Alex, e Geoffrey Hinton. Apprendimento di più livelli di caratteristiche da immagini piccole. (2009): 7.

[2] M. Jogin, et al., Estrazione di caratteristiche utilizzando le reti neurali convoluzionali (CNN) e l’apprendimento profondo (2018), Conferenza internazionale IEEE sulle tendenze recenti in elettronica, informatica e comunicazione (RTEICT)

[3] K. Simonyan, A. Zisserman, Reti di convoluzione molto profonde per il riconoscimento di immagini su larga scala (2015), Pubblicato come paper di conferenza a ICLR 2015

[4] Z. Matthew e F. Rob. Visualizzazione e comprensione delle reti di convoluzione (2013), Conferenza europea sulla visione artificiale

[5] B. Jyostna e N. Veeranjaneyulu, Estrazione di caratteristiche e classificazione utilizzando reti neurali convoluzionali profonde (2018), Journal of Cyber Security and Mobility