Tutorial sulla rete neurale artificiale con esempi di ANN TensorFlow
Cos'รจ la rete neurale artificiale?
An Rete neurale artificiale (ANN) รจ un sistema informatico ispirato alle reti neurali biologiche per la creazione di cervelli artificiali basati sull'insieme di unitร connesse chiamate neuroni artificiali. ร progettato per analizzare ed elaborare le informazioni come esseri umani. La rete neurale artificiale ha capacitร di autoapprendimento per produrre risultati migliori man mano che sono disponibili piรน dati.

Una Rete Neurale Artificiale (ANN) รจ composta da quattro oggetti principali:
- Livelli: tutto l'apprendimento avviene a strati. Ci sono 3 livelli 1) Ingresso 2) Nascosto e 3) Uscita
- Caratteristica ed etichetta: dati in ingresso alla rete (funzionalitร ) e output dalla rete (etichette)
- Funzione di perdita: Metrica utilizzata per stimare le prestazioni della fase di apprendimento
- Optimizer: Migliorare l'apprendimento aggiornando la conoscenza in rete
Una rete neurale prenderร i dati di input e li inserirร in un insieme di livelli. La rete deve valutare le proprie prestazioni con una funzione di perdita. La funzione di perdita dร alla rete un'idea del percorso che deve intraprendere prima di impadronirsi della conoscenza. La rete deve migliorare le proprie conoscenze con l'aiuto di un ottimizzatore.
Se dai un'occhiata alla figura sopra, capirai il meccanismo sottostante.
Il programma prende alcuni valori di input e li inserisce in due livelli completamente connessi. Immagina di avere un problema di matematica, la prima cosa che fai รจ leggere il capitolo corrispondente per risolvere il problema. Applichi le tue nuove conoscenze per risolvere il problema. C'รจ un'alta probabilitร che non otterrai un punteggio molto buono. Per una rete รจ lo stesso. La prima volta che vede i dati e fa una previsione, questa non corrisponderร perfettamente ai dati effettivi.
Per migliorare la propria conoscenza, la rete utilizza un ottimizzatore. Nella nostra analogia, un ottimizzatore puรฒ essere pensato come se rileggesse il capitolo. Ottieni nuove intuizioni/lezioni leggendo di nuovo. Allo stesso modo, la rete utilizza lโottimizzatore, aggiorna le proprie conoscenze e testa le nuove conoscenze per verificare quanto ha ancora bisogno di imparare. Il programma ripeterร questo passaggio finchรฉ non avrร l'errore piรน basso possibile.
Nella nostra analogia del problema di matematica, significa che leggi il capitolo del libro di testo molte volte finchรฉ non comprendi a fondo il contenuto del corso. Anche dopo aver letto piรน volte, se continui a commettere errori, significa che hai raggiunto la capacitร di conoscenza con il materiale attuale. Devi usare un libro di testo diverso o testare un metodo diverso per migliorare il tuo punteggio. Per una rete neurale, รจ lo stesso processo. Se l'errore รจ lontano dal 100%, ma la curva รจ piatta, significa che con l'architettura attuale; non puรฒ imparare nient'altro. La rete deve essere ottimizzata meglio per migliorare la conoscenza.
Rete neurale Architectura
La rete neurale artificiale Archila struttura รจ composta dai seguenti componenti:
- Livelli
- Funzione di attivazione
- Funzione di perdita
- Optimizer
Livelli
Uno strato รจ dove avviene tutto lโapprendimento. All'interno di uno strato ci sono una quantitร infinita di pesi (neuroni). Una tipica rete neurale viene spesso elaborata da strati densamente connessi (chiamati anche strati completamente connessi). Significa che tutti gli ingressi sono collegati all'uscita.
Una tipica rete neurale prende un vettore di input e uno scalare che contiene le etichette. La configurazione piรน comoda รจ una classificazione binaria con solo due classi: 0 e 1.
La rete prende un input, lo invia a tutti i nodi collegati e calcola il segnale con an attivazione funzione.

La figura sopra traccia questa idea. Il primo livello contiene i valori di input, mentre il secondo livello, chiamato livello nascosto, riceve l'input ponderato dal livello precedente
- Il primo nodo sono i valori di input
- Il neurone รจ scomposto nella parte di input e nella funzione di attivazione. La parte sinistra riceve tutto l'input dal livello precedente. La parte destra รจ la somma degli input che passano in una funzione di attivazione.
- Valore di output calcolato dai livelli nascosti e utilizzato per effettuare una previsione. Per la classificazione, รจ uguale al numero di classe. Per la regressione viene previsto un solo valore.
Funzione di attivazione
La funzione di attivazione di un nodo definisce l'output dato un insieme di input. ร necessaria una funzione di attivazione per consentire alla rete di apprendere il modello non lineare. Una funzione di attivazione comune รจ a Relu, Unitร lineare rettificata. La funzione fornisce uno zero per tutti i valori negativi.
Le altre funzioni di attivazione sono:
- Lineare a tratti
- sigmoid
- Tan
- Relu che perde
La decisione fondamentale da prendere quando si costruisce una rete neurale รจ:
- Quanti strati nella rete neurale
- Quante unitร nascoste per ogni livello
Una rete neurale con molti livelli e unitร nascoste puรฒ apprendere una rappresentazione complessa dei dati, ma ciรฒ rende i calcoli della rete molto costosi.
Funzione di perdita
Dopo aver definito gli strati nascosti e la funzione di attivazione, รจ necessario specificare la funzione di perdita e l'ottimizzatore.
Per la classificazione binaria, รจ pratica comune utilizzare una funzione di perdita di entropia incrociata binaria. Nella regressione lineare si utilizza l'errore quadratico medio.
La funzione di perdita รจ una metrica importante per stimare le prestazioni dell'ottimizzatore. Durante la formazione, questa metrica verrร ridotta al minimo. ร necessario selezionare attentamente questa quantitร a seconda del tipo di problema che si sta affrontando.
Optimizer
La funzione di perdita รจ una misura della performance del modello. L'ottimizzatore aiuterร a migliorare i pesi della rete per diminuire la perdita. Sono disponibili diversi ottimizzatori, ma il piรน comune รจ lo Stochastic Gradient Descent.
Gli ottimizzatori convenzionali sono:
- Momentum ottimizzazione,
- Gradiente accelerato di Nesterov,
- AdaGrad,
- Ottimizzazione di Adamo
Limitazioni della rete neurale
Di seguito sono riportate le limitazioni della rete neurale:
sovradattamento
Un problema comune con la rete neurale complessa รจ la difficoltร nel generalizzare dati mai visti. Una rete neurale con molti pesi puรฒ identificare molto bene dettagli specifici nel train set, ma spesso porta a un overfitting. Se i dati sono sbilanciati all'interno dei gruppi (ad esempio, non ci sono abbastanza dati disponibili in alcuni gruppi), la rete imparerร molto bene durante l'addestramento, ma non avrร la capacitร di generalizzare tale schema a dati mai visti prima.
Nellโapprendimento automatico esiste un compromesso tra ottimizzazione e generalizzazione.
Ottimizzare un modello richiede di trovare i parametri migliori che minimizzino la perdita del set di addestramento.
La generalizzazione, tuttavia, indica come si comporta il modello per i dati invisibili.
Per impedire al modello di catturare dettagli specifici o pattern indesiderati dei dati di training, puoi usare tecniche diverse. Il metodo migliore รจ avere un set di dati bilanciato con una quantitร di dati sufficiente. L'arte di ridurre l'overfitting รจ chiamata regolarizzazione. Rivediamo alcune tecniche convenzionali.
Dimensioni della rete
Una rete neurale con troppi strati e unitร nascoste รจ notoriamente molto sofisticata. Un modo semplice per ridurre la complessitร del modello รจ ridurne le dimensioni. Non esiste una best practice per definire il numero di strati. Devi iniziare con una piccola quantitร di strato e aumentarne le dimensioni finchรฉ non trovi il modello sovradimensionato.
Regolarizzazione del peso
Una tecnica standard per prevenire lโoverfitting consiste nellโaggiungere vincoli ai pesi della rete. Il vincolo impone alla dimensione della rete di assumere solo valori piccoli. Il vincolo viene aggiunto alla funzione di perdita dell'errore. Esistono due tipi di regolarizzazione:
L1: Lazo: Il costo รจ proporzionale al valore assoluto dei coefficienti di peso
L2: Colmo: Il costo รจ proporzionale al quadrato del valore dei coefficienti di peso
dropout
Il dropout รจ una tecnica strana ma utile. Una rete con dropout significa che alcuni pesi verranno impostati casualmente su zero. Immagina di avere una serie di pesi [0.1, 1.7, 0.7, -0.9]. Se la rete neurale ha un dropout, diventerร [0.1, 0, 0, -0.9] con 0 distribuito in modo casuale. Il parametro che controlla il dropout รจ il tasso di dropout. Il tasso definisce quanti pesi devono essere impostati su zero. Avere un tasso compreso tra 0.2 e 0.5 รจ comune.
Esempio di rete neurale in TensorFlow
Vediamo un esempio di rete neurale artificiale in azione su come funziona una rete neurale per un tipico problema di classificazione. Ci sono due input, x1 e x2 con un valore casuale. L'output รจ una classe binaria. L'obiettivo รจ classificare l'etichetta in base alle due caratteristiche. Per svolgere questo compito, l'architettura della rete neurale รจ definita come segue:
- Due strati nascosti
- Il primo strato ha quattro neuroni completamente connessi
- Il secondo strato ha due neuroni completamente connessi
- La funzione di attivazione รจ un Relu
- Aggiungi una regolarizzazione L2 con un tasso di apprendimento di 0.003
La rete ottimizzerร i pesi durante 180 epoche con una dimensione del batch di 10. Nel video di esempio della rete neurale artificiale qui sotto, puoi vedere come si evolvono i pesi e come la rete migliora la mappa di classificazione.ping.
Innanzitutto la rete assegna valori casuali a tutti i pesi.
- Con i pesi casuali, cioรจ senza ottimizzazione, la perdita di output รจ 0.453. L'immagine sotto rappresenta la rete con diversi colori.
- In generale, il colore arancione rappresenta i valori negativi mentre i colori blu mostrano i valori positivi.
- I punti dati hanno la stessa rappresentazione; quelle blu sono le etichette positive e quella arancione quelle negative.
All'interno del secondo strato nascosto, le linee sono colorate seguendo il segno dei pesi. Le linee arancioni assegnano pesi negativi e quella blu pesi positivi
Come puoi vedere, nella mappa di outputpingLa rete sta commettendo parecchi errori. Vediamo come si comporta la rete dopo l'ottimizzazione.
L'immagine dell'esempio ANN di seguito illustra i risultati della rete ottimizzata. Prima di tutto, noti che la rete ha imparato con successo come classificare il punto dati. Puoi vedere dall'immagine prima; il peso iniziale era -0.43 mentre dopo l'ottimizzazione risulta in un peso di -0.95.
L'idea puรฒ essere generalizzata per reti con piรน strati e neuroni nascosti. Puoi giocare in link.
Come addestrare una rete neurale con TensorFlow
Ecco il processo passo passo su come addestrare una rete neurale con TensorFlow ANN utilizzando lo stimatore dell'API DNNClassifier.
Utilizzeremo il set di dati MNIST per addestrare la tua prima rete neurale. Addestrare una rete neurale con TensorFlow non รจ molto complicato La fase di preelaborazione รจ esattamente la stessa dei tutorial precedenti. Procederai come segue:
- Passaggio 1: importa i dati
- Passaggio 2: trasformare i dati
- Passaggio 3: costruire il tensore
- Passaggio 4: costruisci il modello
- Passaggio 5: addestrare e valutare il modello
- Passaggio 6: migliorare il modello
Passaggio 1) Importa i dati
Prima di tutto, devi importare la libreria necessaria. Puoi importare il set di dati MNIST utilizzando scikit learn come mostrato nell'esempio di rete neurale TensorFlow di seguito.
Il set di dati MNIST รจ il set di dati comunemente utilizzato per testare nuove tecniche o algoritmi. Questo set di dati รจ una raccolta di immagini di 28ร28 pixel con una cifra scritta a mano da 0 a 9. Attualmente, l'errore piรน basso nel test รจ dello 0.27% con un comitato di 7 reti neurali convoluzionali.
import numpy as np import tensorflow as tf np.random.seed(1337)
Puoi scaricare scikit learn temporaneamente a questo indirizzo. Copia e incolla il set di dati in una comoda cartella. Per importare i dati in Python, puoi utilizzare fetch_mldata da scikit learn. Incolla il percorso del file all'interno di fetch_mldata per recuperare i dati.
from sklearn.datasets import fetch_mldata
mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original')
print(mnist.data.shape)
print(mnist.target.shape)
Successivamente, importi i dati e ottieni la forma di entrambi i set di dati.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )
Passaggio 2) Trasformare i dati
Nell'esercitazione precedente hai appreso che รจ necessario trasformare i dati per limitare l'effetto dei valori anomali. In questo tutorial sulle reti neurali trasformerai i dati utilizzando lo scaler min-max. La formula รจ:
(X-min_x)/(max_x - min_x)
Scikit apprende che ha giร una funzione per questo: MinMaxScaler()
## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
Passaggio 3) Costruire il tensore
Ora hai familiaritร con il modo di creare tensore in Tensorflow. ร possibile convertire il set di treni in una colonna numerica.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Passaggio 4) Costruisci il modello
L'architettura della rete neurale contiene 2 strati nascosti con 300 unitร per il primo strato e 100 unitร per il secondo. Utilizziamo questi valori in base alla nostra esperienza. Puoi regolare questi valori e vedere come influenzano l'accuratezza della rete.
Per costruire il modello, si utilizza lo stimatore DNNClassifier. Puoi aggiungere il numero di livelli agli argomenti feature_columns. ร necessario impostare il numero di classi su 10 poichรฉ sono presenti dieci classi nel set di formazione. Hai giร familiaritร con la sintassi dell'oggetto stimatore. Gli argomenti caratteristiche colonne, numero di classi e model_dir sono esattamente gli stessi del tutorial precedente. Il nuovo argomento hidden_unit controlla il numero di strati e quanti nodi connettere alla rete neurale. Nel codice seguente ci sono due livelli nascosti con il primo che collega 300 nodi e il secondo con 100 nodi.
Per costruire lo stimatore, utilizzare tf.estimator.DNNClassifier con i seguenti parametri:
- feature_columns: definisce le colonne da utilizzare nella rete
- hidden_units: definisce il numero di neuroni nascosti
- n_classes: definisce il numero di classi da prevedere
- model_dir: definisce il percorso di TensorBoard
estimator = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
n_classes=10,
model_dir = '/train/DNN')
Passaggio 5) Addestrare e valutare il modello
ร possibile utilizzare il metodo Numpy per addestrare il modello e valutarlo
# Train the estimator
train_input = tf.estimator.inputs.numpy_input_fn(
x={"x": X_train_scaled},
y=y_train,
batch_size=50,
shuffle=False,
num_epochs=None)
estimator.train(input_fn = train_input,steps=1000)
eval_input = tf.estimator.inputs.numpy_input_fn(
x={"x": X_test_scaled},
y=y_test,
shuffle=False,
batch_size=X_test_scaled.shape[0],
num_epochs=1)
estimator.evaluate(eval_input,steps=None)
Produzione:
{'accuracy': 0.9637143,
'average_loss': 0.12014342,
'loss': 1682.0079,
'global_step': 1000}
L'architettura attuale consente di ottenere una precisione del set di valutazione pari al 96 percento.
Passaggio 6) Migliorare il modello
Puoi provare a migliorare il modello aggiungendo parametri di regolarizzazione.
Utilizzeremo un ottimizzatore Adam con un tasso di dropout di 0.3, L1 di X e L2 di y. In TensorFlow Neural Network, puoi controllare l'ottimizzatore utilizzando l'object train seguito dal nome dell'ottimizzatore. TensorFlow รจ un'API integrata per l'ottimizzatore Proximal AdaGrad.
Per aggiungere la regolarizzazione alla rete neurale profonda, puoi utilizzare tf.train.ProximalAdagradOptimizer con il seguente parametro
- Tasso di apprendimento: tasso_diapprendimento
- Regolarizzazione L1: l1_regolarizzazione_forza
- Regolarizzazione L2: l2_regolarizzazione_forza
estimator_imp = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
dropout=0.3,
n_classes = 10,
optimizer=tf.train.ProximalAdagradOptimizer(
learning_rate=0.01,
l1_regularization_strength=0.01,
l2_regularization_strength=0.01
),
model_dir = '/train/DNN1')
estimator_imp.train(input_fn = train_input,steps=1000)
estimator_imp.evaluate(eval_input,steps=None)
Produzione:
{'accuracy': 0.95057142,
'average_loss': 0.17318928,
'loss': 2424.6499,
'global_step': 2000}
I valori scelti per ridurre l'overfitting non hanno migliorato l'accuratezza del modello. Il tuo primo modello aveva una precisione del 96% mentre il modello con regolarizzatore L2 ha una precisione del 95%. Puoi provare con valori diversi e vedere come influisce sulla precisione.
Sintesi
In questo tutorial imparerai come costruire una rete neurale. Una rete neurale richiede:
- Numero di livelli nascosti
- Numero di nodi completamente connessi
- Funzione di attivazione
- Optimizer
- Numero di classi
In TensorFlow ANN, puoi addestrare una rete neurale per problemi di classificazione con:
- tf.estimator.DNNClassifier
Lo stimatore richiede di specificare:
- colonne_funzionalitร =colonne_funzionalitร ,
- unitร _nascoste=[300, 100]
- n_classi=10
- dir_modello
ร possibile migliorare il modello utilizzando diversi ottimizzatori. In questo tutorial hai imparato come utilizzare l'ottimizzatore Adam Grad con una velocitร di apprendimento e aggiungere un controllo per evitare l'adattamento eccessivo.




