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.

Rete neurale artificiale
Rete neurale artificiale

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.

Rete neurale Architectura
Rete neurale Architectura

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

  1. Il primo nodo sono i valori di input
  2. 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.
  3. 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.

Funzione di attivazione

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

Rete neurale in TensorFlow

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.

Rete neurale in TensorFlow

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.

Rete neurale in TensorFlow

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.

Riassumi questo post con: