Tutorial de rețea neuronală artificială cu exemple TensorFlow ANN
Ce este rețeaua neuronală artificială?
An Retele neuronale artificiale (ANN) este un sistem informatic inspirat din rețelele neuronale biologice pentru crearea creierului artificial bazat pe colecția de unități conectate numite neuroni artificiali. Este conceput pentru a analiza și procesa informații ca oameni. Rețeaua neuronală artificială are capacități de auto-învățare pentru a produce rezultate mai bune pe măsură ce sunt disponibile mai multe date.
O rețea neuronală artificială (ANN) este compusă din patru obiecte principale:
- Straturi: toată învățarea are loc în straturi. Există 3 straturi 1) Intrare 2) Ascunse și 3) Ieșire
- Caracteristică și etichetă: date de intrare în rețea (funcții) și ieșire din rețea (etichete)
- Funcția de pierdere: Metrica utilizată pentru estimarea performanței fazei de învățare
- Instrumentul de optimizare a: Îmbunătățiți învățarea prin actualizarea cunoștințelor în rețea
O rețea neuronală va prelua datele de intrare și le va împinge într-un ansamblu de straturi. Rețeaua trebuie să își evalueze performanța cu o funcție de pierdere. Funcția de pierdere oferă rețelei o idee despre calea pe care trebuie să o urmeze înainte de a stăpâni cunoștințele. Rețeaua trebuie să-și îmbunătățească cunoștințele cu ajutorul unui optimizator.
Dacă aruncați o privire la figura de mai sus, veți înțelege mecanismul de bază.
Programul preia niște valori de intrare și le împinge în două straturi complet conectate. Imaginați-vă că aveți o problemă de matematică, primul lucru pe care îl faceți este să citiți capitolul corespunzător pentru a rezolva problema. Aplicați noile cunoștințe pentru a rezolva problema. Există șanse mari să nu obții un scor foarte bun. La fel este și pentru o rețea. Prima dată când vede datele și face o predicție, nu se va potrivi perfect cu datele reale.
Pentru a-și îmbunătăți cunoștințele, rețeaua folosește un optimizator. În analogia noastră, un optimizator poate fi considerat ca recitind capitolul. Obțineți noi perspective/lecție citind din nou. În mod similar, rețeaua folosește optimizatorul, își actualizează cunoștințele și își testează noile cunoștințe pentru a verifica cât mai trebuie să învețe. Programul va repeta acest pas până când produce cea mai mică eroare posibilă.
În analogia problemelor noastre de matematică, înseamnă că citiți capitolul manual de mai multe ori până când înțelegeți bine conținutul cursului. Chiar și după ce ați citit de mai multe ori, dacă continuați să faceți o eroare, înseamnă că ați atins capacitatea de cunoaștere cu materialul curent. Trebuie să utilizați un manual diferit sau să testați o metodă diferită pentru a vă îmbunătăți scorul. Pentru o rețea neuronală, este același proces. Dacă eroarea este departe de 100%, dar curba este plată, înseamnă cu arhitectura curentă; nu poate invata altceva. Rețeaua trebuie să fie mai bine optimizată pentru a îmbunătăți cunoștințele.
Retea neurala Architectură
Rețeaua neuronală artificială Architectura constă din următoarele componente:
- Straturi
- Funcția de activare
- Funcția de pierdere
- Instrumentul de optimizare a
Straturi
Un strat este locul în care are loc toată învățarea. În interiorul unui strat, există o cantitate infinită de greutăți (neuroni). O rețea neuronală tipică este adesea procesată de straturi dens conectate (numite și straturi complet conectate). Înseamnă că toate intrările sunt conectate la ieșire.
O rețea neuronală tipică ia un vector de intrare și un scalar care conține etichetele. Cea mai confortabilă configurație este o clasificare binară cu doar două clase: 0 și 1.
Rețeaua preia o intrare, o trimite la toate nodurile conectate și calculează semnalul cu un activare Funcția.
Figura de mai sus prezintă această idee. Primul strat reprezintă valorile de intrare pentru al doilea strat, numit strat ascuns, primește intrarea ponderată de la stratul anterior
- Primul nod sunt valorile de intrare
- Neuronul este descompus în partea de intrare și funcția de activare. Partea din stânga primește toată intrarea de la stratul anterior. Partea dreaptă este suma trecerilor de intrare într-o funcție de activare.
- Valoarea de ieșire calculată din straturile ascunse și folosită pentru a face o predicție. Pentru clasificare, este egal cu numărul de clasă. Pentru regresie, este prezisă o singură valoare.
Funcția de activare
Funcția de activare a unui nod definește ieșirea având în vedere un set de intrări. Aveți nevoie de o funcție de activare pentru a permite rețelei să învețe modelul neliniar. O funcție de activare comună este a Relu, Unitate liniară rectificată. Funcția dă un zero pentru toate valorile negative.
Celelalte funcții de activare sunt:
- Linear pe bucăți
- sigmoid
- Tanh
- Leaky Relu
Decizia critică de luat la construirea unei rețele neuronale este:
- Câte straturi din rețeaua neuronală
- Câte unități ascunse pentru fiecare strat
Rețeaua neuronală cu o mulțime de straturi și unități ascunse poate învăța o reprezentare complexă a datelor, dar face ca calculul rețelei să fie foarte costisitor.
Funcția de pierdere
După ce ați definit straturile ascunse și funcția de activare, trebuie să specificați funcția de pierdere și optimizatorul.
Pentru clasificarea binară, este o practică obișnuită să se utilizeze o funcție de pierdere a entropiei încrucișate binare. În regresia liniară, utilizați eroarea pătratică medie.
Funcția de pierdere este o măsură importantă pentru estimarea performanței optimizatorului. În timpul antrenamentului, această măsurătoare va fi redusă la minimum. Trebuie să selectați această cantitate cu atenție în funcție de tipul de problemă cu care vă confruntați.
Instrumentul de optimizare a
Funcția de pierdere este o măsură a performanței modelului. Optimizatorul va ajuta la îmbunătățirea greutăților rețelei pentru a reduce pierderea. Există diferite optimizatoare disponibile, dar cel mai comun este Coborârea Gradientului Stochastic.
Optimizatorii convenționali sunt:
- Momentum optimizare,
- Gradient accelerat Nesterov,
- AdaGrad,
- optimizare Adam
Limitările rețelei neuronale
Următoarele sunt limitările rețelei neuronale:
Suprapunere
O problemă comună cu rețeaua neuronală complexă este dificultățile în generalizarea datelor nevăzute. O rețea neuronală cu o mulțime de greutăți poate identifica foarte bine detaliile specifice din garnitura de tren, dar duce adesea la supraadaptare. Dacă datele sunt dezechilibrate în cadrul grupurilor (adică, nu sunt suficiente date disponibile în unele grupuri), rețeaua va învăța foarte bine în timpul antrenamentului, dar nu va avea capacitatea de a generaliza un astfel de model la date nevăzute până acum.
Există un compromis în învățarea automată între optimizare și generalizare.
Optimizarea unui model necesită găsirea celor mai buni parametri care reduc la minimum pierderea setului de antrenament.
Generalizarea, totuși, spune cum se comportă modelul pentru datele nevăzute.
Pentru a împiedica modelul să capteze detalii specifice sau modele nedorite ale datelor de antrenament, puteți utiliza diferite tehnici. Cea mai bună metodă este de a avea un set de date echilibrat cu o cantitate suficientă de date. Arta reducerii supraajustării se numește regularizare. Să trecem în revistă câteva tehnici convenționale.
Dimensiunea rețelei
Se știe că o rețea neuronală cu prea multe straturi și unități ascunse este extrem de sofisticată. O modalitate simplă de a reduce complexitatea modelului este reducerea dimensiunii acestuia. Nu există o bună practică pentru a defini numărul de straturi. Trebuie să începeți cu o cantitate mică de strat și să-i creșteți dimensiunea până când găsiți modelul supraadaptat.
Regularizarea greutății
O tehnică standard pentru a preveni supraadaptarea este adăugarea de constrângeri la greutățile rețelei. Constrângerea forțează dimensiunea rețelei să ia doar valori mici. Constrângerea se adaugă la funcția de pierdere a erorii. Există două tipuri de regularizare:
L1: Lasso: Costul este proporțional cu valoarea absolută a coeficienților de greutate
L2: Ridge: Costul este proporțional cu pătratul valorii coeficienților de greutate
Renunța
Abandonul este o tehnică ciudată, dar utilă. O rețea cu abandon înseamnă că unele ponderi vor fi setate aleatoriu la zero. Imaginați-vă că aveți o serie de greutăți [0.1, 1.7, 0.7, -0.9]. Dacă rețeaua neuronală are un abandon, acesta va deveni [0.1, 0, 0, -0.9] cu 0 distribuit aleatoriu. Parametrul care controlează abandonul este rata de abandon. Rata definește câte greutăți trebuie setate la zero. A avea o rată între 0.2 și 0.5 este comună.
Exemplu de rețea neuronală în TensorFlow
Să vedem un exemplu de rețea neuronală artificială în acțiune despre cum funcționează o rețea neuronală pentru o problemă tipică de clasificare. Există două intrări, x1 și x2 cu o valoare aleatorie. Ieșirea este o clasă binară. Obiectivul este de a clasifica eticheta pe baza celor două caracteristici. Pentru a îndeplini această sarcină, arhitectura rețelei neuronale este definită după cum urmează:
- Două straturi ascunse
- Primul strat are patru neuroni complet conectați
- Al doilea strat are doi neuroni complet conectați
- Funcția de activare este o Relu
- Adăugați o regularizare L2 cu o rată de învățare de 0.003
Rețeaua va optimiza greutatea pe parcursul a 180 de epoci cu o dimensiune a lotului de 10. În exemplul video ANN de mai jos, puteți vedea cum evoluează ponderile și cum rețeaua îmbunătățește maparea clasificării.
În primul rând, rețeaua atribuie valori aleatorii tuturor ponderilor.
- Cu ponderi aleatorii, adică fără optimizare, pierderea de ieșire este de 0.453. Imaginea de mai jos reprezintă rețeaua cu diferite culori.
- În general, culoarea portocalie reprezintă valori negative, în timp ce culorile albastre arată valorile pozitive.
- Punctele de date au aceeași reprezentare; cele albastre sunt etichetele pozitive iar cea portocalie etichetele negative.
În interiorul celui de-al doilea strat ascuns, liniile sunt colorate după semnul greutăților. Liniile portocalii atribuie ponderi negative, iar cele albastre ponderi pozitive
După cum puteți vedea, în maparea ieșirii, rețeaua face destul de multe greșeli. Să vedem cum se comportă rețeaua după optimizare.
Imaginea exemplului ANN de mai jos prezintă rezultatele rețelei optimizate. În primul rând, observați că rețeaua a învățat cu succes cum să clasifice punctul de date. Puteți vedea din imaginea de dinainte; ponderea inițială a fost -0.43 în timp ce după optimizare rezultă o pondere de -0.95.
Ideea poate fi generalizată pentru rețele cu mai multe straturi și neuroni ascunși. Vă puteți juca în legătură.
Cum să antrenezi o rețea neuronală cu TensorFlow
Iată procesul pas cu pas despre cum să antrenezi o rețea neuronală cu TensorFlow ANN folosind estimatorul DNNClassifier al API.
Vom folosi setul de date MNIST pentru a vă instrui prima rețea neuronală. Antrenarea unei rețele neuronale cu TensorFlow nu este foarte complicat. Pasul de preprocesare arată exact la fel ca în tutorialele anterioare. Veți proceda după cum urmează:
- Pasul 1: importați datele
- Pasul 2: Transformați datele
- Pasul 3: Construiți tensorul
- Pasul 4: Construiți modelul
- Pasul 5: Antrenați și evaluați modelul
- Pasul 6: Îmbunătățiți modelul
Pasul 1) Importați datele
În primul rând, trebuie să importați biblioteca necesară. Puteți importa setul de date MNIST folosind scikit Learn, așa cum se arată în exemplul de rețea neuronală TensorFlow de mai jos.
Setul de date MNIST este setul de date utilizat în mod obișnuit pentru a testa noi tehnici sau algoritmi. Acest set de date este o colecție de imagini de 28×28 pixeli cu o cifră scrisă de mână de la 0 la 9. În prezent, cea mai mică eroare la test este de 0.27% cu un comitet de 7 rețele neuronale convoluționale.
import numpy as np import tensorflow as tf np.random.seed(1337)
Puteți descărca temporar scikit Learn la această adresă. Copiați și inserați setul de date într-un folder convenabil. Pentru a importa datele în python, puteți utiliza fetch_mldata de la scikit Learn. Lipiți calea fișierului în interiorul fetch_mldata pentru a prelua datele.
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)
După aceea, importați datele și obțineți forma ambelor seturi de date.
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 )
Pasul 2) Transformați datele
În tutorialul anterior, ați învățat că trebuie să transformați datele pentru a limita efectul valorilor aberante. În acest tutorial privind rețelele neuronale, veți transforma datele folosind scalatorul min-max. Formula este:
(X-min_x)/(max_x - min_x)
Scikit învață că are deja o funcție pentru asta: 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))
Pasul 3) Construiți tensorul
Acum sunteți familiarizat cu modul de a crea tensor în Tensorflow. Puteți converti setul de tren într-o coloană numerică.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Pasul 4) Construiți modelul
Arhitectura rețelei neuronale conține 2 straturi ascunse cu 300 de unități pentru primul strat și 100 de unități pentru al doilea. Folosim aceste valori pe baza propriei noastre experiențe. Puteți regla aceste valori și puteți vedea cum afectează acuratețea rețelei.
Pentru a construi modelul, utilizați estimatorul DNNClassifier. Puteți adăuga numărul de straturi la argumentele feature_columns. Trebuie să setați numărul de clase la 10, deoarece există zece clase în setul de antrenament. Sunteți deja familiarizat cu sintaxa obiectului estimator. Argumentele caracteristici coloane, numărul de clase și model_dir sunt exact aceleași ca în tutorialul anterior. Noul argument hidden_unit controlează numărul de straturi și câte noduri să se conecteze la rețeaua neuronală. În codul de mai jos, există două straturi ascunse, unul care conectează 300 de noduri și al doilea cu 100 de noduri.
Pentru a construi estimatorul, utilizați tf.estimator.DNNClassifier cu următorii parametri:
- feature_columns: definiți coloanele de utilizat în rețea
- hidden_units: Definiți numărul de neuroni ascunși
- n_classes: Definiți numărul de clase de estimat
- model_dir: Definiți calea TensorBoard
estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], n_classes=10, model_dir = '/train/DNN')
Pasul 5) Antrenează și evaluează modelul
Puteți folosi metoda numpy pentru a antrena modelul și a-l evalua
# 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)
ieșire:
{'accuracy': 0.9637143, 'average_loss': 0.12014342, 'loss': 1682.0079, 'global_step': 1000}
Arhitectura actuală duce la o acuratețe a setului de evaluare de 96 la sută.
Pasul 6) Îmbunătățiți modelul
Puteți încerca să îmbunătățiți modelul adăugând parametri de regularizare.
Vom folosi un optimizator Adam cu o rată de abandon de 0.3, L1 de X și L2 de y. În TensorFlow Neural Network, puteți controla optimizatorul utilizând trenul de obiecte care urmează după numele optimizatorului. TensorFlow este un API încorporat pentru optimizatorul Proximal AdaGrad.
Pentru a adăuga regularizare rețelei neuronale profunde, puteți utiliza tf.train.ProximalAdagradOptimizer cu următorul parametru
- Rata de învățare: rata_învățare
- L1 regularizare: l1_regularization_strength
- L2 regularizare: l2_regularization_strength
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)
ieșire:
{'accuracy': 0.95057142, 'average_loss': 0.17318928, 'loss': 2424.6499, 'global_step': 2000}
Valorile alese pentru a reduce supraajustarea nu au îmbunătățit acuratețea modelului. Primul tău model a avut o precizie de 96%, în timp ce modelul cu regulator L2 are o precizie de 95%. Puteți încerca cu diferite valori și puteți vedea cum afectează precizia.
Rezumat
În acest tutorial, înveți cum să construiești o rețea neuronală. O rețea neuronală necesită:
- Numărul de straturi ascunse
- Numărul de noduri complet conectate
- Funcția de activare
- Instrumentul de optimizare a
- Numărul de clase
În TensorFlow ANN, puteți antrena o rețea neuronală pentru probleme de clasificare cu:
- tf.estimator.DNNClassifier
Estimatorul necesită să specifice:
- feature_columns=feature_columns,
- hidden_units=[300, 100]
- n_clase=10
- model_dir
Puteți îmbunătăți modelul utilizând diferiți optimizatori. În acest tutorial, ați învățat cum să utilizați optimizatorul Adam Grad cu o rată de învățare și să adăugați un control pentru a preveni supraadaptarea.