Vodič za umjetnu neuronsku mrežu s primjerima TensorFlow ANN

Š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 na temelju skupa povezanih jedinica zvanih umjetni neuroni. Osmišljen je za analizu i obradu informacija kao ljudi. Umjetna neuronska mreža ima sposobnost samoučenja za postizanje boljih rezultata što je više podataka dostupno.

Umjetna neuronska mreža
Umjetna neuronska mreža

Umjetna neuronska mreža (ANN) sastoji se od četiri glavna objekta:

  • Slojevi: sve se učenje 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 izlaz iz mreže (oznake)
  • Funkcija gubitka: Mjerni podatak koji se koristi za procjenu izvedbe faze učenja
  • optimizaciju: Poboljšajte učenje ažuriranjem znanja u mreži

Neuronska mreža će uzeti ulazne podatke i gurnuti ih u skup slojeva. Mreža treba procijeniti svoju izvedbu s funkcijom gubitka. Funkcija gubitka daje mreži predodžbu o putu koji treba prijeći prije nego što ovlada znanjem. Mreža treba unaprijediti svoje znanje uz pomoć optimizatora.

Ako pogledate gornju sliku, shvatit ćete temeljni mehanizam.

Program uzima neke ulazne vrijednosti i gura ih u dva potpuno povezana sloja. Zamislite da imate matematički problem, prvo što trebate učiniti je pročitati odgovarajuće poglavlje kako biste riješili problem. Primijenite svoje novo znanje kako biste riješili problem. Postoji velika vjerojatnost da nećete postići dobar rezultat. Isto je i za mrežu. Prvi put kad vidi podatke i napravi predviđanje, oni se neće savršeno podudarati sa stvarnim podacima.

Kako bi poboljšala svoje znanje, mreža koristi optimizator. U našoj analogiji, optimizator se može zamisliti kao ponovno čitanje poglavlja. Ponovnim čitanjem dobivate nove uvide/lekcije. Slično, mreža koristi optimizator, ažurira svoje znanje i testira svoje novo znanje kako bi provjerila koliko još treba naučiti. Program će ponavljati ovaj korak dok ne napravi najmanju moguću pogrešku.

U našoj analogiji s matematičkim problemom, to znači da čitate poglavlje udžbenika mnogo puta dok u potpunosti ne razumijete sadržaj tečaja. Čak i nakon višestrukog čitanja, ako stalno griješite, to znači da ste dosegli kapacitet znanja s trenutnim materijalom. Morate koristiti drugi udžbenik ili testirati drugu metodu kako biste poboljšali svoj rezultat. Za neuronsku mrežu, to je isti proces. Ako je pogreška daleko od 100%, ali je krivulja ravna, to znači da s trenutnom arhitekturom; ne može naučiti ništa drugo. Mreža mora biti bolje optimizirana kako bi se poboljšalo znanje.

Živčana mreža Architektura

Umjetna neuronska mreža Archistruktura se sastoji od sljedećih komponenti:

  • Slojevi
  • Aktivacijska funkcija
  • Funkcija gubitka
  • optimizaciju

Slojevi

Sloj je mjesto gdje se odvija svo učenje. Unutar sloja nalazi se beskonačna količina utega (neurona). Tipičnu neuronsku mrežu često obrađuju gusto povezani slojevi (koji se nazivaju i potpuno povezani slojevi). To znači da su svi ulazi spojeni na izlaz.

Tipična neuronska mreža uzima vektor ulaza i skalar koji sadrži oznake. Najudobnije postavljanje je binarna klasifikacija sa samo dvije klase: 0 i 1.

Mreža uzima ulaz, šalje ga svim povezanim čvorovima i izračunava signal s aktiviranje funkcija.

Živčana mreža Architektura
Živčana mreža Architektura

Gornja slika prikazuje ovu ideju. Prvi sloj su ulazne vrijednosti za drugi sloj, nazvan skriveni sloj, prima ponderirani unos iz prethodnog sloja

  1. Prvi čvor su ulazne vrijednosti
  2. Neuron se rastavlja na ulazni dio i aktivacijsku funkciju. Lijevi dio prima sve podatke iz prethodnog sloja. Desni dio je zbroj ulaznih prolaza u aktivacijsku funkciju.
  3. Izlazna vrijednost izračunata iz skrivenih slojeva i upotrijebljena za predviđanje. Za klasifikaciju, jednak je broju klase. Za regresiju je predviđena samo jedna vrijednost.

Aktivacijska funkcija

Aktivacijska funkcija čvora definira izlaz s obzirom na skup ulaza. Potrebna vam je funkcija aktivacije kako biste mreži omogućili učenje nelinearnog uzorka. Uobičajena funkcija aktivacije je a Relu, Ispravljena linearna jedinica. Funkcija daje nulu za sve negativne vrijednosti.

Funkcija aktivacije

Ostale funkcije aktivacije su:

  • Djelomično linearno
  • sigmoidno
  • Tanh
  • Propušteni Relu

Kritična odluka koju treba donijeti pri izgradnji neuronske mreže je:

  • Koliko slojeva u neuronskoj mreži
  • Koliko skrivenih jedinica za svaki sloj

Neuronska mreža s puno slojeva i skrivenih jedinica može naučiti složenu reprezentaciju podataka, ali čini izračun mreže vrlo skupim.

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 entropije. U linearnoj regresiji 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 gubitaka je mjera performansi modela. Optimizator će pomoći u poboljšanju težine 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

Ograničenja neuronske mreže

Sljedeća su ograničenja neuronske mreže:

Pretjerano opremanje

Čest problem sa složenom neuronskom mrežom su poteškoće u generalizaciji nevidljivih podataka. Neuronska mreža s puno utega može vrlo dobro identificirati određene detalje u sklopu vlaka, ali često dovodi do pretjeranog opremanja. Ako su podaci neuravnoteženi unutar grupa (tj. nema dovoljno podataka dostupnih u nekim grupama), mreža će vrlo dobro učiti tijekom obuke, ali neće imati sposobnost generalizirati takav obrazac na nikad prije viđene podatke.

U strojnom učenju postoji kompromis između optimizacije i generalizacije.

Optimizacija modela zahtijeva pronalaženje najboljih parametara koji minimiziraju gubitak skupa za treniranje.

Generalizacija, međutim, govori kako se model ponaša za nevidljive podatke.

Kako biste spriječili da model uhvati određene detalje ili neželjene obrasce podataka o vježbanju, možete koristiti različite tehnike. Najbolja metoda je imati uravnotežen skup podataka s dovoljnom količinom podataka. Umijeće smanjivanja prekomjernog opremanja naziva se regularizacija. Pregledajmo neke konvencionalne tehnike.

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 najbolja praksa za definiranje broja slojeva. Morate započeti s malom količinom sloja i povećavati njegovu veličinu dok ne vidite da je model pretjeran.

Regulacija težine

Standardna tehnika za sprječavanje prekomjernog opremanja je dodavanje ograničenja težinama mreže. Ograničenje prisiljava veličinu mreže da uzima 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

Ispadanje je čudna, ali korisna tehnika. Mreža s ispadanjem znači da će neki ponderi biti nasumično postavljeni na nulu. Zamislite da imate niz težina [0.1, 1.7, 0.7, -0.9]. Ako neuronska mreža ima ispadanje, postat će [0.1, 0, 0, -0.9] s nasumično raspodijeljenim 0. Parametar koji kontrolira ispadanje je stopa ispadanja. Stopa definira koliko se težine treba postaviti na nulu. Stopa između 0.2 i 0.5 je uobičajena.

Primjer neuronske mreže u TensorFlowu

Pogledajmo primjer umjetne neuronske mreže na djelu o tome kako neuronska mreža radi za tipičan problem klasifikacije. Postoje dva ulaza, x1 i x2 sa slučajnom vrijednošću. Izlaz je binarna klasa. Cilj je klasificirati oznaku na temelju dvije značajke. Da bi se izvršio ovaj zadatak, 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
  • Funkcija aktivacije je Relu
  • Dodajte L2 regularizaciju sa stopom učenja od 0.003

Neuronska mreža u TensorFlowu

Mreža će optimizirati težinu tijekom 180 epoha s veličinom serije od 10. U videu primjera ANN-a u nastavku možete vidjeti kako se težine razvijaju i kako mreža poboljšava mapiranje klasifikacije.

Prije svega, mreža dodjeljuje nasumične vrijednosti svim težinama.

  • Sa slučajnim težinama, tj. bez optimizacije, izlazni gubitak je 0.453. Slika ispod prikazuje mrežu različitim bojama.
  • Općenito, narančasta boja predstavlja negativne vrijednosti dok plava boja pokazuje pozitivne vrijednosti.
  • Podatkovne točke imaju isti prikaz; plave su pozitivne oznake, a narančaste negativne oznake.

Neuronska mreža u TensorFlowu

Unutar drugog skrivenog sloja, linije su obojene prema znaku težine. Narančaste linije dodjeljuju negativne težine, a plave pozitivne

Kao što vidite, u mapiranju izlaza, mreža čini dosta grešaka. Pogledajmo kako se mreža ponaša nakon optimizacije.

Slika primjera ANN-a u nastavku prikazuje rezultate optimizirane mreže. Prije svega, primijetili ste da je mreža uspješno naučila kako klasificirati podatkovnu točku. Možete vidjeti na slici prije; početna težina je bila -0.43 dok nakon optimizacije rezultira težinom od -0.95.

Neuronska mreža u TensorFlowu

Ideja se može generalizirati za mreže s više skrivenih slojeva i neurona. Možete se igrati u link.

Kako trenirati neuronsku mrežu s TensorFlowom

Ovdje je korak po korak postupak o tome 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 pretprocesiranja izgleda potpuno isto kao u prethodnim vodičima. Postupit ćete na sljedeći način:

  • Korak 1: Uvezite podatke
  • Korak 2: Transformirajte podatke
  • Korak 3: Konstruirajte tenzor
  • Korak 4: Izgradite model
  • Korak 5: obučite i ocijenite model
  • Korak 6: Poboljšajte model

Korak 1) Uvezite podatke

Prije svega, trebate uvesti potrebnu biblioteku. Možete uvesti MNIST skup podataka koristeći scikit learn kao što je prikazano u primjeru TensorFlow neuronske mreže u nastavku.

MNIST skup podataka je skup podataka koji se često koristi za testiranje novih tehnika ili algoritama. Ovaj skup podataka zbirka je slika veličine 28 × 28 piksela s rukom ispisanim znamenkama od 0 do 9. Trenutačno je najmanja pogreška na testu 0.27 posto s odborom od 7 konvolucijskih neuronskih mreža.

import numpy as np
import tensorflow as tf
np.random.seed(1337)

Na ovoj adresi možete privremeno preuzeti scikit learn. Kopirajte i zalijepite skup podataka u prikladnu mapu. Za uvoz podataka u python, možete koristiti fetch_mldata iz scikit learn. Zalijepite put datoteke unutar fetch_mldata da dohvatite podatke.

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)

Nakon toga uvozite 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 learns 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 tenzora u Tensorflowu. Komplet 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 sloj. Ove vrijednosti koristimo na temelju vlastitog iskustva. Možete podesiti te vrijednosti i vidjeti kako to utječe na točnost mreže.

Za izradu modela koristite procjenitelj DNNClassifier. Možete dodati broj slojeva argumentima feature_columns. Morate postaviti broj klasa na 10 jer postoji deset klasa u skupu za obuku. Već ste upoznati sa sintaksom objekta estimatora. Stupci značajki argumenata, broj klasa i model_dir potpuno su isti kao u prethodnom vodiču. Novi argument hidden_unit kontrolira broj slojeva i koliko čvorova treba spojiti na neuronsku mrežu. U donjem kodu postoje dva skrivena sloja od kojih prvi povezuje 300 čvorova, a drugi sa 100 čvorova.

Za izradu procjenitelja upotrijebite tf.estimator.DNNClassifier sa sljedećim parametrima:

  • feature_columns: Definirajte stupce za korištenje u mreži
  • hidden_units: Definirajte broj skrivenih neurona
  • n_classes: Definirajte broj klasa za predviđanje
  • model_dir: Definirajte putanju TensorBoarda
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

Možete koristiti numpy metodu za obuku modela i njegovu procjenu

# 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 skupa za procjenu od 96 posto.

Korak 6) Poboljšajte model

Možete pokušati poboljšati model dodavanjem parametara regularizacije.

Koristit ćemo Adamov optimizator sa stopom ispadanja od 0.3, L1 od X i L2 od y. U TensorFlow neuronskoj mreži možete kontrolirati optimizator pomoću niza objekata iza imena optimizatora. TensorFlow je ugrađeni API za Proximal AdaGrad optimizator.

Da biste dubokoj neuronskoj mreži dodali regularizaciju, možete koristiti tf.train.ProximalAdagradOptimizer sa sljedećim parametrom

  • Stopa učenja: rate_Learning
  • L1 regularizacija: l1_snaga_regularizacije
  • L2 regularizacija: 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 pokušati s različitim vrijednostima i vidjeti kako to utječe na točnost.

rezime

U ovom vodiču naučit ćete kako izgraditi neuronsku mrežu. Neuronska mreža zahtijeva:

  • Broj skrivenih slojeva
  • Broj potpuno povezanih čvorova
  • Aktivacijska funkcija
  • optimizaciju
  • Broj razreda

U TensorFlow ANN-u možete trenirati neuronsku mrežu za problem klasifikacije pomoću:

  • tf.estimator.DNNClassifier

Procjenitelj zahtijeva da navede:

  • feature_columns=feature_columns,
  • skrivene_jedinice=[300, 100]
  • n_razreda=10
  • model_dir

Možete poboljšati model korištenjem različitih optimizatora. U ovom ste vodiču naučili kako koristiti optimizator Adam Grad sa stopom učenja i dodati kontrolu za sprječavanje prekomjernog opremanja.