Vodič za umjetne neuronske mreže (ANN) s TensorFlowom
⚡ Pametni sažetak
Umjetne neuronske mreže uče propuštanjem ulaznih podataka kroz povezane slojeve, bodovanjem rezultata funkcijom gubitka i ispravljanjem težina optimizatorom. Ovaj vodič gradi jednu u TensorFlowu i klasificira MNIST znamenke.
Što je umjetna neuronska mreža?
An Umjetna neuronska mreža (ANN) je računalni sustav inspiriran biološkim neuronskim mrežama za stvaranje umjetnih mozgova temeljen na skupu povezanih jedinica zvanih umjetni neuroni. Dizajniran je za analizu i obradu informacija na način na koji to čine ljudi. Umjetna neuronska mreža ima mogućnosti samoučenja kako bi proizvela bolje rezultate kako je dostupno više podataka.
Dijagram ispod tracjedan puni prolaz kroz takvu mrežu, od sirovog ulaza do optimizatora koji ispravlja težine.
Umjetna neuronska mreža (ANN) sastoji se od četiri glavna objekta:
- Slojeva: Svo učenje se odvija u slojevima. Postoje 3 sloja: 1) Ulazni, 2) Skriveni i 3) Izlazni.
- Značajka i oznaka: Ulazni podaci u mrežu (značajke) i izlazni podaci iz mreže (oznake)
- Funkcija gubitka: Metrika koja se koristi za procjenu uspješnosti faze učenja
- Optimizator: Poboljšajte učenje ažuriranjem znanja u mreži
Neuronska mreža uzima ulazne podatke i ubacuje ih u skup slojeva. Mreža zatim procjenjuje svoje performanse pomoću funkcije gubitka. Funkcija gubitka daje mreži ideju o putu kojim treba proći prije nego što savlada znanje. Mreža poboljšava to znanje uz pomoć optimizatora.
Ako pogledate gornju sliku, shvatit ćete temeljni mehanizam.
Program uzima neke ulazne vrijednosti i ubacuje ih u dva potpuno povezana sloja. Zamislite da imate matematički problem. Prvo što radite jest pročitati odgovarajuće poglavlje kako biste ga riješili. Zatim primjenjujete svoje novo znanje na problem. Postoji velika vjerojatnost da nećete postići baš dobar rezultat. Isto je i za mrežu: prvi put kada vidi podatke i napravi predviđanje, rezultat se neće savršeno podudarati sa stvarnim podacima.
Kako bi poboljšala svoje znanje, mreža koristi optimizator. U ovoj analogiji, optimizator se može smatrati ponovnim čitanjem poglavlja. Ponovnim čitanjem stječete nove uvide. Slično tome, mreža koristi optimizator, ažurira svoje znanje i testira to novo znanje kako bi provjerila koliko još treba naučiti. Program ponavlja ovaj korak sve dok ne napravi najmanju moguću pogrešku.
U analogiji s matematičkim problemom, to znači da poglavlje iz udžbenika čitate mnogo puta dok u potpunosti ne shvatite sadržaj tečaja. Čak i nakon višestrukog čitanja, ako nastavite griješiti, to znači da ste dosegli kapacitet znanja trenutnog gradiva. Morate koristiti drugi udžbenik ili testirati drugu metodu kako biste poboljšali svoj rezultat. Za neuronsku mrežu to je isti proces. Ako se pogreška prestane smanjivati, a krivulja gubitaka postane ravna, trenutna arhitektura ne može naučiti ništa drugo. Mreža mora biti bolje optimizirana kako bi se poboljšalo znanje.
Ta četiri objekta se izravno mapiraju na komponente koje konfigurirate prilikom dizajniranja mreže.
Živčana mreža Architektura
Arhitektura umjetne neuronske mreže sastoji se od sljedećih komponenti:
- Slojevi
- Aktivacijska funkcija
- Funkcija gubitka
- optimizaciju
Slojevi
Sloj je mjesto gdje se odvija svo učenje. Unutar sloja nalazi se proizvoljan broj neurona, od kojih svaki ima vlastite težine. Tipična neuronska mreža često se obrađuje gusto povezanim slojevima (također se nazivaju potpuno povezani slojevi). To znači da su svi ulazi povezani s izlazom.
Tipična neuronska mreža uzima vektor ulaza i skalar koji sadrži oznake. Najjednostavnija postavka je binarna klasifikacija sa samo dvije klase: 0 i 1.
Mreža prima ulaz, šalje ga svim povezanim čvorovima i izračunava signal s aktivacijskom funkcijom. Numerirani dijagram u nastavku prikazuje jedan čvor tako da možete zasebno vidjeti ponderiranu sumu i korak aktivacije.
Gornja slika prikazuje ovu ideju. Prvi sloj sadrži ulazne vrijednosti. Drugi sloj, nazvan skriveni sloj, prima ponderirani ulaz iz prethodnog sloja.
- Prvi čvor su ulazne vrijednosti.
- Neuron se rastavlja na ulazni dio i aktivacijsku funkciju. Lijevi dio prima sav ulaz iz prethodnog sloja. Desni dio je zbroj ulaza proslijeđenih aktivacijskoj funkciji.
- Izlazna vrijednost izračunata iz skrivenih slojeva i korištena za predviđanje. Za klasifikaciju je jednaka broju klasa. Za regresiju se predviđa samo jedna vrijednost.
Aktivacijska funkcija
Aktivacijska funkcija čvora definira izlaz na temelju skupa ulaza. Potrebna vam je aktivacijska funkcija koja će mreži omogućiti učenje nelinearnih uzoraka. Uobičajena aktivacijska funkcija je ReLU, ispravljena linearna jedinica. Funkcija daje nulu za sve negativne vrijednosti.
Ostale funkcije aktivacije su:
- Djelomično linearno
- sigmoidno
- Tanh
- Propušteni ReLU
Donji grafikon pokazuje zašto je ReLU tako opisan: krivulja je ravna na nuli za svaki negativni ulaz i nakon toga linearno raste.
Kritična odluka koju treba donijeti pri izgradnji neuronske mreže je:
- Koliko slojeva u neuronskoj mreži
- Koliko skrivenih jedinica za svaki sloj
Neuronske mreže s mnogo slojeva i skrivenih jedinica mogu naučiti složenu reprezentaciju podataka, ali čine izračune mreže vrlo skupima.
Funkcija gubitka
Nakon što ste definirali skrivene slojeve i funkciju aktivacije, trebate navesti funkciju gubitka i optimizator.
Za binarnu klasifikaciju uobičajena je praksa koristiti binarnu funkciju gubitka unakrsne entropije. Linearna regresija, koristite srednju kvadratnu pogrešku.
Funkcija gubitka važna je metrika za procjenu izvedbe optimizatora. Tijekom obuke ova metrika će biti minimizirana. Ovu količinu morate pažljivo odabrati ovisno o vrsti problema s kojim se suočavate.
optimizaciju
Funkcija gubitka je mjera performansi modela. Optimizator će pomoći u poboljšanju težina mreže kako bi se smanjio gubitak. Dostupni su različiti optimizatori, ali najčešći je Stochastic Gradient Descent.
Konvencionalni optimizatori su:
- Momentum optimizacija
- Nesterovljev ubrzani gradijent
- AdaGrad
- Adamova optimizacija
ArchiSama tekstura ne jamči upotrebljiv model.
Ograničenja neuronske mreže
Slijede ograničenja neuronske mreže:
Pretjerano opremanje
Uobičajeni problem sa složenom neuronskom mrežom je teškoća generalizacije na neviđene podatke. Neuronska mreža s mnogo težina može vrlo dobro identificirati specifične detalje u skupu vlakova, ali to često dovodi do prekomjernog prilagođavanja. Ako su podaci neuravnoteženi unutar grupa (tj. ako u nekim grupama nema dovoljno dostupnih podataka), mreža će vrlo dobro učiti tijekom učenja, ali neće imati mogućnost generalizacije takvih obrazaca na podatke koji nikada prije nisu viđeni.
Postoji kompromis u stroj za učenje između optimizacije i generalizacije.
- Optimizacija modela zahtijeva pronalaženje najboljih parametara koji minimiziraju gubitak skupa za učenje.
- Generalizacija, međutim, govori kako se model ponaša za nevidljive podatke.
Kako biste spriječili da model uhvati specifične detalje ili neželjene obrasce podataka za obuku, možete koristiti različite tehnike. Najbolja metoda je imati uravnotežen skup podataka s dovoljnom količinom podataka. Umjetnost smanjenja prekomjernog prilagođavanja naziva se regularizacija. Tri tehnike u nastavku su konvencionalne početne točke.
| Tehnika | Što ograničava | Tipična postavka u ovom vodiču |
|---|---|---|
| Veličina mreže | Broj slojeva i skrivenih jedinica | Dva skrivena sloja, 300 i 100 jedinica |
| Regularizacija težine L1 / L2 | Veličina težinskih koeficijenata | l1_jačina_regularizacije i l2_jačina_regularizacije od 0.01 |
| maloljetnik koji se ispisao iz škole | Udio isključenih jedinica po koraku obuke | ispadanje od 0.3 |
Veličina mreže
Poznato je da je neuronska mreža s previše slojeva i skrivenih jedinica vrlo sofisticirana. Jednostavan način smanjenja složenosti modela je smanjenje njegove veličine. Ne postoji jedna najbolja praksa za definiranje broja slojeva. Morate početi s malim brojem slojeva i povećavati veličinu dok ne pronađete model koji se previše prilagođava.
Regulacija težine
Standardna tehnika za sprječavanje prekomjernog prilagođavanja je dodavanje ograničenja težinama mreže. Ograničenje prisiljava težine mreže da uzimaju samo male vrijednosti. Ograničenje se dodaje funkciji gubitka pogreške. Postoje dvije vrste regularizacije:
- L1 (Laso): Trošak je proporcionalan apsolutnoj vrijednosti težinskih koeficijenata.
- L2 (greben): Trošak je proporcionalan kvadratu vrijednosti težinskih koeficijenata.
maloljetnik koji se ispisao iz škole
Ispuštanje je neobična, ali korisna tehnika. Mreža s ispuštanjem znači da će se neke jedinice nasumično isključiti tijekom koraka treniranja, tako da njihov izlazni signal postaje nula. Zamislite da imate niz težina [0.1, 1.7, 0.7, -0.9]. Ako neuronska mreža ima ispuštanje, postat će [0.1, 0, 0, -0.9] sa nasumično raspoređenom 0. Parametar koji kontrolira ispuštanje je stopa ispuštanja. Stopa definira koliko se jedinica isključuje. Uobičajena je stopa između 0.2 i 0.5.
Mali interaktivni primjer olakšava praćenje petlje učenja.
Primjer neuronske mreže u TensorFlowu
Evo primjera umjetne neuronske mreže u akciji koji pokazuje kako neuronska mreža radi na tipičnom problemu klasifikacije. Postoje dva ulaza, x1 i x2, svaki sa slučajnom vrijednošću. Izlaz je binarna klasa. Cilj je klasificirati oznaku na temelju dvije značajke. Za izvršavanje ovog zadatka, arhitektura neuronske mreže definirana je na sljedeći način:
- Dva skrivena sloja
- Prvi sloj ima četiri potpuno povezana neurona
- Drugi sloj ima dva potpuno povezana neurona
- Aktivacijska funkcija je ReLU
- Dodajte L2 regularizaciju sa stopom učenja od 0.003
Mreža će optimizirati težine tijekom 180 epoha s veličinom serije od 10. U primjeru animacije umjetne neuronske mreže u nastavku možete vidjeti kako se težine mijenjaju tijekom vremena i kako mreža poboljšava mapu klasifikacije.ping.
Prije svega, mreža dodjeljuje nasumične vrijednosti svim težinama.
- S nasumičnim težinama, odnosno bez optimizacije, gubitak izlaza je 0.453. Slika ispod prikazuje mrežu s različitim bojama.
- Općenito, narančasta boja predstavlja negativne vrijednosti dok plava boja pokazuje pozitivne vrijednosti.
- Točke podataka imaju isti prikaz: plave su pozitivne oznake, a narančaste negativne oznake.
Unutar drugog skrivenog sloja, linije su obojene prema predznaku težina. Narančaste linije nose negativne težine, a plave pozitivne težine.
Kao što vidite, na izlaznoj mapiping, mreža radi dosta pogrešaka. Sada pogledajte kako se mreža ponaša nakon optimizacije.
Slika primjera umjetne neuronske mreže u nastavku prikazuje rezultate optimizirane mreže. Prije svega, primjećujete da je mreža uspješno naučila kako klasificirati podatkovne točke. Uspoređujući to sa slikom prije, početna težina bila je -0.43, dok nakon optimizacije rezultira težinom od -0.95.
Ideja se može generalizirati za mreže s više skrivenih slojeva i neurona. Možete sami eksperimentirati s postavkama u Igralište TensorFlow.
U nastavku slijedi gradnja iste ideje u kodu na stvarnom skupu podataka.
Kako trenirati neuronsku mrežu s TensorFlowom
Evo korak-po-korak postupka kako trenirati neuronsku mrežu s TensorFlow ANN pomoću API-jevog estimatora DNNClassifier.
Koristit ćemo skup podataka MNIST za obuku vaše prve neuronske mreže. Uvježbavanje neuronske mreže s TensorFlow nije jako komplicirano. Korak predobrade izgleda potpuno isto kao u prethodnim tutorijalima. Postupit ćete na sljedeći način:
- Uvezite podatke
- Transformirajte podatke
- Konstruirajte tenzor
- Izgradite model
- Obučite i ocijenite model
- Poboljšajte model
Napomena o verziji: Kôd u ovom vodiču usmjeren je na TensorFlow 1.x Estimator API. Konačno izdanje paketa tf-estimator isporučeno je s TensorFlowom 2.15, a tf.estimator je uklonjen u TensorFlowu 2.16. Da biste pokrenuli ove korake na trenutnom izdanju, ili pričvrstite TensorFlow 2.15 ili ponovno izgradite istu dvoslojnu mrežu s tf.keras.layers.Dense i model.fit().
Korak 1) Uvezite podatke
Prvo, morate uvesti potrebnu biblioteku. Skup podataka MNIST možete uvesti pomoću scikit učiti kao što je prikazano u primjeru TensorFlow neuronske mreže u nastavku.
MNIST skup podataka najčešće se koristi za testiranje novih tehnika ili algoritama. To je zbirka slika veličine 28 × 28 piksela, od kojih svaka prikazuje rukom pisanu znamenku od 0 do 9. Odbor dubokih konvolucijskih mreža treniranih elastičnim izobličenjima smanjio je pogrešku testa na 0.27 posto.
import numpy as np import tensorflow as tf np.random.seed(1337)
Izvorni vodič je ručno preuzeo MNIST datoteke i usmjerio fetch_mldata na tu mapu.
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)
Napomena API-ja: mldata.org više nije online, a fetch_mldata je uklonjen u scikit-learn verziji 0.22. Na trenutnoj instalaciji, zamijenite gornji poziv s fetch_openml('mnist_784', version=1), koji preuzima istih 70 000 znamenki i otkriva identične podatke i atribute cilja.
Nakon toga, razdvajate podatke i dobivate oblik oba skupa podataka.
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 )
Korak 2) Transformirajte podatke
U prethodnom vodiču naučili ste da trebate transformirati podatke kako biste ograničili učinak outliera. U ovom vodiču o neuronskim mrežama transformirat ćete podatke pomoću min-max skalera. Formula je:
(X-min_x)/(max_x - min_x)
scikit-learn već ima funkciju za to: 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))
Korak 3) Konstruirajte tenzor
Sada ste upoznati s načinom stvaranja tenzori u TensorFlowu. Skup vlakova možete pretvoriti u numerički stupac.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Korak 4) Izgradite model
Arhitektura neuronske mreže sadrži 2 skrivena sloja s 300 jedinica za prvi sloj i 100 jedinica za drugi. Ove vrijednosti dolaze iz iskustva, a ne iz formule. Možete ih podesiti i vidjeti kako utječu na točnost mreže.
Za izgradnju modela koristite estimator DNNClassifier. Broj klasa morate postaviti na 10 jer u skupu za učenje postoji deset klasa. Već ste upoznati sa sintaksom objekta estimatora. Argumenti feature_columns, n_classes i model_dir su potpuno isti kao u prethodnom vodiču. Argument hidden_units je novi: on kontrolira i broj slojeva i koliko čvorova svaki sloj povezuje s neuronskom mrežom. U donjem kodu postoje dva skrivena sloja, prvi povezuje 300 čvorova, a drugi 100 čvorova.
Za izradu procjenitelja upotrijebite tf.estimator.DNNClassifier sa sljedećim parametrima:
- stupci_značajki: Definirajte stupce koji će se koristiti u mreži
- skrivene_jedinice: Definirajte broj skrivenih neurona
- n_klasa: Definirajte broj klasa za predviđanje
- direktorij_modela: Definirajte put od TensorBoard
estimator = tf.estimator.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[300, 100],
n_classes=10,
model_dir = '/train/DNN')
Korak 5) Obučite i ocijenite model
Za treniranje modela i njegovu evaluaciju možete koristiti NumPy input funkciju.
# 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)
Izlaz:
{'accuracy': 0.9637143,
'average_loss': 0.12014342,
'loss': 1682.0079,
'global_step': 1000}
Trenutna arhitektura dovodi do točnosti na skupu za evaluaciju od otprilike 96 posto.
Korak 6) Poboljšajte model
Možete pokušati poboljšati model dodavanjem parametara regularizacije.
Ovdje estimator koristi Proximal AdaGrad optimizer s stopom ispadanja od 0.3 i snagama L1 i L2 postavljenim na 0.01. U TensorFlow neuronskoj mreži, do optimizatora se dolazi putem objekta `train` nakon čega slijedi naziv optimizatora. TensorFlow isporučuje ugrađeni API za Proximal AdaGrad optimizer.
Za dodavanje regularizacije dubokoj neuronskoj mreži možete koristiti tf.train.ProximalAdagradOptimizer sa sljedećim parametrima:
- Brzina učenja: stopa_učenja
- Regularizacija L1: l1_snaga_regularizacije
- Regularizacija L2: l2_snaga_regularizacije
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)
Izlaz:
{'accuracy': 0.95057142,
'average_loss': 0.17318928,
'loss': 2424.6499,
'global_step': 2000}
Vrijednosti odabrane za smanjenje prekomjernog prilagođavanja nisu poboljšale točnost modela. Vaš prvi model imao je točnost od 96%, dok model s L2 regularizatorom ima točnost od 95%. Možete isprobati različite vrijednosti i vidjeti kako utječu na točnost.






