Tekoälyn ohjelmointi Pythonilla

Oppimispäiväkirja syväoppimisesta, eli kuinka opin ohjelmoimaan neuroverkkoja Pythonilla, fast.ai:lla ja PyTorchilla.

Blogin lähdekoodi on GitHubissa plassi/tekoalyn-ohjelmointi-pythonilla

11 March 2021

Konenäkö v1.0 - osa 1 - Karhuntunnistin konvoluutioneuroverkolla

kirjoittanut Lassi Puurunen

Tästä alkaa artikkelisarja, jossa käydään läpi yksinkertaisen konenäön, eli konvoluutioneuroverkon kouluttaminen fast.ai:lla. Artikkelin lähdekoodi on saatavilla Google Colab -projektina. Colab -ympäristössä voit kopioda koodin itsellesi ja ajaa sitä Googlen palvelimella. Tekemällä koodiin pieniä muutoksia, voit toteuttaa haluamasi konenäköä käyttävän luokittelijan. Projekti perustuu fastbookin 2.luvun materiaaleihin.

Open In Colab
Yläpuolella olevasta napista saat projektin lähdekoodin auki Colabissa.

Karhuntunnistin

Jos vastaasi tulee karhu, on sen lajista kolme vaihtoehtoa. Karhu voi olla metsässä liikkuva ruskeakarhu. Toisaalta karhu voi olla jääkarhu, joita legendan mukaan liikkuu Helsingin kaduilla. Yleisesti kotiympäristöissä tavattu karhulaji on kuitenkin teddykarhu, johon sen metsässä tai Helsingin kaduilla tavattavia heimotovereita ei tule sekoittaa. Onneksi tällaisten, mahdollisesti vaarallisten sekaannusten mahdollisuutta voidaan ehkäistä tekoälyn avulla.

Artikkelisarjassa toteutettava konvoluutioneuroverkko luokittelee kuvia sen perusteella, esiintyykö kuvassa ruskeakarhu, jääkarhu vai teddykarhu.

Koodia kannattaa kokeilla aina ohjelmointia opiskellessa itse, sillä se on tehokkain keino oppia ja oivaltaa järjestelmien toimintaa.

Tässä sarjan ensimmäisessä artikkelissa tutustutaan aluksi keinotekoisen neuronin, sekä monikerroksisen- ja konvoluutioneuroverkon rakenteisiin. Nämä kaikki ovat matemaattisia malleja, mutta mikäli matematiikka ei ole leipälajisi, ei syytä huoleen. Sarjassa ei matematiikka ole pääosassa, vaan tarkoituksena on toteuttaa konenäkö mahdollisimman käytännönläheisesti.

Keinotekoinen neuroni

Tutustutaan pikaisesti neuroverkkojen perusosiin. Kuvassa 1 on esitetty biologisen neuronin kaavio. Kuten biologisessa neuronissa on neuronien välillä eri vahvuiset yhteydet ja aksonissa signaalia kuljettava toimintapotentiaali, on keinotekoisessa neuronissa painotetut sisääntulevat kaaret sekä summa- ja siirtofunktiot.

Biologinen neuroni Kuva 1. Biologisen neuronin kaavio

Kuvasta 2 nähdään keinotekoisen neuronin kaavio. Keinotekoiseen neuroniin syötetään signaalit (X1, X2, Xn..) ja jokainen signaali kerrotaan sisään menevien kaarien painoilla (w1, w2, w3). Painotetut signaalit lasketaan summafunktiossa yhteen ja ulosmenevä signaali “suodatetaan” mallin arkkitehtuuriin valitulla siirtofunktiolla, jonka tehtävä on varmistaa esimerkin funktiossa, että syöte pysyy 0:n ja 1:n välissä.

Keinotekoinen neuroni Kuva 2. Keinotekoisen neuronin kaavio

Konvoluutioneuroverkon solmut ovat keinotekoisia neuroneja.

Konvoluutioneuroverkko

Konvoluutioneuroverkko on saanut inspiraationsa biologisesta näköhermostosta ja sitä sovelletaan konenäköön. Konenäköä voidaan käyttää muuhunkin kuin varsinaisten kuvien luokitteluun, sillä monenlaista tietoa voidaan esittää kuvana. Konenäkö kykenee esimerkiksi äänen tunnistukseen sen kuvan perusteella. Toisaalta esimerkiksi tiedoston tiivisteistä voidaan muodostaa kuvia ja konenäön avulla tunnistaa niistä haittaohjelmia.

Konvoluutioneuroverkko perustuu monikerroksiseen, yhdensuuntaiseen, vahvasti yhtenäiseen neuroverkkoon. Yhdensuuntaisuus tarkoittaa tässä, että verkossa tieto liikkuu vain yhteen suuntaan. Vahva yhtenäisyys tarkoittaa, että kerroksessa kukin neuroni on yhteydessä seuraavan kerroksen jokaiseen neuroniin. Neuroverkko on näiden ominaisuuksien lisäksi painotettu, eli siinä on solmujen välisillä kaarilla jokin paino. Nämä painot, eli neuronien välisten yhteyksien “vahvuudet” ja niiden muuttaminen on keskeisessä asemassa neuroverkon kouluttamisessa.

Monikerroksinen neuroverkko Kuva 3. Monikerroksinen neuroverkko

Kuvassa 3 on esitetty monikerroksisen neuroverkon rakenne. Kuvassa vasemman puoleiset pisteet ovat solmuja sisään menevälle datalle, eli niistä muodostuu syötekerros. Toisena välissä on kolmen neuronin ns. piilotettu kerros. Kolmantena on kahdesta neuronista koostuva tulostekerros, josta luetaan neuroverkon ennusteet.

Todellisuudessa käytetyt mallit ovat kuitenkin huomattavasti suurempia. Karhuntunnistimessa koulutusdatan kuvien sivun koko on 128 pikseliä, joten sisäänmeneviä solmuja on 128 x 128 = 16384. Piilotettuja kerroksia on syväoppivassa neuroverkossa kymmenistä satoihin, mistä käsite syväoppiminen tulee. Tulostekerroksessa solmuja on yhtä monta, kuin neuroverkolle on koulutettu luokkia, karhuntunnistimessamme niitä on kolme, yksi jokaista lajia kohti.

Konvoluutioneuroverkko poikkeaa itse asiassa tavanomaisesta monikerroksisesta neuroverkosta siten, että osa sen kerroksista on konvoluutio- ja pooli-kerroksia. Tämä aihe vaatii täysin oman käsittelynsä, mutta siitä saa hyvin kiteytettynä tietoa tästä Youtube-videosta.

Lopuksi

Raapaisimme nyt kevyesti pintaa teorian osalta siitä, mistä neuroverkoissa on kyse. Tätä tietoa ei kuitenkaan artikkelisarjassa käytännössä tarvita, sillä kaikki matematiikka on pitkälle kehitetyissä fast.ai:n kirjastoissa piilotettu käyttöliittymän alle. Pyrin kuitenkin avaamaan, mitä eri vaiheissa pinnan alla tapahtuu.

Seuraavassa artikkelissa siirrytään tarvittaviin perustyökaluihin, sekä niiden käyttöönottoon.

Heräsikö artikkelista ideoita, ajatuksia, kysymyksiä? Ehkä korjausehdotuksia? Kirjoita alla olevaan kommenttilaatikkoon tai lähetä yksityisesti vaikka LinkedIn-viestinä.

Linkkejä

  1. fastbook/01_intro.ipynb - fastbookin luku, jossa on neuroverkon historiaa ja teoriaa
  2. A friendly introduction to Convolutional Neural Networks and Image Recognition - Video, jolla on selitetty hyvin, kuinka konvoluutioneuroverkko toimii
  3. Wikipedia: Syväoppiminen
  4. Datanamin artikkeli - Tekoälyn termistöä

Kuvien lähde Wikimedia Commons

tagit: konvoluutioneuroverkko - teoriaa