Classificazione di immagini in 10 minuti con il dataset MNIST

Utilizzo delle reti neurali convoluzionali per classificare le cifre scritte a mano con TensorFlow e Keras | Deep Learning supervisionato.

Se state leggendo questo articolo, sono sicuro che condividiamo interessi simili e che siamo/saremo in settori simili. Quindi mettiamoci in contatto via Linkedin! Non esitate a inviare una richiesta di contatto! Orhan G. Yalçın – Linkedin

Prima di immergervi in questo articolo, vorrei solo farvi sapere che se siete appassionati di deep learning, credo che dovreste consultare anche gli altri miei articoli, come ad esempio:

1 – Riduzione del rumore delle immagini in 10 minuti con gli autoencoder convoluzionali profondi, dove abbiamo imparato a costruire autoencoder per il denoising delle immagini;

2 – Prevedere il prezzo del Bitcoin (BTC) di domani con le Reti Neurali Ricorrenti: utilizziamo una RNN per prevedere i prezzi del BTC e, poiché utilizza un’API, i risultati rimangono sempre aggiornati.

Quando si inizia a imparare il deep learning con diverse architetture di reti neurali, ci si rende conto che una delle tecniche di deep learning supervisionate più potenti è la rete neurale convoluzionale (abbreviata in “CNN”). La struttura finale di una CNN è in realtà molto simile a quella delle reti neurali regolari (RegularNets), dove ci sono neuroni con pesi e polarizzazioni. Inoltre, proprio come nelle reti regolari, anche nelle CNN utilizziamo una funzione di perdita (ad esempio crossentropy o softmax) e un ottimizzatore (ad esempio adam optimizer) [CS231]. Inoltre, nelle CNN sono presenti anche strati convoluzionali, strati di pooling e strati di appiattimento.

Per comprendere meglio la loro struttura ed imparare come costruire una rete CNN, nel corso di Deep Learning per la Computer Vision viene spiegato tutto nel dettaglio!

Le CNN sono utilizzate principalmente per la classificazione delle immagini, anche se è possibile trovare altre aree di applicazione come l’elaborazione del linguaggio naturale.

Perché le reti neurali convoluzionali 

La principale caratteristica strutturale delle reti regolari è che tutti i neuroni sono collegati tra loro. Ad esempio, se abbiamo immagini con 28 x 28 pixel in scala di grigi, avremo 784 (28 x 28 x 1) neuroni in uno strato che sembra gestibile. Tuttavia, la maggior parte delle immagini hanno molti più pixel e non sono in scala di grigi. Pertanto, supponendo di avere una serie di immagini a colori in 4K Ultra HD, avremo 26.542.080 (4096 x 2160 x 3) neuroni diversi collegati tra loro nel primo livello, il che non è davvero gestibile. Pertanto, possiamo dire che le reti regolari non sono scalabili per la classificazione delle immagini. Tuttavia, soprattutto quando si tratta di immagini, sembra esserci poca correlazione o relazione tra due singoli pixel, a meno che non siano vicini tra loro. Questo porta all’idea dei livelli convoluzionali e dei livelli di pooling.

Strati in una CNN

In una rete neurale convoluzionale è possibile utilizzare molti strati diversi. Tuttavia, gli strati di convoluzione, di pooling e di connessione completa sono i più importanti. Pertanto, presenterò rapidamente questi strati prima di implementarli.

 

Strati convoluzionali 

Il livello convoluzionale è il primo livello in cui vengono estratte le caratteristiche dalle immagini dei nostri set di dati. Poiché i pixel sono in relazione solo con i pixel adiacenti e vicini, la convoluzione ci permette di preservare la relazione tra le diverse parti di un’immagine. La convoluzione consiste nel filtrare l’immagine con un filtro di pixel più piccoli per ridurre le dimensioni dell’immagine senza perdere la relazione tra i pixel. Se applichiamo la convoluzione a un’immagine 5×5 utilizzando un filtro 3×3 con passo 1×1 (spostamento di 1 pixel a ogni passo). Si otterrà un risultato 3×3 (riduzione del 64% della complessità).

Convoluzione di un’immagine di 5 x 5 pixel con un filtro di 3 x 3 pixel (stride = 1 x 1 pixel)

Strato di pooling 

Quando si costruiscono le CNN, è comune inserire strati di pooling dopo ogni strato di convoluzione per ridurre la dimensione spaziale della rappresentazione e ridurre il numero di parametri, riducendo così la complessità computazionale. Inoltre, il pooling layer aiuta anche a risolvere il problema dell’overfitting. In pratica, si seleziona una dimensione di pooling per ridurre la quantità di parametri, selezionando i valori massimi, medi o la somma all’interno di questi pixel. Il Max Pooling, una delle tecniche di pooling più comuni.

Pooling massimo di 2 x 2 Un insieme di strati completamente connessi Una rete completamente connessa è la nostra RegularNet, dove ogni parametro è collegato l’uno all’altro per determinare la vera relazione e l’effetto di ogni parametro sulle etichette. Poiché la complessità spaziotemporale è notevolmente ridotta grazie agli strati di convoluzione e pooling, alla fine possiamo costruire una rete completamente connessa per classificare le nostre immagini. Un insieme di livelli completamente connessi si presenta come segue: Uno strato completamente connesso con due strati nascosti Ora che avete un’idea dei singoli strati che utilizzeremo, credo sia giunto il momento di condividere una panoramica di una rete neurale convoluzionale completa.

Ora che avete un’idea di come costruire una rete neurale convoluzionale per la classificazione delle immagini, possiamo prendere il set di dati più comunemente utilizzato per la classificazione: il set di dati MNIST, che sta per Modified National Institute of Standards and Technology database. Si tratta di un grande database di cifre scritte a mano che viene comunemente utilizzato per l’addestramento di vari sistemi di elaborazione delle immagini.

Scaricare il set di dati MNIST 

Il dataset MNIST è uno dei dataset più comuni utilizzati per la classificazione delle immagini ed è accessibile da molte fonti diverse. Infatti, anche Tensorflow e Keras ci permettono di importare e scaricare il dataset MNIST direttamente dalle loro API. Pertanto, inizierò con le due righe seguenti per importare TensorFlow e il dataset MNIST dall’API di Keras. Il database MNIST contiene 60.000 immagini di addestramento e 10.000 immagini di test prese da impiegati dell’American Census Bureau e da studenti delle scuole superiori americane [Wikipedia]. Pertanto, nella seconda riga, ho separato questi due gruppi come train e test e ho anche separato le etichette e le immagini. Le parti x_train e x_test contengono codici RGB in scala di grigi (da 0 a 255), mentre le parti y_train e y_test contengono etichette da 0 a 9 che rappresentano il numero effettivo. Per visualizzare questi numeri, possiamo ricorrere all’aiuto di matplotlib.

Quando si esegue il codice di cui sopra, si ottiene la visualizzazione in scala di grigi dei codici RGB.

Dobbiamo anche conoscere la forma dell’insieme di dati per poterli inviare alla rete neurale convoluzionale. Pertanto, utilizzerò l’attributo “shape” dell’array NumPy con il seguente codice: Si otterrà (60000, 28, 28). Come si può intuire, 60000 rappresenta il numero di immagini nel set di dati del treno e (28, 28) rappresenta la dimensione dell’immagine: 28 x 28 pixel.

Rimodellare e normalizzare le immagini Per poter utilizzare l’insieme di dati in Keras API, abbiamo bisogno di array NumPy a 4 dimensioni. Tuttavia, come abbiamo visto sopra, il nostro array è a 3 dimensioni. Inoltre, dobbiamo normalizzare i nostri dati, come è sempre richiesto nei modelli di rete neurale. Possiamo ottenere questo risultato dividendo i codici RGB a 255 (che è il codice RGB massimo meno il codice RGB minimo).

Costruire la rete neurale convoluzionale 

Costruiremo il nostro modello utilizzando l’API di alto livello di Keras che utilizza TensorFlow o Theano sul backend. Vorrei ricordare che esistono diverse API TensorFlow di alto livello, come Layers, Keras e Estimators, che ci aiutano a creare reti neurali con conoscenze di alto livello. Tuttavia, questo può generare confusione, poiché tutte variano nella loro struttura di implementazione. Pertanto, se vedete codici completamente diversi per la stessa rete neurale, anche se tutti utilizzano TensorFlow, ecco perché. Utilizzerò l’API più semplice, ovvero Keras. Pertanto, importerò il modello sequenziale da Keras e aggiungerò gli strati Conv2D, MaxPooling, Flatten, Dropout e Dense. Ho già parlato dei livelli Conv2D, Maxpooling e Dense. Inoltre, i livelli Dropout combattono l’overfitting ignorando alcuni dei neuroni durante l’addestramento, mentre i livelli Flatten appiattiscono le matrici 2D in matrici 1D prima di costruire gli strati completamente connessi.

Possiamo sperimentare qualsiasi numero per il primo strato denso; tuttavia, lo strato denso finale deve avere 10 neuroni poiché abbiamo 10 classi di numeri (0, 1, 2, …, 9). È sempre possibile sperimentare la dimensione del kernel, la dimensione del pool, le funzioni di attivazione, il tasso di abbandono e il numero di neuroni nel primo strato Dense per ottenere un risultato migliore.

Compilazione e adattamento del modello 

Con il codice precedente, abbiamo creato una CNN vuota non ottimizzata. Ora è il momento di impostare un ottimizzatore con una determinata funzione di perdita che utilizza una metrica. Quindi, possiamo adattare il modello utilizzando i nostri dati di addestramento.

È possibile sperimentare con l’ottimizzatore, la funzione di perdita, le metriche e le epoche. Tuttavia, posso dire che l’ottimizzatore adam di solito supera gli altri ottimizzatori. Non sono sicuro che sia possibile modificare la funzione di perdita per la classificazione multiclasse. Sentitevi liberi di sperimentare e commentare qui sotto. Il numero di epoch potrebbe sembrare un po’ piccolo. Tuttavia, si raggiungerà un’accuratezza di test del 98-99%. Poiché il dataset MNIST non richiede una grande potenza di calcolo, si può facilmente sperimentare anche il numero di epoch.

Valutazione del modello

Infine, è possibile valutare il modello addestrato con x_test e y_test utilizzando una riga di codice. Ad essere sinceri, in molti casi di classificazione delle immagini (ad esempio per le auto autonome), non possiamo tollerare nemmeno lo 0,1% di errore poiché, per analogia, causerebbe 1 incidente su 1000 casi. Tuttavia, per il nostro primo modello, direi che il risultato è ancora piuttosto buono. Possiamo anche fare previsioni individuali con il seguente codice: Il nostro modello classificherà l’immagine come un ‘9’.

Anche se non si tratta di una buona grafia del numero 9, il nostro modello è stato in grado di classificarla come 9.

Congratulazioni! 

Avete costruito con successo una rete neurale convoluzionale per classificare le cifre scritte a mano con l’API Keras di Tensorflow. Avete ottenuto un’accuratezza superiore al 98% e ora potete anche salvare questo modello e creare un’applicazione per la classificazione delle cifre! Se siete curiosi di sapere come salvare il vostro modello, vi invito a consultare il file Keras Documentation. Dopo tutto, per poter utilizzare in modo efficiente un’API, bisogna imparare a leggere e utilizzare la documentazione.

 

Articolo originale di Orhan G Yalcin

Image Classification in 10 Minutes with MNIST Dataset | by Orhan G. Yalçın | Towards Data Science

Share:

Contenuti
Torna in alto