Intuitiivinen opas konvoluutiohermoihin

Kuva Daniel Hjalmarsson on Unsplash

Tässä artikkelissa tutustumme konvoluutiohermoihin (CNN: t) ja tutkitaan korkealla tasolla, kuinka aivojen rakenne inspiroi niitä. Jos haluat lukea lisää erityisesti aivoista, artikkelin lopussa on enemmän resursseja, jotka auttavat sinua edelleen.

Aivot

Analysoimme jatkuvasti ympäröivää maailmaa. Ilman tietoista vaivaa teemme ennusteita kaikesta näkemästämme ja toimimme niiden perusteella. Kun näemme jotain, merkitsemme jokaisen esineen aiemmin oppimamme perusteella. Tämän havainnollistamiseksi katso tätä kuvaa hetkeksi.

Lähde: https://www.youtube.com/watch?v=40riCqvRoMs

Luulit todennäköisesti jotain "se on onnellinen pieni poika, joka seisoo tuolilla". Tai ehkä luulit, että hän näyttää huutavan hyökkäävän kakkua edessään.

Lähde: https://www.youtube.com/watch?v=40riCqvRoMs

Tätä me tiedämme alitajuisesti koko päivän. Näemme, merkitsemme, teemme ennusteita ja tunnustamme kuviot. Mutta miten teemme sen? Kuinka voimme tulkita kaiken mitä näemme?

Tämän luomiseksi tarvittiin luonne yli 500 miljoonaa vuotta. Silmien ja aivojen välinen yhteistyö, jota kutsutaan ensisijaiseksi visuaaliseksi polkuksi, on syy, jolla voimme ymmärtää ympäröivää maailmaa.

Visuaalinen polku. - Lähde: https://commons.wikimedia.org/wiki/File:Human_visual_pathway.svg

Näön alkaessa silmistä todellinen tulkinta näkemästä tapahtuu aivoissa, ensisijaisessa visuaalisessa aivokuoressa.

Kun näet esineen, silmäsi valoreseptorit lähettävät signaaleja näköhermon kautta ensisijaiseen visuaaliseen aivokuoreen, jossa tuloa prosessoidaan. Ensisijaisella visuaalisella aivokuorella on järkeä siihen, mitä silmä näkee.

Kaikki tämä näyttää meille hyvin luonnolliselta. Me tuskin edes ajattelemme kuinka erityistä se on, että pystymme tunnistamaan kaikki esineet ja ihmiset, joita näemme elämässämme. Aivojen hermosolujen ja neuronien syvästi monimutkaisella hierarkkisella rakenteella on tärkeä rooli tässä esineiden muistamisessa ja merkitsemisessä.

Ajattele, kuinka opimme, mikä on esimerkiksi sateenvarjo. Tai ankka, lamppu, kynttilä tai kirja. Alussa vanhempamme tai perheemme kertoivat meille välittömässä ympäristössä olevien esineiden nimen. Olemme oppineet meille annettujen esimerkkien avulla. Hitaasti mutta varmasti aloimme tunnistaa tiettyjä asioita yhä useammin ympäristössämme. Niistä tuli niin yleisiä, että seuraavan kerran kun näimme heidät, me tietäisimme heti, mikä tämän esineen nimi oli. Heistä tuli osa malliamme maailmassa.

Neuvontaverkot

Samoin kuin lapsen oppiminen tunnistamaan esineitä, meidän on näytettävä algoritmi miljoonia kuvia ennen kuin se pystyy yleistämään syötteen ja tekemään ennusteita kuville, joita se ei ole koskaan nähnyt.

Tietokoneet "näkevät" eri tavalla kuin me. Heidän maailma koostuu vain numeroista. Jokainen kuva voidaan esittää 2-ulotteisena numeroryhmänä, joka tunnetaan pikselinä.

Mutta se, että he havaitsevat kuvat eri tavalla, ei tarkoita, että emme voi kouluttaa heitä tunnistamaan kuvioita, kuten teemme. Meidän on vain ajateltava, mikä kuva on eri tavalla.

Kuinka tietokone näkee kuvan. - lähde: http://cs231n.github.io/classification/

Opettaaksemme algoritmin objektien tunnistamiseksi kuvissa käytämme erityistä keinotekoista hermoverkkoa: konvoluutiohermoverkkoa (CNN). Heidän nimensä juontaa yksi verkon tärkeimmistä operaatioista: konvoluutio.

Konvoluutiohermostoverkot ovat aivojen inspiroimia. D.H Hubelin ja T.N Wieselin 1950- ja 1960-luvuilla tehdyt tutkimukset nisäkkäiden aivoista ehdottivat uutta mallia kuinka nisäkkäät havaitsevat maailman visuaalisesti. He osoittivat, että kissan ja apinan visuaalisiin aivokuoreihin sisältyy hermosoluja, jotka reagoivat yksinomaan hermoihin suorassa ympäristössään.

Paperissaan he kuvasivat aivojen kahta visuaalisten hermosolujen perustyyppiä, jotka kukin toimivat eri tavalla: yksinkertaiset solut (S-solut) ja monimutkaiset solut (C-solut).

Yksinkertaiset solut aktivoituvat esimerkiksi silloin, kun ne tunnistavat perusmuodot viivoiksi kiinteällä alueella ja tietyllä kulmalla. Kompleksisoluissa on suurempia vastaanottokenttiä, ja niiden lähtö ei ole herkkä kentän tietylle sijainnille.

Kompleksisolut reagoivat edelleen tiettyyn ärsykkeeseen, vaikka sen absoluuttinen sijainti verkkokalvossa muuttuisi. Kompleksi tarkoittaa tässä tapauksessa joustavampaa.

Näkymässä yhden aistineuronin vastaanottava kenttä on verkkokalvon erityinen alue, jolla jokin vaikuttaa kyseisen neuronin ampumiseen (eli aktivoi hermostoa). Jokaisella aistihermosolulla on samanlaiset vastaanottokentät, ja niiden kentät ovat päällekkäisiä.

Neuronin vastaanottava kenttä. - Lähde: http://neuroclusterbrain.com/neuron_model.html

Lisäksi hierarkian käsitteellä on merkittävä rooli aivoissa. Tiedot tallennetaan kuvioiden sekvensseihin peräkkäisessä järjestyksessä. Neocortex, joka on aivojen uloin kerros, tallentaa tietoja hierarkkisesti. Se on varastoitu aivokuoren sarakkeisiin tai tasaisesti järjestettyihin neuroniryhmiin neokorteksissa.

Vuonna 1980 Fukushima-niminen tutkija ehdotti hierarkkista hermoverkkomallia. Hän kutsui sitä neokognitroniksi. Tämä malli on saanut inspiraation yksinkertaisten ja monimutkaisten solujen käsitteistä. Neokognitroni pystyi tunnistamaan kuviot oppimalla esineiden muodot.

Myöhemmin, vuonna 1998, Bengio, Le Cun, Bottou ja Haffner esittelivät konvoluutiohermostoverkot. Heidän ensimmäinen konvoluutiohermosto nimettiin LeNet-5 ja pystyi luokittelemaan numerot käsin kirjoitetuista numeroista.

Voit käydä täällä koko konvoluutiohermoverkkojen historian ajan.

Arkkitehtuuri

Tämän artikkelin loppuosassa esitän CNN: n arkkitehtuurin läpi ja esittelen myös Python-toteutusta.

Konvoluutiohermostoverkoilla on erilainen arkkitehtuuri kuin tavallisilla hermoverkoilla. Säännölliset hermostoverkot muuttavat tuloa asettamalla sen piilotettujen kerrosten sarjan läpi. Jokainen kerros koostuu joukosta neuroneja, joissa jokainen kerros on täysin yhteydessä kaikkiin aiemman kerroksen neuroneihin. Lopuksi on viimeinen täysin kytketty kerros - lähtökerros -, jotka edustavat ennusteita.

Konvoluutiohermostoverkot ovat hiukan erilaisia. Ensinnäkin kerrokset on järjestetty 3 ulottuvuuteen: leveys, korkeus ja syvyys. Lisäksi yhden kerroksen neuronit eivät liity kaikkiin seuraavan kerroksen neuroneihin, vaan vain pieneen sen alueeseen. Viimeiseksi lopullinen ulostulo pelkistetään yhdeksi todennäköisyyspistevektoriksi, joka on järjestetty syvyysulottuvuuden mukaan.

Normaali NN vs. CNN. - Lähde: http://cs231n.github.io/convolutional-networks/

CNN: issä on kaksi komponenttia:

  • Piilotetut kerrokset / Ominaisuuksien poisto-osa

Tässä osassa verkko suorittaa sarjan konvoluutioita ja yhdistämisoperaatioita, joiden aikana ominaisuudet havaitaan. Jos sinulla oli kuva seeprasta, tässä osassa verkko tunnistaa raidat, kaksi korvaa ja neljä jalkaa.

  • Luokitteluosa

Täysin kytketyt kerrokset toimivat tässä luokittelijana näiden purettujen ominaisuuksien päällä. He määrittävät todennäköisyyden, että kuvan objekti on se, mitä algoritmi ennustaa sen olevan.

# Tuomme kirjastot ennen rakentamisen aloittamista
Tuo numerot kuin np
from keras.layers tuo Conv2D, Activation, MaxPool2D, Flatten, Dense
alkaen keras.models tuo Sequential
CNN: n arkkitehtuuri. - Lähde: https://www.mathworks.com/videos/introduction-to-deep-learning-what-are-convolutional-neural-networks--1489512765771.html

Ominaisuuksien erottaminen

Convolution on yksi CNN: n tärkeimmistä rakennuspalikoista. Termi "evoluutio" tarkoittaa kahden funktion matemaattista yhdistelmää kolmannen funktion tuottamiseksi. Se yhdistää kaksi tietojoukkoa.

CNN: n tapauksessa konvoluutio suoritetaan syöttötietoihin suodattimella tai ytimellä (näitä termejä käytetään vaihtokelpoisesti) ominaisuuskartan tuottamiseksi.

Suoritamme konvoluution liu'uttamalla suodattimen tulon päälle. Jokaisessa paikassa suoritetaan matriisin kertolasku ja summataan tulos ominaisuuskarttaan.

Alla olevassa animaatiossa voit nähdä konvoluutio-operaation. Voit nähdä suodattimen (vihreä neliö) liukuvan syötteemme (sininen neliö) päälle ja konvoluution summa menee ominaisuuskartalle (punainen neliö).

Suodattimemme aluetta kutsutaan myös vastaanottavaksi kentäksi, joka on nimetty hermosolujen mukaan! Tämän suodattimen koko on 3x3.

Vasen: suodatin liukuu tulon yli. Oikea: tulos summataan ja lisätään ominaisuuskarttaan. - Lähde: https://towardsdatascience.com/applied-deep-learning-part-4-convolutional-neural-networks-584bc134c1e2

Selittämisen vuoksi olen osoittanut sinulle 2D-toiminnon, mutta todellisuudessa konvoluutio suoritetaan 3D-muodossa. Jokainen kuva on nimittäin esitetty 3D-matriisina, jolla on leveys, korkeus ja syvyys. Syvyys on ulottuvuus kuvan värikanavien (RGB) vuoksi.

Suodatin liukuu tulon päälle ja suorittaa ulostulon uudelle kerrokselle. - Lähde: https://towardsdatascience.com/applied-deep-learning-part-4-convolutional-neural-networks-584bc134c1e2

Suoritamme syötteessämme useita käännöksiä, joissa kukin toiminta käyttää eri suodatinta. Tästä seuraa erilaisia ​​ominaisuuskarttoja. Lopulta otamme kaikki nämä ominaisuuskartat ja laitamme ne yhteen konvoluutiokerroksen lopputuloksena.

Kuten mikään muu hermoverkko, käytämme aktivointitoimintoa tekemään tulostemme epälineaarisia. Konvoluutiohermoverkon tapauksessa konvoluution lähtö viedään aktivointitoiminnon läpi. Tämä voi olla ReLU-aktivointitoiminto.

Askel on sen vaiheen koko, jota konvoluutiosuodatin siirtää joka kerta. Askelkoko on yleensä 1, mikä tarkoittaa, että suodatin liu'uttaa pikseliä pikseliltä. Nostamalla askelkokoa suodattimesi liukuu tulon yli suuremmalla aikavälillä, ja siten solujen päällekkäisyys on vähemmän.

Alla oleva animaatio näyttää askeleen koon 1 toiminnassa.

Koska ominaisuuskartan koko on aina pienempi kuin syöte, meidän on tehtävä jotain estääksesi karttakartan pienentymisen. Tässä käytämme pehmustetta.

Kerros nolla-arvoisia pikseliä lisätään ympäröimään tuloa nolla-alueilla, jotta ominaisuuskarttamme ei kutistu. Sen lisäksi, että tilakoko pysyy vakiona konvoluution suorittamisen jälkeen, se myös parantaa suorituskykyä ja varmistaa, että ytimen ja askeleen koko sopii tuloon.

Konvoluutiokerroksen jälkeen on yleistä lisätä yhdistävä kerros CNN-kerrosten väliin. Yhdistämisen tehtävänä on pienentää jatkuvasti mittasuhteita parametrien ja laskennan vähentämiseksi verkossa. Tämä lyhentää harjoitusaikaa ja hallitsee ylimääräistä asennusta.

Yleisin pooling-tyyppi on max pooling, joka ottaa suurimman arvon jokaisessa ikkunassa. Nämä ikkunakoot on määritettävä etukäteen. Tämä pienentää ominaisuuskartan kokoa pitäen samalla tärkeät tiedot.

Maksimaalinen yhdistäminen vie suurimpia arvoja. - Lähde: http://cs231n.github.io/convolutional-networks/

Siksi CNN: ää käytettäessä neljä tärkeää hyperparametria, joista meidän on päätettävä, ovat:

  • ytimen koko
  • suodatinmäärä (ts. kuinka monta suodatinta me haluamme käyttää)
  • askel (kuinka suuret suodattimen vaiheet ovat)
  • täyte
# Tähän malliin syötetyt kuvat ovat 512 x 512 pikseliä ja 3 kanavaa
img_shape = (28,28,1)
# Asenna malli
malli = peräkkäinen ()
# Lisää konvoluutiokerros suodattimilla 3, 3 x 3 ja askelkoolla 1
# Aseta pehmuste siten, että tulon koko on yhtä suuri kuin tulosteen koko
model.add (Conv2D (6,2, input_shape = img_shape))
# Lisää kerrokseen aktivointi
model.add (Activation ( 'Relu'))
#Pooling
model.add (MaxPool2D (2))

Hieno tapa visualisoida konvoluutiokerros on esitetty alla. Yritä katsoa sitä hiukan ja ymmärtää todella tapahtuvaa.

Kuinka konvoluutio toimii K = 2 -suodattimien kanssa, jokaisella on avaruusalue F = 3, askel, S = 2 ja syöttötyyny P = 1. - Lähde: http://cs231n.github.io/convolutional-networks/

Luokittelu

Konvoluutio- ja yhdistämiskerrosten jälkeen luokitteluosa koostuu muutamasta täysin kytketystä kerroksesta. Nämä täysin kytketyt kerrokset voivat kuitenkin hyväksyä vain yhden ulottuvuuden datan. Muuntamaan 3D-tietomme 1D-muotoon käyttämällä Python-sovelluksen tasoitus-toimintoa. Tämä järjestää pääasiassa 3D-tilavuutemme 1D-vektoriksi.

Convolutional NN: n viimeiset kerrokset ovat täysin kytkettyjä kerroksia. Täysin kytketyn kerroksen neuroneilla on täydet yhteydet kaikkiin edellisen kerroksen aktivointeihin. Tämä osa on periaatteessa sama kuin tavallinen hermoverkko.

# Täysin kytketyt kerrokset
# Muunna 3D-tiedot 1D-muotoon tasoittamalla
model.add (Litistä ())
# Lisää tiheä kerros 10 neuronilla
model.add (Dense (10))
# käytämme softmax-aktivointitoimintoa viimeisessä kerroksessa
model.add (Activation ( 'Softmax-'))
# antaa yleiskuvan mallistamme
model.summary
_________________________________________________________________
Kerros (tyyppi) Tulostusmuoto Param #
================================================== ===============
conv2d_1 (Conv2D) (ei mitään, 27, 27, 6) 30
_________________________________________________________________
aktivointi_1 (aktivointi) (Ei mitään, 27, 27, 6) 0
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (ei mitään, 13, 13, 6) 0
_________________________________________________________________
litteä_1 (litteä) (ei mitään, 1014) 0
_________________________________________________________________
dense_1 (tiheä) (ei mitään, 10) 10150
_________________________________________________________________
aktivointi_2 (aktivointi) (Ei mitään, 10) 0
================================================== ===============
Parameereja yhteensä: 10 180
Trainers params: 10,180
Ei-koulutettavat parametit: 0
__________________________________________________________________

koulutus

CNN: n koulutus toimii samalla tavalla kuin tavallinen hermoverkko, käyttämällä takaisinpropagraatiota tai gradientin laskeutumista. Tässä tämä on kuitenkin hieman matemaattisesti monimutkaisempi konvoluutio-operaatioiden vuoksi.

Jos haluat lukea lisää siitä, kuinka säännölliset hermoverkot toimivat, voit lukea edellisen artikkelini.

"" "Ennen koulutusprosessia meidän on koottava oppimisprosessi tietyssä muodossa. Se koostuu 3 elementistä: optimoija, häviöfunktio ja metriikka." ""
model.compile (tappio = 'sparse_categorical_crossentropy', optimoija = 'adam', metrics = ['acc'])
# tietojoukko käsin kirjoitetuilla numeroilla mallin kouluttamiseksi
from keras.datasets tuo mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data ()
x_train = np.expand_dims (x_train, -1)
x_test = np.expand_dims (x_test, -1)
# Harjoittele mallia toistaen 32 näytteen erien tiedot
Nro 10 aikakautta
model.fit (x_train, y_train, batch_size = 32, aikakaudet = 10, validointitiedot = (x_test, y_test)
# Harjoittelu ...
Harjoittele 60000 näytettä, validoi 10000 näytettä
Kausi 1/10
60000/60000 [==============================] - 10 s 175us / askel - tappio: 4,0330 - acc: 0,7424 - val_loss : 3,5352 - val_acc: 0,7746
Kausi 2/10
60000/60000 [==============================] - 10 s 169us / askel - tappio: 3.5208 - acc: 0.7746 - val_loss : 3,4403 - val_acc: 0,7794
Kausi 3/10
60000/60000 [==============================] - 11 s 176us / askel - tappio: 2.4443 - acc: 0.8372 - val_loss : 1,9846 - val_acc: 0,8645
Aikakausi 4/10
60000/60000 [==============================] - 10 s 173us / askel - tappio: 1,8943 - acc: 0,8691 - val_loss : 1,8478 - val_acc: 0,8713
Aikakausi 5/10
60000/60000 [==============================] - 10 s 174us / askel - tappio: 1,7726 - acc: 0,8735 - val_loss : 1,7595 - val_acc: 0,8718
Kausi 6/10
60000/60000 [==============================] - 10 s 174us / askel - tappio: 1,6943 - acc: 0,8765 - val_loss : 1,7150 - val_acc: 0,8745
Aikakausi 7/10
60000/60000 [==============================] - 10 s 173us / askel - tappio: 1,6765 - acc: 0,8777 - val_loss : 1,7268 - val_acc: 0,8688
Kausi 8/10
60000/60000 [==============================] - 10 s 173us / askel - tappio: 1,6676 - acc: 0,8799 - val_loss : 1,7110 - val_acc: 0,8749
Kausi 9/10
60000/60000 [==============================] - 10 s 172us / askel - tappio: 1,4759 - acc: 0,8888 - val_loss : 0,1346 - val_acc: 0,9597
Aikakausi 10/10
60000/60000 [==============================] - 11 s 177us / askel - tappio: 0,1026 - acc: 0,9681 - val_loss : 0,1414 - val_acc: 0,9693

Yhteenveto

Yhteenvetona voidaan todeta, että CNN: t ovat erityisen hyödyllisiä kuvan luokittelussa ja tunnistamisessa. Niillä on kaksi pääosaa: ominaisuuksien poisto-osa ja luokitteluosa.

Tärkein erityinen tekniikka CNN: ssä on konvoluutio, jossa suodatin liukuu tulon päälle ja yhdistää tuloarvon + suodattimen arvon ominaisuuskartalla. Loppujen lopuksi tavoitteemme on syöttää uusia kuvia CNN: ään, jotta se voi antaa todennäköisyyden kohteelle, jonka se katsoo näkevänsä, tai kuvata kuvaa tekstillä.

- Lähde: https://arxiv.org/pdf/1506.01497v3.pdf

Löydät koko koodin täältä.

Lisää aivoihin liittyviä suosituksia?

  • Lue tämä todella hieno artikkeli aivoista ja paljon muuta.
  • Suosittelen myös tätä kirjaa älykkyydestä ja aivoista.
  • Ray Kurzweilin "Kuinka luoda mieli".