Applicazioni pratiche di deep learning/Esempio di rete neurale
Una rete neurale artificiale è un modello ispirato al funzionamento del cervello umano, progettato per apprendere relazioni complesse nei dati. È composta da nodi (neuroni) organizzati in:
- Strato di input o Input layer → riceve i dati (ha dimensioni pari al numero di features)
- Strati nascosti o Hidden layers → elaborano le informazioni
- Strato di output o Output layer → produce la previsione per classificazione o regressione
Conviene usare le reti neurali:
- Quando i dati sono complessi e non lineari
- Per immagini, testo, audio, serie temporali
- Problemi di classificazione o regressione complessi
Esempio pratico in Python e TensorFlow
[modifica | modifica sorgente]Il dataset MNIST contiene immagini di cifre scritte a mano (0-9). In particolare il training set ne contiene 60.000 , mentre il testing set 10.000. Ciascuna immagine ha dimensione 28 × 28 pixel. Si vuole addestrare un modello per riconoscere la cifra scritta a mano. Si incolla su colab il seguente codice e si esegue ottenendo un'accuracy sul testing set del 98%, quindi questa rete neurale è un ottimo classificatore:
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical
# Caricamento dataset e creazione training e testing set dal dataset mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# Normalizzazione
X_train = X_train / 255.0
X_test = X_test / 255.0
# One-hot encoding delle etichette (ogni cifra viene trasformata in una variabile categorica per cui ad esempio 0 diventa [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] )
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. Creazione modello
model = Sequential([
Flatten(input_shape=(28, 28)), # trasforma ogni immagine 28×28 in un vettore di 784 elementi
Dense(128, activation='relu'), # strato nascosto con 128 neuroni
Dense(10, activation='softmax') # output per 10 classi
])
# 3. Compilazione
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 4. Addestramento
model.fit(X_train, y_train, epochs=5, batch_size=32, validation_split=0.1)
# 5. Valutazione
loss, accuracy = model.evaluate(X_test, y_test)
print(f"Accuracy sul test set: {accuracy:.2f}")
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz 11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Epoch 1/5 1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.8659 - loss: 0.4718 - val_accuracy: 0.9640 - val_loss: 0.1291 Epoch 2/5 1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 4ms/step - accuracy: 0.9610 - loss: 0.1339 - val_accuracy: 0.9738 - val_loss: 0.0966 Epoch 3/5 1688/1688 ━━━━━━━━━━━━━━━━━━━━ 7s 4ms/step - accuracy: 0.9750 - loss: 0.0851 - val_accuracy: 0.9728 - val_loss: 0.0904 Epoch 4/5 1688/1688 ━━━━━━━━━━━━━━━━━━━━ 9s 3ms/step - accuracy: 0.9811 - loss: 0.0636 - val_accuracy: 0.9748 - val_loss: 0.0862 Epoch 5/5 1688/1688 ━━━━━━━━━━━━━━━━━━━━ 10s 3ms/step - accuracy: 0.9865 - loss: 0.0444 - val_accuracy: 0.9805 - val_loss: 0.0724 313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - accuracy: 0.9738 - loss: 0.0818 Accuracy sul test set: 0.98
Previsione dal modello
[modifica | modifica sorgente]Volendo predire la cifra da 0 a 9 di un'immagine casuale nel testing set e visualizzarla il codice è il seguente:
import numpy as np
import matplotlib.pyplot as plt
# 3. Scegli un indice casuale dal test set
index = np.random.randint(0, len(X_test))
sample_image = X_test[index]
true_label = y_test[index]
# 4. Visualizza l'immagine
plt.imshow(sample_image, cmap='gray')
plt.title(f"Etichetta reale: {true_label}")
plt.axis('off')
plt.show()
# 5. Previsione
prediction = model.predict(sample_image.reshape(1, 28, 28))
predicted_label = np.argmax(prediction)
print(f"Etichetta reale: {true_label}")
print(f"Etichetta predetta: {predicted_label}")
print(f"Probabilità per ogni cifra: {prediction}")
Etichetta reale: [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] Etichetta predetta: 0 Probabilità per ogni cifra: [[9.9999917e-01 1.2990005e-09 9.1024539e-09 9.1231334e-10 8.6361738e-14 2.0957449e-08 8.5002222e-07 4.9891993e-09 3.4684886e-10 2.9637439e-08]]