Keinotekoisen hermoverkon opetusohjelma TensorFlow ANN -esimerkeillä
Mikä on keinotekoinen hermoverkko?
An Keinotekoinen hermoverkko (ANN) on biologisten hermoverkkojen inspiroima tietokonejärjestelmä keinotekoisten aivojen luomiseen perustuen yhdistettyjen yksiköiden, joita kutsutaan keinotekoisiksi neuroneiksi, kokoelmaan. Se on suunniteltu analysoimaan ja käsittelemään tietoa ihmisenä. Keinotekoisella hermoverkolla on itseoppimiskyky, joka tuottaa parempia tuloksia, kun enemmän tietoa on saatavilla.
Keinotekoinen hermoverkko (ANN) koostuu neljästä pääobjektista:
- Tasot: kaikki oppiminen tapahtuu kerroksissa. Siinä on 3 kerrosta 1) Tulo 2) Piilotettu ja 3) Lähtö
- Ominaisuus ja etiketti: Tietojen syöttäminen verkkoon (ominaisuudet) ja ulostulo verkosta (tunnisteet)
- Tappio-toiminto: Mittari, jota käytetään arvioimaan oppimisvaiheen suorituskykyä
- Optimizer: Paranna oppimista päivittämällä tietoja verkossa
Neuraaliverkko ottaa syötetyt tiedot ja työntää ne kerrosten joukkoon. Verkon on arvioitava suorituskykynsä häviöfunktiolla. Häviöfunktio antaa verkostolle käsityksen polusta, joka sen täytyy kulkea ennen kuin se hallitsee tiedon. Verkon on parannettava tietämystään optimoijan avulla.
Jos katsot yllä olevaa kuvaa, ymmärrät taustalla olevan mekanismin.
Ohjelma ottaa joitain syöttöarvoja ja työntää ne kahteen täysin yhdistettyyn kerrokseen. Kuvittele, että sinulla on matemaattinen tehtävä. Ensimmäinen asia, jonka teet, on lukea vastaava luku ratkaistaksesi ongelman. Käytät uutta tietoasi ongelman ratkaisemiseksi. On suuri mahdollisuus, että et saa kovin hyviä pisteitä. Sama koskee verkkoa. Kun se näkee tiedot ensimmäistä kertaa ja tekee ennusteen, se ei täsmää täydellisesti todellisten tietojen kanssa.
Tietonsa parantamiseksi verkko käyttää optimoijaa. Analogiamme mukaan optimoija voidaan ajatella lukevan luvun uudelleen. Saat uusia oivalluksia/oppitunteja lukemalla uudelleen. Samoin verkko käyttää optimoijaa, päivittää tietämystään ja testaa uutta tietoaan tarkistaakseen, kuinka paljon sen tarvitsee vielä oppia. Ohjelma toistaa tätä vaihetta, kunnes se tekee pienimmän mahdollisen virheen.
Matematiikkatehtävän analogiassamme se tarkoittaa, että luet oppikirjan luvun monta kertaa, kunnes ymmärrät kurssin sisällön perusteellisesti. Jos teet jatkuvasti virheen lukemisen jälkeenkin, se tarkoittaa, että olet saavuttanut tietokapasiteetin nykyisellä materiaalilla. Sinun on käytettävä eri oppikirjaa tai testattava eri menetelmää pistemääräsi parantamiseksi. Neuraaliverkossa se on sama prosessi. Jos virhe on kaukana 100 %:sta, mutta käyrä on tasainen, se tarkoittaa nykyisellä arkkitehtuurilla; se ei voi oppia mitään muuta. Verkkoa on optimoitava paremmin tiedon parantamiseksi.
Neural Network Archirakenne
Keinotekoinen hermoverkko Archirakenne koostuu seuraavista osista:
- Tasot
- Aktivointitoiminto
- Tappio-toiminto
- Optimizer
Tasot
Kerros on missä kaikki oppiminen tapahtuu. Kerroksen sisällä on ääretön määrä painoja (neuroneja). Tyypillistä hermoverkkoa käsittelevät usein tiiviisti kytketyt kerrokset (kutsutaan myös täysin yhdistetyiksi kerroksiksi). Se tarkoittaa, että kaikki tulot on kytketty lähtöön.
Tyypillinen hermoverkko ottaa sisääntulovektorin ja skalaarin, joka sisältää tunnisteet. Mukavin asetus on binääriluokitus, jossa on vain kaksi luokkaa: 0 ja 1.
Verkko ottaa syötteen, lähettää sen kaikkiin liitettyihin solmuihin ja laskee signaalin an aktivointi toiminto.
Yllä oleva kuva kuvaa tätä ajatusta. Ensimmäinen kerros on syöttöarvot toiselle kerrokselle, jota kutsutaan piilotetuksi kerrokseksi, joka vastaanottaa painotetun syötteen edelliseltä tasolta
- Ensimmäinen solmu on syöttöarvot
- Neuroni hajoaa syöttöosaan ja aktivointitoimintoon. Vasen osa vastaanottaa kaiken syötteen edelliseltä tasolta. Oikea osa on aktivointifunktioon siirtyvien tulojen summa.
- Piilotetuista tasoista laskettu tulosarvo, jota käytetään ennusteen tekemiseen. Luokittelua varten se on yhtä suuri kuin luokan lukumäärä. Regressiolle ennustetaan vain yksi arvo.
Aktivointitoiminto
Solmun aktivointitoiminto määrittää lähdön, joka on annettu joukolle tuloja. Tarvitset aktivointitoiminnon, jotta verkko voi oppia epälineaarisen kuvion. Yleinen aktivointitoiminto on a Relu, rektifioitu lineaarinen yksikkö. Funktio antaa nollan kaikille negatiivisille arvoille.
Muut aktivointitoiminnot ovat:
- Piecewise Lineaarinen
- sigmoid
- Tanh
- Vuotava Relu
Kriittinen päätös hermoverkkoa rakennettaessa on:
- Kuinka monta kerrosta hermoverkossa
- Kuinka monta piilotettua yksikköä kullekin tasolle
Neuraaliverkko, jossa on paljon kerroksia ja piilotettuja yksiköitä, voi oppia monimutkaisen esityksen tiedosta, mutta se tekee verkon laskemisesta erittäin kallista.
Tappio-toiminto
Kun olet määrittänyt piilotetut tasot ja aktivointitoiminnon, sinun on määritettävä häviötoiminto ja optimoija.
Binääriluokituksessa on yleinen käytäntö käyttää binaarista ristientropiahäviöfunktiota. Lineaarisessa regressiossa käytät keskimääräistä neliövirhettä.
Häviöfunktio on tärkeä mittari optimoijan suorituskyvyn arvioinnissa. Koulutuksen aikana tämä mittari minimoidaan. Sinun on valittava tämä määrä huolellisesti käsittelemäsi ongelman tyypin mukaan.
Optimizer
Häviöfunktio on mallin suorituskyvyn mitta. Optimoija auttaa parantamaan verkon painoja häviön vähentämiseksi. Saatavilla on erilaisia optimoijia, mutta yleisin niistä on Stochastic Gradient Descent.
Perinteiset optimoijat ovat:
- Momentum optimointi,
- Nesterovin kiihdytetty gradientti,
- AdaGrad,
- Adamin optimointi
Neuraaliverkon rajoitukset
Seuraavat ovat neuroverkon rajoitukset:
overfitting
Yleinen ongelma monimutkaisen hermoverkon kanssa on vaikeudet yleistää näkymätöntä dataa. Neuroverkko, jossa on paljon painoja, voi tunnistaa tietyt yksityiskohdat junasarjasta erittäin hyvin, mutta johtaa usein ylisovitukseen. Jos tiedot ovat epätasapainossa ryhmien sisällä (eli joissakin ryhmissä ei ole tarpeeksi tietoa saatavilla), verkosto oppii erittäin hyvin koulutuksen aikana, mutta sillä ei ole kykyä yleistää tällaista mallia ennennäkemättömään dataan.
Koneoppimisessa on kompromissi optimoinnin ja yleistyksen välillä.
Mallin optimointi edellyttää parhaiden parametrien löytämistä, jotka minimoivat harjoitusjoukon häviämisen.
Yleistys kuitenkin kertoo, kuinka malli käyttäytyy näkymättömälle datalle.
Voit käyttää erilaisia tekniikoita, jos haluat estää mallia tallentamasta harjoitustietojen tiettyjä yksityiskohtia tai ei-toivottuja kuvioita. Paras tapa on tasapainoinen tietojoukko, jossa on riittävästi tietoa. Ylisovituksen vähentämisen taitoa kutsutaan laillistamisen. Tarkastellaan joitain perinteisiä tekniikoita.
Verkon koko
Liian monta kerrosta ja piilotettuja yksiköitä sisältävän neuroverkon tiedetään olevan erittäin kehittynyt. Yksinkertainen tapa vähentää mallin monimutkaisuutta on pienentää sen kokoa. Tasojen lukumäärän määrittämiseen ei ole parasta käytäntöä. Sinun on aloitettava pienellä määrällä kerrosta ja suurennetaan sen kokoa, kunnes löydät mallin yliistuvan.
Painon laillistaminen
Vakiotekniikka ylisovituksen estämiseksi on lisätä rajoituksia verkon painoihin. Rajoitus pakottaa verkon koon ottamaan vain pieniä arvoja. Rajoitus lisätään virheen häviöfunktioon. On olemassa kahdenlaisia regulaatioita:
L1: Lasso: Kustannus on verrannollinen painokertoimien itseisarvoon
L2: Ridge: Kustannus on verrannollinen painokertoimien arvon neliöön
Lopettaa
Pudotus on outo, mutta hyödyllinen tekniikka. Verkko, jossa on pudotus, tarkoittaa, että jotkin painot asetetaan satunnaisesti nollaan. Kuvittele, että sinulla on joukko painoja [0.1, 1.7, 0.7, -0.9]. Jos hermoverkossa on keskeytys, siitä tulee [0.1, 0, 0, -0.9] satunnaisesti jakautuneen 0:n kanssa. Pudotusta ohjaava parametri on keskeyttämisprosentti. Korko määrittää, kuinka monta painoa nollataan. 0.2 ja 0.5 välillä on yleistä.
Esimerkki neuroverkosta TensorFlowissa
Katsotaanpa keinotekoisen hermoverkon esimerkkiä toiminnassa, kuinka hermoverkko toimii tyypillisessä luokitusongelmassa. On kaksi tuloa, x1 ja x2, joilla on satunnainen arvo. Tulos on binääriluokka. Tavoitteena on luokitella etiketti näiden kahden ominaisuuden perusteella. Tämän tehtävän suorittamiseksi hermoverkkoarkkitehtuuri määritellään seuraavasti:
- Kaksi piilotettua kerrosta
- Ensimmäisessä kerroksessa on neljä täysin kytkettyä neuronia
- Toisessa kerroksessa on kaksi täysin kytkettyä neuronia
- Aktivointitoiminto on Relu
- Lisää L2-regulointi, jonka oppimisnopeus on 0.003
Verkko optimoi painon 180 jaksolla 10 erän koolla. Alla olevasta ANN-esimerkkivideosta näet kuinka painot muuttuvat ja kuinka verkko parantaa luokittelukartoitusta.
Ensinnäkin verkko antaa satunnaiset arvot kaikille painoille.
- Satunnaispainoilla eli ilman optimointia lähtöhäviö on 0.453. Alla oleva kuva edustaa verkkoa eri väreillä.
- Yleensä oranssi väri edustaa negatiivisia arvoja, kun taas siniset värit osoittavat positiivisia arvoja.
- Datapisteillä on sama esitys; siniset ovat positiivisia merkintöjä ja oranssit negatiivisia merkkejä.
Toisen piilokerroksen sisällä viivat on väritetty painojen merkkiä noudattaen. Oranssit viivat antavat negatiiviset painot ja siniset positiiviset painot
Kuten näet, tuloskartoituksessa verkko tekee melko paljon virheitä. Katsotaan kuinka verkko käyttäytyy optimoinnin jälkeen.
Alla oleva ANN-esimerkin kuva kuvaa optimoidun verkon tuloksia. Ensinnäkin huomaat, että verkko on onnistuneesti oppinut luokittamaan datapisteen. Näet edellisestä kuvasta; alkuperäinen paino oli -0.43, kun taas optimoinnin jälkeen tuloksena on -0.95.
Ajatus voidaan yleistää verkoille, joissa on enemmän piilotettuja kerroksia ja neuroneja. Voit leikkiä sisällä linkkiä.
Kuinka kouluttaa hermoverkkoa TensorFlow'n avulla
Tässä on vaihe vaiheelta prosessi neuroverkon kouluttamiseen TensorFlow ANN: n avulla API:n estimaattorin DNNClassifier avulla.
Käytämme MNIST-tietojoukkoa ensimmäisen hermoverkkosi kouluttamiseen. Neuroverkon harjoittelu TensorFlow ei ole kovin monimutkaista. Esikäsittelyvaihe näyttää täsmälleen samalta kuin edellisissä opetusohjelmissa. Toimit seuraavasti:
- Vaihe 1: Tuo tiedot
- Vaihe 2: Muunna tiedot
- Vaihe 3: Rakenna tensori
- Vaihe 4: Rakenna malli
- Vaihe 5: Harjoittele ja arvioi malli
- Vaihe 6: Paranna mallia
Vaihe 1) Tuo tiedot
Ensinnäkin sinun on tuotava tarvittava kirjasto. Voit tuoda MNIST-tietojoukon käyttämällä scikit learning -ohjelmaa alla olevan TensorFlow-hermoverkon esimerkin mukaisesti.
MNIST-tietojoukko on yleisesti käytetty tietojoukko uusien tekniikoiden tai algoritmien testaamiseen. Tämä tietojoukko on kokoelma 28 × 28 pikselin kuvasta, jossa on käsin kirjoitettu numero 0–9. Tällä hetkellä testin pienin virhe on 0.27 prosenttia 7 konvoluutiohermoverkon komitealla.
import numpy as np import tensorflow as tf np.random.seed(1337)
Voit ladata scikit learning väliaikaisesti tästä osoitteesta. Kopioi ja liitä tietojoukko sopivaan kansioon. Voit tuoda tiedot pythoniin käyttämällä fetch_mldataa scikit learning -sovelluksesta. Liitä tiedostopolku fetch_mldata-kansioon tietojen hakemiseksi.
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)
Tämän jälkeen tuot tiedot ja saat molempien tietojoukkojen muodon.
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 )
Vaihe 2) Muunna tiedot
Edellisessä opetusohjelmassa opit, että sinun on muutettava tiedot poikkeavien vaikutusten rajoittamiseksi. Tässä Neural Networks -opetusohjelmassa muutat tiedot min-max-skaalaustoiminnolla. Kaava on:
(X-min_x)/(max_x - min_x)
Scikit learningsillä on jo toiminto sitä varten: 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))
Vaihe 3) Rakenna tensori
Tunnet nyt tavan luoda tensori Tensorflowissa. Voit muuntaa junajoukon numeerisiksi sarakkeiksi.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Vaihe 4) Rakenna malli
Neuraaliverkon arkkitehtuuri sisältää 2 piilotettua kerrosta, joista ensimmäinen kerros on 300 yksikköä ja toinen kerros 100 yksikköä. Käytämme näitä arvoja oman kokemuksemme perusteella. Voit virittää näitä arvoja ja nähdä kuinka se vaikuttaa verkon tarkkuuteen.
Mallin rakentamiseen käytetään estimaattoria DNNClassifier. Voit lisätä tasojen määrän feature_columns-argumentteihin. Sinun tulee asettaa tuntien lukumääräksi 10, koska harjoitussarjassa on kymmenen luokkaa. Olet jo perehtynyt estimaattoriobjektin syntaksiin. Argumenttien sarakkeet, luokkien lukumäärä ja model_dir ovat täsmälleen samat kuin edellisessä opetusohjelmassa. Uusi argumentti piilotettu_yksikkö ohjaa kerrosten määrää ja kuinka monta solmua yhdistetään hermoverkkoon. Alla olevassa koodissa on kaksi piilotettua kerrosta, joista ensimmäinen yhdistää 300 solmua ja toinen 100 solmua.
Rakenna estimaattori käyttämällä tf.estimator.DNNClassifier seuraavilla parametreilla:
- feature_columns: Määritä verkossa käytettävät sarakkeet
- piilotetut_yksiköt: Määritä piilotettujen neuronien lukumäärä
- n_classes: Määritä ennustettavien luokkien lukumäärä
- model_dir: Määritä TensorBoardin polku
estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], n_classes=10, model_dir = '/train/DNN')
Vaihe 5) Kouluta ja arvioi malli
Voit käyttää numpy-menetelmää mallin kouluttamiseen ja arviointiin
# 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)
lähtö:
{'accuracy': 0.9637143, 'average_loss': 0.12014342, 'loss': 1682.0079, 'global_step': 1000}
Nykyinen arkkitehtuuri johtaa arviointijoukon 96 prosentin tarkkuuteen.
Vaihe 6) Paranna mallia
Voit yrittää parantaa mallia lisäämällä regularisointiparametreja.
Käytämme Adam-optimoijaa, jonka keskeytysaste on 0.3, L1 X ja L2 y. TensorFlow Neural Networkissa voit ohjata optimoijaa käyttämällä objektijonoa, jota seuraa optimoijan nimi. TensorFlow on sisäänrakennettu API Proximal AdaGrad -optimoijalle.
Voit lisätä säätelyn syvälle hermoverkkoon käyttämällä tf.train.ProximalAdagradOptimizer-parametria seuraavalla parametrilla
- Oppimisnopeus: learning_rate
- L1-regulointi: l1_regularization_strength
- L2-regulointi: 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)
lähtö:
{'accuracy': 0.95057142, 'average_loss': 0.17318928, 'loss': 2424.6499, 'global_step': 2000}
Ylisovituksen vähentämiseksi valitut arvot eivät parantaneet mallin tarkkuutta. Ensimmäisen mallisi tarkkuus oli 96 %, kun taas L2-regulaattorilla varustetun mallin tarkkuus on 95 %. Voit kokeilla eri arvoja ja nähdä kuinka se vaikuttaa tarkkuuteen.
Yhteenveto
Tässä opetusohjelmassa opit rakentamaan hermoverkkoa. Neuroverkko vaatii:
- Piilotettujen kerrosten määrä
- Täysin yhdistetyn solmun lukumäärä
- Aktivointitoiminto
- Optimizer
- Lukumäärä
TensorFlow ANN:ssa voit kouluttaa hermoverkkoa luokitteluongelmiin seuraavilla tavoilla:
- tf.estimator.DNNClassifier
Arvioijan on määritettävä:
- feature_columns=feature_columns,
- piilotetut_yksiköt=[300, 100]
- n_classes=10
- malli_hakemisto
Voit parantaa mallia käyttämällä erilaisia optimoijia. Tässä opetusohjelmassa opit käyttämään Adam Grad -optimoijaa oppimisnopeudella ja lisäämään säätimen liiallisen sovituksen estämiseksi.