Reti neurali: riconoscimento cifre scritte a mano
Introduzione
Nel contesto dell'analisi dei dati e dell'intelligenza artificiale, il riconoscimento di caratteri scritti a mano è stato (ed è tuttora) un problema affascinante e rilevante. L'obiettivo di questo progetto è sviluppare e addestrare una rete neurale in grado di riconoscere le cifre scritte a mano, sfruttando il famoso dataset MNIST (Modified National Institute of Standards and Technology). MNIST è un insieme di immagini in scala di grigi rappresentanti cifre da 0 a 9 di dimensioni 28x28 pixel, ognuna acquisita da scritture manuali diverse.
Nel corso di questo progetto, utilizzerò la libreria Keras e applicherò tecniche di deep learning per costruire e addestrare una rete neurale per affrontare questa sfida. Le reti neurali sono particolarmente adatte per questo tipo di compito poiché sono in grado di catturare e apprendere gerarchie di caratteristiche dalle immagini in modo efficiente.
Nell'ultima parte del progetto, testerò il modello su 10 immagini di numeri scritti a mano da me.
Fonte dati di addestramento: http://yann.lecun.com/exdb/mnist/
Importazione moduli
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from time import time
import os
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.utils import to_categorical
from keras.callbacks import History
from keras.regularizers import l2
from skimage import io
from skimage.transform import resize
from skimage.color import rgb2gray
Importazione e preprocessing dei dati
In questa sezione verrà caricato il dataset ed eseguite le operazioni necessarie a trasformare i dati nel formato ottimale per l'addestramento. Nello specifico:
- Divisione del dataset in sezione di addestramento e sezione di test
- Reshaping delle features
- Normalizzazione delle features
- One-Hot encoding del target
Caricamento del dataset
(X_train, y_train), (X_test, y_test) = mnist.load_data()
display(X_train.shape)
display(X_test.shape)
Reshaping delle features di addestramento e di test e normalizzazione
max_value = max(X_train.flatten())
X_train = X_train.reshape(60000, 28*28) / max_value
X_test = X_test.reshape(10000, 28*28) / max_value
display(X_train.shape)
display(X_test.shape)
Visualizzazione di un esempio contenuto nel dataset
plt.imshow(X_train[12].reshape([28, 28]), cmap='gray')
plt.axis('off')
display(y_train[12])
One-hot encoding delle classi di target
# Trova il numero delle classi di target
num_classes = len(set(y_train))
y_train_dummy = to_categorical(y_train, num_classes)
y_test_dummy = to_categorical(y_test, num_classes)
print("Numero classi:", num_classes)
display(y_train_dummy.shape)
display(y_test_dummy.shape)
# Crea un dataframe con le codifiche
dummies = pd.DataFrame(np.column_stack([y_train, y_train_dummy]), columns=["number",
"0", "1", "2", "3", "4",
"5", "6", "7", "8", "9"]).drop_duplicates().set_index("number")
dummies.sort_index(inplace=True)
dummies
Creazione della rete neurale
In questa sezione verrà creata l'architettura della rete neurale. Si tratta di una rete con 3 strati nascosti, rispettivamente di 512, 256 e 128 nodi. Ognuno dei 3 strati utilizzerà la ReLu come funzione di attivazione mentre lo strato di output, trattandosi di un problema di classificazione multipla, utilizzerà la funzione SoftMax.
per ridurre il rischio di overfitting, verranno aggiunti 3 strati di dropout che interesseranno il 50% dei nodi e una regolarizzazione l2 il cui parametro