JAANA KORPELA KÄSINKIRJOITETTUJEN NUMEROIDEN TUNNISTUS NEU- ROVERKKOJEN AVULLA Kandidaatintyö Tarkastaja: Simo Ali-Löytty Tarkastaja: Henri Hansen Palautettu 19.5.2016
i TIIVISTELMÄ JAANA KORPELA: Käsinkirjoitettujen numeroiden tunnistus neuroverkkojen avulla Tampereen teknillinen yliopisto Kandidaatintyö, 16 sivua, 3 liitesivua Toukokuu 2016 Tekniikan ja luonnontieteiden TkK-tutkinto-ohjelma, Teknis-luonnontieteellinen Pääaine: matematiikka Tarkastajat: Simo Ali-Löytty ja Henri Hansen Avainsanat: neuroverkot, deep learning Tässä kandidaatintyössä tutustaan neuroverkkojen toimintaan ja miten niitä käytetään deep learningissa. Neuroverkot muistuttavat hermoston kaltaisia systeemejä, jotka sisältävät neuroneita, joita voidaan opettaa tunnistamaan muun muassa tekstiä, numeroita ja ääntä. Deep learning on syvää oppimista, mikä tarkoittaa neuroverkkojen tapauksessa sitä, että opetetaan sellaista verkkoa, jossa neuronit on asetettu useampaan kerrokseen. Syötettävä signaali kulkee tällöin useamman neuronin läpi. Tässä työssä käytetään Matlab-ohjelmiston työkalua, jota voidaan käyttää kuvantunnistuksessa. Työkalun avulla voidaan luoda tietokoneohjelma, joka tunnistaa esimerkiksi käsinkirjoitettuja numeroita. Ohjelmalle opetetaan alussa käsinkirjoitettuja numeroita ja sen jälkeen syötetään testinumerot, joista ohjelma pyrkii tunnistamaan kaikki.
ii ALKUSANAT Tämä tekniikan kandidaatintyö on tehty Tampereen teknillisen yliopiston Matematiikanlaitokselle. Kiitän kandidaatintyön ohjaajia ja tarkastajia TkT Simo Ali- Löyttyä ja TkT Henri Hansenia avusta työn tekemisessä sekä mahdollisuudesta tutustua kiinnostavaan aiheeseen.
iii SISÄLTÖ 1. Johdanto.................................... 1 2. Teoria...................................... 2 2.1 Neuroverkot................................ 2 2.2 Deep learning............................... 5 2.3 Käyttökohteet............................... 7 3. Kuvan tunnistus................................ 9 3.1 Käytettävä data.............................. 9 3.2 Kerrokset................................. 10 3.3 Toiminta.................................. 12 3.4 Visuaalinen tulos............................. 12 3.5 Tulosten kehitys ja hienosäätö...................... 13 3.6 Matlab: Neural Network -työkalu.................... 14 3.7 Testaus.................................. 15 4. Yhteenveto................................... 16 Lähteet....................................... 17 LIITE A. Matlab-koodi.............................. 19
iv LYHENTEET JA MERKINNÄT a b k f g N n p m P ( ) R s ij tanh( ) u k v k w kj x kj x j y k ϕ( ) sigmoidfunktion parametri, joka määrittää s-käyrän kaarevuuden vakiotermi, joka on lisätty neuroniin k funktio funktio luonnollisten lukujen joukko piilotetun kerroksen koko syötteiden lukumäärä todennäköisyys reaalilukujen joukko sekaannusmatriisin alkio hyperbolinen tangenttifunktio neuronin k syötesignaalien summa aktivaatiofunktiolle syötettävä signaali synaptinen paino synapsille j, joka liittyy neuroniin k syötesignaali, kun neuronilla k useampi sisääntulosyöte syötesignaali ulostulon signaali neuronin k aktivaatiofunktio
1 1. JOHDANTO Ihmisen aivoja voidaan verrata todella tehokkaaseen tietokoneeseen. Kun ihminen näkee esineen, kirjaimen tai numeron, pystyy hän omien assosiaatioidensa perusteella tunnistamaan tämän. Nähdyn kohteen ominaisuuksien, kuten käsialan tai esineen värin, ei tarvitse olla täysin samat kuin aiemmin nähdyllä, mutta niistä voidaan silti tunnistaa esimerkiksi eri kirjaimet tai kohteena oleva esine ja jaotella ne näiden perusteella eri luokkiin. Neuroverkot ovat keinotekoisesti luotuja systeemejä, jotka muistuttavat rakenteeltaan ihmisten ja eläinten hermostoja. Deep learningissa eli syväoppimisessa neuroverkkoa opetetaan tunnistamaan eri asioita. Neuroverkkojen ja Deep learningin avulla pyritään luomaan tietokoneella malli, joka jäljittelee ihmisaivoja ja niiden tunnistustaitoja esimerkiksi kuvantunnistuksessa. Tietokone pystyy tällöin luokittelemaan kohteita, kuten digitaaliseen muotoon muutettuja numeroita ja esineitä, eri luokkiin kohteiden ominaisuuksien perusteella laskennallisten menetelmien avulla. Kohteet voidaan muuttaa digitaaliseen muotoon esimerkiksi digikuvaamalla ne. Ennen kuin ohjelma tunnistaa kohteita, tietokoneohjelmalle opetetaan erilaisia ominaisuuksia syöttämällä luodulle neuroverkolle opetustiedostoja, jotta neuroverkko voi esimerkkien pohjalta muodostaa yleisen luokitteluperiaatteen kohteiden eri ominaisuuksille. Oppimisen jälkeen neuroverkko voi luokitella tunnistettavan asian omaan luokkaansa. Tiedoston, jonka luokkaa yritetään selvittää, kutsutaan syötetiedostoksi. Syötetiedosto ja opetustiedosto ovat muodoltaan samankaltaisia, mutta opetustiedostojen oikea luokka tunnetaan ja sitä hyödynnetään neuroverkkojen opetuksessa.
2 2. TEORIA 2.1 Neuroverkot Neuroverkot ovat keinotekoisesti luotuja hermoston kaltaisia verkostoja, joiden avulla pyritään mallintamaan biologista hermostoa ja sen tietojenkäsittelyä. Verkot koostuvat neuroneista, jotka on yhdistetty toisiinsa liitosten avulla. Neuronit ovat keinotekoisia hermosoluja, ja liitokset vastaavat biologisen hermoston synapseja [1]. Synapsit kuljettavat tiedon neuronilta toiselle, joko suoraviivaisesti verkostossa edeten tai verkostossa palaten alkupään neuroneille, riippuen neuroverkon käyttötarpeista ja rakenteesta. Yleisin rakenne on eteenpäin tietoa syöttävä verkko (englanniksi feed forward network). Neuroverkot sisältävät eri kerroksia, kuten sisään- ja ulostulokerrokset, jotka ovat neuroverkkojen näkyvät uloimmat kerrokset. Uloimpien kerrosten välille jää piilotettuja kerroksia, joiden läpi mennessään signaali muokkautuu sellaiseen muotoon, josta tietokone pystyy alkuperäisestä signaalista tunnistamaan haluttuja asioita. Neuroneille syötetään dataa numeerisessa muodossa, jolle verkko laskee ulostulon annetulle datapisteelle. Ulostulot voidaan jaotella eri luokkiin neuroneille opetettujen ominaisuuksien perusteella. Opetus tapahtuu opetusdatan avulla, joka koostuu pareista, joissa on data ja toivottu ulostulo. Opetuksen aikana neuroni alkaa tunnistamaan toivotuista ulostuloista tiettyjä ominaisuuksia, joiden perusteella neuroni tunnistaa myöhemmin samankaltaisesta datasta opetetut ominaisuudet mahdollisimman hyvin. Opetusdatana voidaan käyttää kuvia, kun kyse on kuvantunnistuksesta. Neuronit voidaan jaotella eri kerroksiin, jolloin tieto muotoutuu monen eri neuronin yhdistävän synapsin läpi. Kuvassa 2.1 on neuroverkko, jossa signaali etenee verkossa tiettyyn kulkusuuntaan. Neuroverkkoon on merkitty sisään- ja ulostulo sekä väliin jäävä piilotettu kerros. Piilotetun kerroksen toiminta ei näy neuroverkossa ulospäin, mutta kyseisessä kerroksessa tapahtuu oppiminen ja ulostulevan signaalin laskeminen. Usean kerroksen neuroverkossa tietyn neuronin ulostulo voi olla toisen neuronin sisääntulosyöte.
2.1. Neuroverkot 3 Sisääntulo x k1 Sisääntulokerros Piilotettu kerros Ulostulokerros Sisääntulo x k2 Sisääntulo x k3 Ulostulo y k Sisääntulo x k4 Sisääntulo x k5 Kuva 2.1 Esimerkkineuroverkossa kerroksista näkyviä ovat ainoastaan sisään- ja ulostulokerrokset. Väliin jäävä kerros hidden on piilotettu kerros. Neuroverkoissa eri kerrosten lukumäärä ja alkioiden määrä saattavat vaihdella, esimerkiksi ulostuloja voi joissakin tapauksissa olla useampikin. Tarkastellaan neuroverkon yksittäistä neuronia. Neuroni koostuu rakenteeltaan synapseista, jotka määrittävät synaptisen painon kahden eri neuronin välillä, summaajafunktiosta ja aktivaatiofunktiosta [2, 3]. Kuvassa 2.2 on havainnoillistettu nämä osat ja niiden yhteys. Neuronin summaajafunktio laskee yhteen kaikkien syötesignaalien ja näiden synaptisten painojen tulot, jonka jälkeen tieto siirtyy aktivaatiofunktiolle ϕ( ). Summaksi saadaan u k = m w kj x j kaikilla k {1, 2,..., n p } (2.1) j=1 missä w kj R on synaptinen paino sisääntulolle j neuronissa k, m on sisääntulevien signaaleiden lukumäärä, n p on piilotetussa kerroksessa olevien neuroneiden lukumäärä ja x j R sisääntulosignaali signaalille j. Summaajafunktiosta signaali jatkaa matkaa aktivaatiofunktiolle. Sisääntulosignaalien lisäksi summaajafunktioon liittyy myös vakiotermi b k R, joten aktivaatiofunktiolle menevässä signaalissa ovat mukana sekä summatut sisääntulosignaalit että vakiotermi.
2.1. Neuroverkot 4 Sisääntulot x 1 w k1 Vakiotermi b Aktivaatiofunktio x 2 w k2 Σ ϕ( ) Ulostulo y k x j w kj Painot Kuva 2.2 Neuronissa sisääntulosignaalit saavat synaptiset painot ja siirtyvät tämän jälkeen summaajafunktiolle yhteenlaskettavaksi. Yhteenlaskuun tulee mukaan vakiotermi b. Tämän jälkeen signaali siirtyy aktivaatiofunktion kautta ulostuloon y k. Yksi neuroni vastaa kuvassa 2.1 olevaa ympyrää. Aktivaatiofunktiolle siirtyvää signaalia voidaan merkitä v k = m w kj x j + b k = u k + b k, v k R. (2.2) j=0 Ulostulon signaali y k R määräytyy aktivaatiofunktion ϕ, vakiotermin b k ja sisään tulevan summan u k perusteella kaavalla y k = ϕ (u k + b k ) = ϕ (v k ). (2.3) Aktivaatiofunktioita on olemassa useita erilaisia käyttökohteesta riippuen. Funktiot voidaan karkeasti jakaa kolmeen esimerkkiryhmään, joiden tyyppisiä aktivaatiofunktiot usein ovat. Ensimmäisessä esimerkissä funktio saa arvoja epälineaarisesti nollan tai ykkösen yksikköaskelfunktion tavoin. Funktion voi tällöin kirjoittaa muodossa ϕ(v) = { 1, kun v 0 0, kun v < 0. (2.4) Muissa tyyppiesimerkeissä funktio on joko paloittain määriteltynä tai sigmoidisena funktiona, jolloin kuvaaja funktiolle muodostaa s-käyrän. Paloittain määriteltynä aktivaatiofunktio on esimerkiksi muotoa 1, kun v 1 2 ϕ(v) = v + 1 2, kun 1 < v < 1 2 2 0, kun v 1 2 (2.5)
2.2. Deep learning 5 ja sigmoidiselle funktiolle ϕ(v) = 1 1+exp( av), (2.6) missä a R on sigmoidfunktion parametri, joka vaikuttaa siihen, miten jyrkkä funktion käyrä on. Mitä pienempi parametrin a itseisarvo on, sitä loivempi s-käyrä muodostuu kuvaajaan. Aktivaatiofunktio on tyyppiesimerkeissä saanut arvoja aina nollan ja yhden väliltä, mutta joissakin tapauksissa funktio voi saada arvoja myös välillä [ 1, 1]. Funktion on hyvä olla yksinkertaisesti laskettava ja derivoitava, jotta dataa olisi helppo käsitellä neuronissa ja tarvittaessa kehittää neuroverkon toimintaa. Numeroiden tunnistuksessa aktivaatiofunktiona voidaan käyttää esimerkiksi hyperbolista tangenttifunktiota [4] ϕ(v) = tanh(v). (2.7) Hyperbolinen tangenttifunktio sopii hyvin aktivaatiofunktioksi symmetrisyytensä ansiosta. Lisäksi aktivaatiofunktion valinnassa on otettava huomioon, että funktio on derivoituva, mikäli käytetään opetusmenetelmänä esimerkiksi Backpropagationalgoritmia. Algoritmin avulla voidaan hienosäätää neuroverkkoa toimimaan paremmin ja tunnistamaan haluttuja asioita suuremmalla todennäköisyydellä oikeaan luokkaan. Kuvassa 2.3 näkyy, miten eteenpäin etenevän ja Backpropagation-algoritmin mukaisesti takaisin palaavan funktion käsittelyn ero on. Jotta Backpropagationin käytön jälkeen voidaan palata liikkumaan eteenpäin, on symmetrisyydestä derivoinnissa etua. Kuvassa 2.4 havainnoidaan, miten signaali liikkuu neuroverkossa Backpropagation-algoritmin tapauksessa funktioiden f ja g avulla. 2.2 Deep learning Deep learningissa, eli syväoppimisessa, käytetään hyväksi neuroverkkoja tiedon käsittelyssä, koska ne soveltuvat hyvin deep learningin käyttötarkoitukseen verkostomaisuutensa ansiosta [5]. Syvää neuroverkon oppimisesta tekee se, että signaali kulkee monen eri neuronin läpi. Jokainen neuroni muokkaa signaalia omalla menetelmällään ja koko verkon läpi mennyt ulostulosignaali on muokkautunut kaikkien läpäistämiensä neuronien vaikutuksesta. Ennen kuin ohjelmalla voidaan käydä läpi testisyötteitä, tulee sille syöttää opetusdata. Opetus tapahtuu tällöin neuroverkon jokaisessa kerroksessa, jolloin oppimisesta tulee syvää. Ohjelma voi jaotella eri kerroksissa olleiden neuroneiden muokkaaman ulostulosyötteen luokkaansa sen mukaan, minkä luokan piirteitä sillä on eniten.
2.2. Deep learning 6 Kuva [6] 2.3 Eteenpäin etenevän ja takaisin palaavan signaalin ero funktioiden käsittelyssä. Tietokoneen tunnistamista kuvista voidaan luoda sekaannusmatriisi, joka havainnoi, miten hyvin ohjelma on tunnistanut esimerkiksi käsinkirjoitettuja numeroita. Matriisin riveille on jaoteltu tunnistettujen numeroiden lukumäärät niin, että ne on sarakkeittain jaoteltu niihin luokkiin, missä niiden pitäisi olla. Tällöin matriisin diagonaaliakselille muodostuu arvoiltaan isoimmat alkiot ja mikäli näin ei ole, ei ohjelma ole oppinut täysin luokkien eri ominaisuuksia, jotta jaottelu olisi mahdollista. Alkioihin on merkitty myös prosentuaaliset osuudet, jotta eri matriisien vertailu on helpompaa. Sekaannusmatriisii on neliömatriisi, ja se on muodoltaan s 11 s 12 s 13... s 1j s A = 21 s 22 s 23... s 2j....... s i1 s i2 s i3... s ij, (2.8) missä jokainen alkio on muotoa s ij N. Alaindeksi i viittaa ohjelman ulostulon luokkaan ja j testisyötteiden tavoiteluokkaan. Tavoitteena on saada alkioita vain diagonaaliakselille, jolloin todennäköisyydet alkioiden paikoille riveittäin ja sarakkeittain ovat P (s ij = 1) = 1, kun i = j ja P (s ij = 1) = 0, kun i j. Haasteita opetukseen tuo eri ominaisuuksien keskinäiset erilaisuudet. Esimerkiksi käsinkirjoitettujen numeroiden tunnistuksessa erilaisia käsialoja on olemassa erilaisia ihmisestä riippuen. Myös eri numeroita voidaan kirjoittaa eri tavoilla.
2.3. Käyttökohteet 7 Sisääntulo x k1 Sisääntulokerros Piilotettu Ulostulokerros kerros Virhe: paluu takaisin Sisääntulo x k2 Virhe Sisääntulo x k3 Sisääntulo x k4 Sisääntulo x k5 Kuva 2.4 Neuroverkossa virheen tapahtuessa Backpropagation-algoritmin toimintaperiaatteen mukaan verkko käyttää hyväkseen tietoa, mikä kuuluisi olla oikea suunta sisääntulolle ja vie signaalin takaisin, jotta signaali päätyisi oikeaa reittiä ulostulolle. Numero seitsemän voidaan kirjoittaa joko kahtena erisuuntaisena suorana tai poikittaisen viivan kanssa ja numero yksi joko yhtenä suorana viivana tai kahtena terävän kulman muodostamana viivana, joista toinen on lyhyempi. Numerot ovat yleisesti samankaltaisia, joten eri käsiala tuo enemmän haasteita käsinkirjoitetun tekstin tunnistamiseen. Eri kirjaimia voidaan kirjoittaa lukuisin eri tavoin ja kirjoitustyylikin saattaa vaihdella aikakausien mukaan. Jotta eri ihmisten kirjoittamia numeroita ja kirjaimia voidaan tunnistaa, tarvitaan opetuskuviin monien testihenkilöiden käsialalla kirjoittamia numeroita ja tekstiä. 2.3 Käyttökohteet Neuroverkkoja ja deep learningia voidaan käyttää niin kutsutussa tekoälytutkimuksessa, kun halutaan opettaa tietokonetta tunnistamaan erilaisia asioita. Esimerkkejä tästä ovat rekisterikilpien tunnistus [7], itsestään ajavat älyautot ja numeroiden tunnistus. Eri asioita pystytään siis tunnistamaan ja luokittelemaan myös hyvin käytännöllisellä tasolla. Neuroverkkojen ja deep learningin avulla pystytään kuvantunnistuksen lisäksi tunnistamaan myös puhetta [8]. Tässä kandidaatintyössä tutustutaan tarkemmin käsinkirjoitettujen numeroiden tunnistukseen, johon voidaan käyttää apuna Mathworkilta valmiiksi löytyvää materiaalia.
2.3. Käyttökohteet 8 Kuva 2.5 Itsestään ajamaan oppinut älyauto tunnistaa jalankulkijat kuvasta syöttämällä autolle useita kuvia ja nopeustietoja jalankulkijoista. Tunnistetut jalankulkijat on merkitty sinisellä laatikolla. [11] Viime aikoina esimerkiksi älyautojen kehityksessä on käytetty deep learningia. Tavoitteena älyautojen toiminnassa on, että sillä pystyisi ajamaan niin, että autossa ei tarvitsisi muuta kuin ilmoittaa, minne on menossa. Esimerkiksi Google on tuonut markkinoille älyauton, jonka toimintamalleista yhtiö on tehnyt omat sivunsa [9]. Auton pitää liikenteessä pystyä tietämään auton sijainti, mitä ympäriltä löytyy sekä arvioimaan mitä seuraavaksi tapahtuu ja mitä auton pitäisi tilanteessa tehdä. Sijainnin paikannukseen älyauto käyttää navigaattoria ja etsii merkkejä ympäristöstään entistä tarkemman sijainnin määrittämiseksi. Ympäristössä olevien muiden ajoneuvojen, pyöräilijöiden ja jalankulkijoiden tunnistukseen auto käyttää kuvantunnistusta, joka arvioi liikkuvat kohteet eri luokkiin nopeuden, koon ja muiden ominaisuuksien mukaan [10]. Kuvassa 2.5 on esitetty, miten älyauto tunnistaa jalankulkijat kuvan perusteella. Samalla tavalla auton tietokone tunnistaa muutkin kulkuvälineet laatikkomaisina liikkuvina kappaleina. Erilaisten tilanteiden arvioimiseen auto käyttää opittuja malleja, kuten liikennesääntöjä ja tietokoneelle opetettuja yleisiä tapoja, mitä ihminen tekee itse ajaessaan liikenteessä. Tapojen ja eri asioiden tunnistamiseen tarvittavien kuvien opettamisessa on käytetty lukuisia esimerkkejä, jotta tietokone tunnistaa yllättäviäkin tilanteita liikenteessä ja älyauto osaisi täten reagoida näihin oikein. Liikennesääntöjen lisäksi autoille opetetaan myös ihmisten tekemiä yleisiä ratkaisuja liikenteessä, koska tavallisesti ajaessaan ihminen ei aina seuraa liikennesääntöjä tarkalleen.
9 3. KUVAN TUNNISTUS Matlabilla voidaan koodata ohjelma, jossa voidaan hyödyntää Matlabissa valmiina olevaa neuroverkkojen työkalua. Sen avulla tehdyn ohjelman avulla voidaan esimerkiksi tunnistaa käsinkirjoitettuja numeroita. Ohjelma opettelee käsinkirjoitettujen numeroiden avulla tunnistamaan numeroita, jonka jälkeen ohjelma tunnistaa numerot itse todennäköisyyksien avulla. Matlabilla on valmiina numeroiden tunnistamiseen johdatteleva demo, jonka esimerkin avulla on mahdollista tutustua neuroverkkojen toimintaan ja luoda oman koodin numeroiden tunnistamista varten. Mathworksin valmiina olleen esimerkkikoodin pohjalta tehty koodi löytyy työn liitteestä A. 3.1 Käytettävä data Matlabilla on valmiina olemassa testimateriaalia. Aloitettaessa kokonaan uutta opetusta, kuten numeroiden tunnistusta kuvasta, Matlabiin syötetään testitiedostoiksi sisääntulotiedostot ja tavoitetiedostot. Molemmat syötetään Matlabiin joko pystytai vaakavektorimuodossa, eli neuroverkkoon sisääntuleva tieto on vektorimuotoista. Kuvassa 3.1 on esitetty Matlabiin valmiiksi syötettyjä numeroita, jotka pystyy numeroiden tunnistamiseen johdattelevassa demossa opettaa luoduille neuroverkoille. Opetettava data sisältää kuvan ja tiedon siitä, mikä numero kyseisessä kuvassa kuuluu olla. Syötetyt numerokuvat ovat satunnaisessa järjestyksessä ja sisältävät jokaiselle numerolle suuren määrän esimerkkikuvia. Kuvat ovat 28 x 28 pikselin kokoisia, eli sisältävät yhteensä m = 784 pikseliä. Matlabissa ajetussa esimerkissä opetettiin 5000 kuvaa ensimmäiselle kerrokselle. Syötettäessä eri opetuskuvia kerroksille kuvien todellista numeroa ei kuitenkaan vielä käytetä.
3.2. Kerrokset 10 Kuva 3.1 Testikuvina käytetään käsinkirjoitettuja numeroita. Kuvassa on pieni osa ohjelmalle opetetuista numeroista. Kuva 3.2 Ensimmäinen autoenkooderi, joka muuttaa kuvan 784 pikselin kokoisesta sisääntulosta 100 pikselin kokoiseksi. 3.2 Kerrokset On olemassa neuroverkkoja, jotka pyrkivät toistamaan ulostulossa saman, kuin mitä sisääntulossa niihin syötettiin. Näitä neuroverkkoja kutsutaan autoenkoodereiksi (eng. autoencoder). Syötetty signaali muuttuu piilotetussa kerroksessa autoenkooderin vaikutuksesta, useimmiten se muokataan pienemmäksi. Kuvassa 3.2 näkyy, miten autoenkooderi toimii. Signaali syötetään autoenkooderiin, missä se synaptisen painon vaikutuksen ja vakiotermin summaamisen jälkeen siirtyy aktivaatiofunktiolle. Luvut m = 784 ja n p = 100 viittaavat numeroiden tunnistuksessa kuvan pikseleihin. Kuvasta siis tehdään paljon pienempi ja epätarkempi ihmisen silmään. Tällä tavalla ohjelma pyrkii selvittämään kuvista tärkeimmät piirteet.
3.2. Kerrokset 11 Kuva 3.3 Toinen autoenkooderi, joka muuttaa kuvan 100 pikselin kokoisesta sisääntulosta 50 pikselin kokoiseksi. Kuva 3.4 Luokittelijalle opetetaan 50 pikselin kokoisia opetuskuvia, joiden mukana on tieto, mihin luokkaan mikäkin kuva kuuluu. Numeroiden tunnistuksen tapauksessa luokat ovat 0, 1, 2, 3, 4, 5, 6, 7, 8 ja 9. Numero 0 luokitellaan poikkeuksellisesti numerona 10, kun taas muut numerot ovat samannimisissä luokissa. Autoenkooderissa käytetään aktivaatiofunktiona sigmoidista funktiota (2.6) dekooderissa, joka muuntaa funktion takaisin alkuperäiseen kokoonsa. Halutessaan autoenkooderin enkooderissa ja dekooderissa voi käyttää myös eri funktioita. Ensimmäisen kerroksen jälkeen ohjelma tunnistaa jo jonkin verran numeroiden eri piirteitä, mutta niistä oikein ei mene läheskään yhtä moni, kuin menisi, jos tiedot menisivät kahden eri kerroksen läpi. Ensimmäisen kerroksen jälkeen kuvat ovat todella sumeita, joten toisessa kerroksessa neuroverkko käsittelee pienempiä kuvia, jotka ensimmäisen kerroksen decoder muutti takaisin isoksi kuvaksi. Kuvassa 3.3 nähdään, miten neuroverkolle opetetaan 100 pikselin kokoisia kuvia, jotka se muuttaa 50 pikselin kokoisiksi. Kerros muuttaa yksin käytettäessään kuvat takaisin 100 pikselin kokoisiksi, joista se pystyy sumeista piirteistä arvioimaan eri ominaisuuksien mukaan, mitä numeroita mikäkin kuva esitti. Jotta ohjelma voisi tietää, mikä numero kuvassa oli, tarvitaan vielä yksi kerros, jolle opetetaan myös tämä taito. Tätä kerrosta kutsutaan luokittelijaksi, joka tunnetaan Matlabissa Softmax layerina. Luokittelija on esitettynä kuvassa 3.4.
3.3. Toiminta 12 Kuva 3.5 Deep learningia hyödyntävä neuroverkko, jossa on yhdistetty kaikki kerrokset, jotka aiemmin ohjelmassa luotiin. Luokittelija jakaa siihen syötetyt kuvat niihin luokkiin, mihin ne kuuluvat, eli oikeat numerot oikeisiin ryhmiin. Softmax -kerrokseen päästyään kuvaa on voitu pienentää alkuperäisten kuvien ja luokittelijalle syötettyjen kuvien koosta riippuen 758 pikselistä 50 pikseliin, jolloin kuva ei näytä enää läheskään samalta. Luokittelijan on mahdollista erotella kuvat oppimansa mukaan ja oppimaan samassa luokassa olevien kuvien yhteisiä ominaisuuksia. 3.3 Toiminta Kun kerrokset on luotu, voidaan kerrokset yhdistää, jotta deep learningia voidaan hyödyntää ohjelmassa. Luotujen kerrosten välillä on yhteys kuvien kokojen välillä. Neuroverkkojen oppiminen muuttuu syväksi, kun eri kerrokset yhdistetään ja testidata laitetaan menemään kaikkien kerrosten läpi, kuten kuvassa 3.5 on tapahtunut. Testitiedostot ovat samanmuotoisia kuin opetustiedostot, mutta eivät kuitenkaan samoja. Kerroksille on valmiiksi opetettu eri kuvia ja ne luokittelevat testitiedostot omiin luokkiin aikaisemmin oppimiensa ominaisuuksien perusteella. 3.4 Visuaalinen tulos Ohjelma tunnistaa numerot täysin syötettyjen kuvien perusteella. Syötetyt kuvat muuttuvat pienemmiksi ja sumeammiksi jokaisen kerroksen läpäistyään. Kuvassa 3.6 nähdään, miltä näyttävät kahteen kertaan muuttuneet testikuvat. Kuten kuvasta 3.6 huomataan, sumeista kuvista on hankala erottaa, mikä numero alunperin kyseisessä ruudussa on ollut kyseessä. Tietokone kuitenkin oppii näiden kuvien perusteella tunnistamaan kuvia numeron muodon perusteella. Muotoa ohjelma voi analysoida esimerkiksi pinta-alan perusteella ja tilastollisin menetelmin päätellä, mikä olisi todennäköisimmin vastaava numero kuvassa olleelle numerolle. Ohjelma vertailee tällöin eri pikselien väriä ja sijaintia.
3.5. Tulosten kehitys ja hienosäätö 13 Kuva 3.6 Muutos tunnistettavien piirteiden välillä. Ensimmäisessä joukossa ovat ensimmäisen autoenkooderin läpi tulleet kuvat ja toisena toiden autoenkooderin läpi tulleet kuvat. Matlabin demossa on olemassa valmiiksi testitiedosto, jonka avulla voi testata, miten hyvin ohjelma tunnistaa luvut. Kun ohjelma on ajanut testitiedostot kaikkien kerrosten läpi, voidaan luoda sekaannusmatriisi, joka on esitetty kuvassa 3.7. Matriisista nähdään, miten hyvin ohjelma on numerot tunnistanut testauksessa olleet numerot. Ohjelma on suurimmasta osasta tunnistanut oikeat numerot. Testimateriaalimäärällä päästään 81,2 prosentin todennäköisyydellä oikeaan ratkaisuun. Matriisissa output class kertoo, minkä luvun ohjelma on arvellut olevan ja target class todellisen numeron. Eniten ohjelma on arvioinut numeroksi 5 vääriä lukuja, kun kaikkiaan vitosiksi luokittelemistaan luvuista 71,8 prosenttia olivat oikeasti lukuja 5. Eniten numeroksi viisi on veikattu numeroa 3 tai 8 samankaltaisen muodon takia. 3.5 Tulosten kehitys ja hienosäätö Ohjelma sai 81,2-prosenttisesti oikeat luokittelut testinumeroille, mutta on olemassa keinoja, joilla tulosta voidaan parantaa entisestään. Kerroksille voidaan opettaa lisää opetuskuvia, mutta helppo tapa on käyttää apuna Matlabissakin olevaa Backpropagation-algoritmia, jonka avulla pystytään minimoimaan väärin menneitä luokitteluja hyödyntämällä testikuvien tunnisteita.
3.6. Matlab: Neural Network -työkalu 14 Kuva 3.7 Sekaannusmatriisi, joka kertoo, miten hyvin ohjelma on tunnistanut testisyötteen numeroita ja mihin se on sekoittanut niitä. Opetuskuvista tehdään ensin vektoreita, jotka sijoitetaan matriisiin kuvien luokittelujen kanssa. Tämän jälkeen neuroverkkoa opetetaan vielä lisää, jolloin väärien luokittelujen määrä vähenee huomattavasti. Kuvassa 3.8 on esitetty sekaannusmatriisi hienosäädön jälkeen ja siitä huomataan, että väärin menneitä luokitteluja oli enää vain yksittäisiä ja kokonaisuudessaan oikein luokitteluista meni 91,3 prosenttia. 3.6 Matlab: Neural Network -työkalu Matlabilla on oma työkalu syvien neuroverkkojen luomiseen [12]. Työkalua voi käyttää numeroiden tunnistukseen tehtävässä ohjelmassa, mutta sitä voi hyödyntää myös muihin kuvantunnistustarkoituksiin, kuten geometristen kuvioiden tunnistukseen. Työkalulle syötetään alussa tiedostot, jossa syötetään sisääntulosyötteet ja tavoitteet, joita sisääntulosyötteet vastaavat. Näiden tietojen ja työkalun avulla neuroneille opetetaan tiedot ja kuten numeroiden tunnistuksessa, myös tässä tapauksessa
3.7. Testaus 15 Kuva 3.8 Backpropagation-algoritmin avulla voidaan hienosäätää tulosten luokittelua tehokkaammaksi. 3.7 Testaus Koodattua ohjelmaa voi testata itse skannaamalla käsinkirjoitettuja numeroita ja luomalla testitiedosto Matlabin neuroverkkotyökalun avulla. Samaan tapaan voidaan luoda myös opetustiedostoja. Koodia muuttamalla voidaan testata myös, miten esimerkiksi opetusnäytteiden lukumäärää tai piilotettujen kerroksen kokoa muuttamalla voidaan vaikuttaa tunnistettujen numeroiden prosentuaaliseen määrään. Esimerkiksi mikäli opetussyötteitä on vain 100, tunnistaa ohjelma numeroita oikein vain noin 50 prosentin todennäköisyydellä. Aktivaatiofunktion valinnalla on myös merkitystä tulosten kannalta. Nyt aktivaatiofunktiona on käytetty sigmoidista funktiota. Jotta paras tulos voidaan saada, voidaan kokeilla esimerkiksi hyperbolista tangenttifunktiota tai paloittain määriteltyjä funktioita, mikäli näillä saataisiin parempia tuloksia.
16 4. YHTEENVETO Tässä työssä tutustuttiin neuroverkkojen toimintaan, deep learningiin ja niiden käyttökohteisiin lisäksi. Matlabilla pystyttiin koodaamaan ohjelma, jossa neuroverkon neuroneille, tässä tapauksessa autoenkoodereille, opetettiin käsinkirjoitettuja numeroita. Ohjelma tunnisti käsinkirjoitetuista testikuvista suurimman osan tämän jälkeen. Oikein menneiden numeroiden tunnistusprosentti kasvoi, kun ohjelmaa hienosäädettiin Backpropagation-algoritmin avulla. Ennen hienosäätöä tunnistusprosentti oli 81,2 prosenttia ja hienosäädön jälkeen 91,3 prosenttia. Oikein tunnistettujen numeroiden prosentuaalista määrää voidaan kasvattaa esimerkiksi vertailemalla eri aktivaatiofunktioita, kasvattamalla opetusdatan määrää ja muuttamalla autoenkoodereiden kokoja.
17 LÄHTEET [1] T. Honkela, Neuroverkot: johdatus moderniin tekoälyyn, Teknillinen korkeakoulu. Saatavilla: http://%users.ics.aalto.fi/tho/stes/step96/honkela2/, viitattu 18.5.2016. [2] R. O. Duda, P. E. Hart, D. G. Stork, Pattern Classication, 2. painos, A Wiley- Interscience Publication, 2001. Saatavilla TTY:n verkossa: http://tut.eblib. com/patron/fullrecord.aspx?p=699526, viitattu 18.5.2016. [3] S. Haykin, Neural networks : a comprehensive foundation, 2. painos, Upper Saddle River (NJ) : Prentice Hall 1999. [4] M. O'Neill, Neural Network for Recognition of Handwritten Digits, 2006. Saatavilla http://www.codeproject.com/articles/ 16650/Neural-Network-for-Recognition-of-Handwritten-Digi# ActivationFunction, viitattu 18.5.2016. [5] M. Nielsen, Neural Networks and Deep Learning, 2016. Saatavilla http:// neuralnetworksanddeeplearning.com/index.html, viitattu 18.5.2016. [6] R. Rojas, Neural Networks, Luku 7, Springer-Verlag, Berlin, 1996. Saatavilla https://page.mi.fu-berlin.de/rojas/neural/chapter/k7.pdf, viitattu 18.5.2016. [7] R. Parisi, E. D. Di Claudio, G. Lucarelli, G. Orlandi, Car platerecognition by neural networks and image processing, 1998. Saatavilla https://www.researchgate.net/profile/elio_di_claudio/publication/ 3756510_Car_plate_recognition_by_neural_networks_and_image_ processing/links/0c96051cc97472e5b3000000.pdf, viitattu 18.5.2016. [8] L. Deng, G. Hinton, B. Kingsbury, New types of deep neural network learning for speech recognition and related applications: an overview, 2013. Saatavilla http://citeseerx.ist.psu.edu/viewdoc/download=10.1. 1.368.1123&rep=rep1&type=pdf, viitattu 18.5.2016. [9] Google Self-Driving Car Project, Saatavilla: https://www.google.com/ selfdrivingcar/, viitattu 18.5.2016.
18 [10] M. Harris, New Pedestrian Detector from Google Could Make Self-Driving Cars Cheaper, 28.5.2015. Saatavilla http:// spectrum.ieee.org/cars-that-think/transportation/self-driving/ new-pedestrian-detector-from-google-could-make-selfdriving-cars-cheaper, viitattu 18.5.2016. [11] A. Angelova, A. Krizhevsky, V. Vanhoucke, Pedestrian Detection with a Large- Field-Of-View Deep Network, 2015. Saatavilla http://www.vision.caltech. edu/anelia/publications/angelova15lfov.pdf, viitattu 18.5.2016. [12] Classify Patterns with a Neural Network, 2016. Saatavilla http://se.mathworks.com/help/nnet/gs/ classify-patterns-with-a-neural-network.html, viitattu 18.5.2016.
19 LIITE A. MATLAB-KOODI 1 %% Opetusdata 2 % Ladataan opetusdatana olevat käsinkirjotetut numerot 3 [opetuskuvat, opetustunnisteet] = digittrain_dataset; 4 5 % Valitaan käytettävän opetusdatan koko 6 naytemaara = 1000; %montaako opetusnäytettä käytetään,... opetuskuvia on 5000 7 opetuskuvat = opetuskuvat(1:naytemaara); 8 opetustunnisteet = opetustunnisteet(:,1:naytemaara); 9 10 %% Ensimmäinen autoenkooderi 11 % Opetuskuvat ovat kooltaan 28x28 pikselin kokoisia matriiseja, 12 % eli yhteensä 758 pikselin kokoisia. Ensimmäisen autoenkooderin 13 % piilotettu kerros on 100 pikselin kokoinen, joten autoenkooder 14 % oppii kuvasta tiivistetyn version. 15 16 rng('default') 17 piilotettu1koko = 100; % autoenkooderin piilokerroksen koko 18 19 % Tässä vaiheessa autoenkooderin opetusta ei käytetä vielä 20 % numeron kertovia tunnisteita. 21 22 autoenkooder1 = trainautoencoder(opetuskuvat, piilotettu1koko,... 23 'MaxEpochs', 100, 'L2WeightRegularization', 0.004,... 24 'EncoderTransferFunction','logsig',... 25 'SparsityRegularization', 4, 'SparsityProportion', 0.15,... 26 'Scaledata', false); 27 28 % Jokaisen kuvan tiivistetty versio otetaan seuraavan 29 % autoenkooderin opetusnäytteeksi. 30 31 tiivistetty1 = encode(autoenkooder1, opetuskuvat); 32 33 %% Toisen autoenkooderin opetus 34 % Toinen autoenkooder tiivistää opetuskuvia entisestään. 35 36 piilotettu2koko = 50; % piilotetun kerroksen koko 37 38 autoenkooder2 = trainautoencoder(tiivistetty1,piilotettu2koko,... 39 'MaxEpochs',100,... 40 'L2WeightRegularization',0.002,... 41 'EncoderTransferFunction','logsig',...
LIITE A. Matlab-koodi 20 42 'SparsityRegularization',4,... 43 'SparsityProportion',0.1,... 44 'ScaleData', false); 45 46 % Toisen autoenkooderin tiivistämä data. 47 tiivistetty2 = encode(autoenkooder2,tiivistetty1); 48 49 %% Luokittelukerros (Softmax) 50 % Luokittelukerros opetetaan tunnistamaan tiivistetyt näytteet. 51 % Tunnistamiseen käytetään opetusnäytteiden tunnisteita. 52 53 luokittelu =... trainsoftmaxlayer(tiivistetty2,opetustunnisteet,'maxepochs',400); 54 55 %% Deep learning 56 % Syväoppimisessa olemassaolevat kerrokset yhdistetään. 57 58 syvaoppiminen = stack(autoenkooder1, autoenkooder2, luokittelu); 59 60 %% Testaus 61 % Ladataan testikuvat. 62 [testikuvat, testitunnisteet] = digittest_dataset; 63 64 % Muutetaan testikuvat vektoreiksi (kuvien koko 28x28) ja tehdään 65 % niistä matriisi, joka siis sisältää kaikki testinäytteet. 66 testi = zeros(28*28,numel(testikuvat)); 67 for i = 1:numel(testikuvat) 68 testi(:,i) = testikuvat{i}(:); 69 end 70 71 % Testataan luotua neuroverkkoa. 72 y = syvaoppiminen(testi); 73 74 % Sekaannusmatriisi kertoo, mitä numeroa testikuvat oikeasti 75 % esittivät, ja mitä numeroa neuroverkko uskoo kuvien esittävän. 76 % Luokka kymmenen vastaa numeroa nolla. 77 78 figure 79 plotconfusion(testitunnisteet,y); 80 81 %% Tulosten hienosäätö 82 % Opetetaan neuroverkkoa backpropagation-algoritmin 83 % avulla. 84 85 opetus = zeros(28*28,numel(opetuskuvat)); 86 for i = 1:numel(opetuskuvat) 87 opetus(:,i) = opetuskuvat{i}(:);
LIITE A. Matlab-koodi 21 88 end 89 90 syvaoppiminen2 = train(syvaoppiminen,opetus,opetustunnisteet); 91 92 % Testataan hienosäädön jälkeen. 93 z = syvaoppiminen2(testi); 94 95 % Tulostetaan sekaannusmatriisi. 96 figure 97 plotconfusion(testitunnisteet,z);