Vai al contenuto

Applicazioni pratiche di deep learning/Esempio di rete neurale

Wikibooks, manuali e libri di testo liberi.

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]]