Site Overlay

Machine leren is leuk! Deel 3: Deep Learning en Convolutionele Neurale Netwerken

We kunnen dit soort neurale netwerken in een paar minuten trainen op een moderne laptop. Als het klaar is, hebben we een neuraal netwerk dat afbeeldingen van “8 “s kan herkennen met een vrij hoge nauwkeurigheid. Welkom in de wereld van (eind jaren ’80) beeldherkenning!

Tunnel Vision

Het is echt gaaf dat het simpelweg invoeren van pixels in een neuraal netwerk daadwerkelijk werkt om beeldherkenning op te bouwen! Machinaal leren is magisch! …toch?

Wel, natuurlijk is het niet zo simpel.

Het goede nieuws is dat onze “8”-herkenner echt goed werkt op eenvoudige afbeeldingen waar de letter zich precies in het midden van de afbeelding bevindt:

Maar nu het echte slechte nieuws:

Onze “8”-herkenner werkt totaal niet wanneer de letter niet perfect in het midden van het beeld staat. Alleen al de kleinste positiewijziging verpest alles:

Dit komt omdat ons netwerk alleen het patroon van een perfect gecentreerde “8” heeft geleerd. Het heeft absoluut geen idee wat een “8” is die niet in het midden staat. Het kent precies één patroon en slechts één patroon.

Dat is niet erg bruikbaar in de echte wereld. Problemen in de echte wereld zijn nooit zo simpel. Dus moeten we uitzoeken hoe we ons neurale netwerk kunnen laten werken in gevallen waarin de “8” niet perfect gecentreerd is.

Brute Force Idee #1: Zoeken met een schuifvenster

We hebben al een heel goed programma gemaakt voor het vinden van een “8” gecentreerd in een afbeelding. Wat als we gewoon het hele beeld scannen voor mogelijke “8 “s in kleinere secties, een sectie per keer, totdat we er een vinden?

Deze aanpak heet een schuifraam. Het is de brute kracht oplossing. Het werkt goed in een beperkt aantal gevallen, maar het is erg inefficiënt. Je moet hetzelfde beeld steeds opnieuw bekijken op zoek naar objecten van verschillende grootte. We kunnen beter dan dit!

Brute force idee #2: Meer data en een diep neuraal netwerk

Toen we ons netwerk trainden, lieten we het alleen “8 “s zien die perfect gecentreerd waren. Wat als we het trainen met meer data, inclusief “8 “s in alle verschillende posities en groottes rondom het beeld?

We hoeven niet eens nieuwe trainingsdata te verzamelen. We kunnen gewoon een script schrijven om nieuwe afbeeldingen te genereren met de “8 “s op allerlei verschillende posities in het beeld:

We hebben synthetische trainingsgegevens gemaakt door verschillende versies te maken van de trainingsafbeeldingen die we al hadden. Dit is een zeer nuttige techniek!

Met deze techniek kunnen we gemakkelijk een eindeloze voorraad trainingsgegevens creëren.

Meer gegevens maakt het probleem moeilijker op te lossen voor ons neurale netwerk, maar dat kunnen we compenseren door ons netwerk groter te maken en dus in staat om ingewikkeldere patronen te leren.

Om het netwerk groter te maken, stapelen we laag na laag knooppunten op:

We noemen dit een “diep neuraal netwerk” omdat het meer lagen heeft dan een traditioneel neuraal netwerk.

Dit idee bestaat al sinds het eind van de jaren zestig. Maar tot voor kort was het trainen van zo’n groot neuraal netwerk gewoon te traag om nuttig te zijn. Maar toen we eenmaal uitgevonden hadden hoe we 3D grafische kaarten konden gebruiken (die ontworpen waren om matrixvermenigvuldigingen heel snel uit te voeren) in plaats van normale computerprocessoren, werd het werken met grote neurale netwerken plotseling praktisch. Dezelfde NVIDIA GeForce GTX 1080 videokaart die je gebruikt om Overwatch te spelen, kan worden gebruikt om neurale netwerken ongelooflijk snel te trainen.

Maar ook al kunnen we ons neurale netwerk heel groot maken en snel trainen met een 3D grafische kaart, dat is nog niet genoeg om tot een oplossing te komen. We moeten slimmer zijn over hoe we beelden verwerken in ons neuraal netwerk.

Denk er eens over na. Het heeft geen zin een netwerk te trainen om een “8” bovenin een plaatje te herkennen en het niet te trainen om een “8” onderin een plaatje te herkennen alsof dat twee totaal verschillende objecten zijn.

Er moet een manier zijn om het neurale netwerk slim genoeg te maken om te weten dat een “8” ergens in het plaatje hetzelfde is zonder al die extra training. Gelukkig… is die er!

De oplossing is Convolutie

Als mens weet je intuïtief dat plaatjes een hiërarchie of conceptuele structuur hebben. Kijk eens naar dit plaatje:

Grote foto van mijn zoon

Als mens herkent u direct de hiërarchie in dit plaatje:

  • De grond is bedekt met gras en beton
  • Er is een kind
  • Het kind zit op een hobbelpaard
  • Het hobbelpaard staat boven op het gras

Het belangrijkste is dat we het idee van een kind herkennen, ongeacht de ondergrond waarop het kind zich bevindt. We hoeven het idee van een kind niet voor elk mogelijk oppervlak opnieuw te leren.

Maar op dit moment kan ons neurale netwerk dit niet. Het denkt dat een “8” in een ander deel van het beeld iets heel anders is. Het begrijpt niet dat het verplaatsen van een object in het beeld het niet iets anders maakt. Dit betekent dat het de identificatie van elk object in elke mogelijke positie opnieuw moet leren. Dat is klote.

We moeten ons neurale netwerk laten begrijpen wat vertaal-onafhankelijkheid is – een “8” is een “8”, ongeacht waar in het beeld het zich bevindt.

We doen dit met behulp van een proces dat Convolutie wordt genoemd. Het idee van convolutie is deels geïnspireerd door de informatica en deels door de biologie (dat wil zeggen gekke wetenschappers letterlijk porren kat hersenen met vreemde sondes om erachter te komen hoe katten verwerken beelden).

Hoe Convolutie werkt

In plaats van het invoeren van hele beelden in ons neurale netwerk als een raster van nummers, gaan we iets veel slimmer dat gebruik maakt van het idee dat een object is hetzelfde, ongeacht waar het verschijnt in een beeld te doen.

Hier volgt hoe het gaat werken, stap voor stap –

Stap 1: Verdeel de afbeelding in overlappende beeldtegels

Gelijk aan onze schuifraam-zoekopdracht hierboven, laten we een schuifraam over de hele originele afbeelding gaan en slaan we elk resultaat op als een aparte, kleine beeldtegel:

Door dit te doen, hebben we onze oorspronkelijke afbeelding in 77 even grote kleine afbeeldingstegels veranderd.

Stap 2: Voer elke beeldtegel in een klein neuraal netwerk

Eerder voerden we een enkele afbeelding in een neuraal netwerk om te zien of het een “8” was. We doen hier precies hetzelfde, maar dan voor elke afzonderlijke beeldtegel:

Herhaal dit 77 keer, één keer voor elke beeldtegel.

Er is echter één grote twist: we houden dezelfde neurale netwerkgewichten voor elke afzonderlijke tegel in dezelfde originele afbeelding. Met andere woorden, we behandelen elke tegel in de afbeelding gelijk. Als er iets interessants verschijnt in een bepaalde tegel, markeren we die tegel als interessant.

Stap 3: Sla de resultaten van elke tegel op in een nieuwe array

We willen de volgorde van de oorspronkelijke tegels niet uit het oog verliezen. Dus slaan we het resultaat van het verwerken van elke tile op in een raster in dezelfde rangschikking als de originele afbeelding. Het ziet er zo uit:

Met andere woorden, we zijn begonnen met een grote afbeelding en we zijn geëindigd met een iets kleinere array die bijhoudt welke delen van onze oorspronkelijke afbeelding het meest interessant waren.

Stap 4: Downsampling

Het resultaat van stap 3 was een array die in kaart brengt welke delen van de oorspronkelijke afbeelding het meest interessant zijn. Maar die matrix is nog steeds behoorlijk groot:

Om de matrix kleiner te maken, downsamplen we hem met een algoritme dat max pooling heet. Het klinkt fancy, maar dat is het helemaal niet!

We bekijken gewoon elk 2×2 vierkant van de array en houden het grootste getal over:

Het idee hier is dat als we iets interessants vinden in een van de vier input tiles die elk 2×2 rastervierkant vormen, we gewoon het meest interessante stukje overhouden. Dit verkleint de grootte van onze matrix terwijl de belangrijkste bits behouden blijven.

Eindstap: Doe een voorspelling

Tot nu toe hebben we een gigantische afbeelding teruggebracht tot een vrij kleine matrix.

Wat denk je? Die reeks is gewoon een stel getallen, dus we kunnen die kleine reeks gebruiken als invoer in een ander neuraal netwerk. Dit laatste neurale netwerk zal beslissen of het beeld een match is of niet. Om het te onderscheiden van de convolutie stap, noemen we het een “volledig aangesloten” netwerk.

Dus van begin tot eind ziet onze hele pijplijn van vijf stappen er als volgt uit:

Extra stappen

Onze pijplijn voor beeldverwerking bestaat uit een reeks stappen: convolutie, max-pooling, en ten slotte een volledig aangesloten netwerk.

Bij het oplossen van problemen in de echte wereld, kunnen deze stappen worden gecombineerd en gestapeld zo vaak als je wilt! Je kunt twee, drie of zelfs tien convolutielagen hebben. Je kunt max pooling toevoegen waar je maar wilt om de grootte van je gegevens te verkleinen.

Het basisidee is om met een groot beeld te beginnen en het steeds verder, stap voor stap, uit te kluiten tot je uiteindelijk één resultaat hebt. Hoe meer convolutiestappen je hebt, hoe ingewikkelder kenmerken je netwerk zal kunnen leren herkennen.

Bijvoorbeeld, de eerste convolutiestap zou kunnen leren om scherpe randen te herkennen, de tweede convolutiestap zou snavels kunnen herkennen met behulp van zijn kennis van scherpe randen, de derde stap zou hele vogels kunnen herkennen met behulp van zijn kennis van snavels, enz.

Hier ziet een meer realistisch diep convolutienetwerk (zoals je dat in een onderzoeksartikel zou vinden) eruit:

In dit geval beginnen ze met een afbeelding van 224 x 224 pixels, passen twee keer convolutie en max pooling toe, passen nog drie keer convolutie toe, passen max pooling toe en hebben dan twee volledig verbonden lagen. Het eindresultaat is dat het beeld wordt ingedeeld in een van de 1000 categorieën!

Het juiste netwerk samenstellen

Dus hoe weet je welke stappen je moet combineren om je beeldclassificator te laten werken?

Eerlijk gezegd moet je dit beantwoorden door veel te experimenteren en te testen. Misschien moet je wel 100 netwerken trainen voordat je de optimale structuur en parameters hebt gevonden voor het probleem dat je oplost. Machine learning gaat gepaard met veel vallen en opstaan!

Building our Bird Classifier

Nu weten we eindelijk genoeg om een programma te schrijven dat kan beslissen of een plaatje een vogel is of niet.

Zoals altijd, hebben we wat data nodig om te beginnen. De gratis CIFAR10 dataset bevat 6.000 foto’s van vogels en 52.000 foto’s van dingen die geen vogels zijn. Maar om nog meer gegevens te krijgen, voegen we ook de Caltech-UCSD Birds-200-2011 dataset toe, die nog eens 12.000 foto’s van vogels bevat.

Hier zijn een paar van de vogels uit onze gecombineerde dataset:

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.