Hoe werken convolutionele lagen in diep lerende neurale netwerken?

Tweet Share Share

Laatst bijgewerkt op 17 april 2020

Convolutionele lagen zijn de belangrijkste bouwstenen die worden gebruikt in convolutionele neurale netwerken.

Een convolutie is het eenvoudig toepassen van een filter op een ingang die resulteert in een activering. Herhaalde toepassing van hetzelfde filter op een invoer resulteert in een kaart met activeringen, een kenmerkkaart genaamd, die de locaties en sterkte aangeeft van een gedetecteerd kenmerk in een invoer, zoals een afbeelding.

De innovatie van convolutioneel neuraal netwerken is de mogelijkheid om automatisch een groot aantal filters parallel te leren die specifiek zijn voor een trainingsdataset onder de beperkingen van een specifiek voorspellend modelleringsprobleem, zoals beeldclassificatie. Het resultaat zijn zeer specifieke kenmerken die overal op invoerbeelden kunnen worden gedetecteerd.

In deze tutorial ontdek je hoe convoluties werken in het convolutionele neurale netwerk.

Na het voltooien van deze tutorial, je weet:

  • Convolutionele neurale netwerken passen een filter toe op een invoer om een kaart met kenmerken te maken die de aanwezigheid van gedetecteerde kenmerken in de invoer samenvat.
  • Filters kunnen met de hand worden gemaakt , zoals lijndetectoren, maar de innovatie van convolutionele neurale netwerken is om de filters tijdens de training te leren in de context van een specifiek voorspellingsprobleem.
  • Hoe de feature map te berekenen voor één- en tweedimensionale convolutionele lagen in een convolutioneel neuraal netwerk.

Geef je project een kickstart met mijn nieuwe boek Deep Learning for Computer Vision, inclusief stapsgewijze tutorials en de Python-broncodebestanden voor alle voorbeelden.

Laten we beginnen.

A Gentle Inleiding tot convolutionele lagen voor diep lerende neurale netwerken
Foto door mendhak, enkele rechten voorbehouden.

Overzicht van de tutorial

Deze tutorial is onderverdeeld in vier delen; dit zijn:

  1. Convolutie in convolutionele neurale netwerken
  2. Convolutie in computervisie
  3. Kracht van aangeleerde filters
  4. Uitgewerkt voorbeeld van Convolutionele lagen

Wil je resultaten met diep leren voor computervisie?

Neem mijn nu gratis 7-daagse e-mailcursus (met voorbeeldcode).

Klik om u aan te melden en ontvang ook een gratis pdf-e-boekversie van de cursus.

Download uw GRATIS mini- Cursus

Convolutie in convolutionele neurale netwerken

Het convolutionele neurale netwerk, of kortweg CNN, is een gespecialiseerd type neuraal netwerkmodel ontworpen voor het werken met tweedimensionale beeldgegevens, hoewel ze kunnen worden gebruikt met eendimensionale en driedimensionale gegevens.

Centraal in het convolutionele neurale netwerk is de convolutionele laag die geeft het netwerk zijn naam. Deze laag voert een bewerking uit die een “convolutie” wordt genoemd.

In de context van een convolutioneel neuraal netwerk is een convolutie een lineaire bewerking waarbij een reeks gewichten wordt vermenigvuldigd met de invoer, net als een traditionele neuraal netwerk. Aangezien de techniek is ontworpen voor tweedimensionale invoer, wordt de vermenigvuldiging uitgevoerd tussen een reeks invoergegevens en een tweedimensionale reeks gewichten, een filter of een kernel genoemd.

Het filter is kleiner dan de invoergegevens en het type vermenigvuldiging dat wordt toegepast tussen een filterformaat patch van de invoer en het filter is een puntproduct. Een puntproduct is de elementgewijze vermenigvuldiging tussen de filtergrootte patch van de invoer en het filter, die vervolgens wordt opgeteld, altijd resulterend in een enkele waarde. Omdat het resulteert in een enkele waarde, wordt de bewerking vaak het “scalaire product” genoemd.

Het gebruik van een filter dat kleiner is dan de invoer is opzettelijk omdat het hetzelfde filter (set gewichten) toestaat vermenigvuldigd met de invoerarray meerdere keren op verschillende punten op de invoer. In het bijzonder wordt het filter systematisch toegepast op elk overlappend deel of filterformaat patch van de invoergegevens, van links naar rechts, van boven naar beneden.

Deze systematische toepassing van hetzelfde filter op een afbeelding is een krachtig idee . Als het filter is ontworpen om een specifiek type kenmerk in de invoer te detecteren, geeft de toepassing van dat filter systematisch over het gehele invoerbeeld de mogelijkheid om dat kenmerk overal in het beeld te ontdekken. Deze mogelijkheid wordt gewoonlijk vertaalinvariantie genoemd, bijv. het algemene belang in de vraag of het kenmerk aanwezig is in plaats van waar het aanwezig was.

Onvariantie met lokale vertaling kan een zeer nuttige eigenschap zijn als we meer geven om of een kenmerk aanwezig is dan precies waar het is.Als we bijvoorbeeld bepalen of een afbeelding een gezicht bevat, hoeven we de locatie van de ogen niet tot op de pixel nauwkeurig te weten, we moeten alleen weten dat er een oog aan de linkerkant van het gezicht is en een oog aan de rechterkant. zijkant van het gezicht.

– Pagina 342, Deep Learning, 2016.

De output van het vermenigvuldigen van het filter met de invoerarray een keer is een enkele waarde. Aangezien het filter meerdere keren op de invoerarray wordt toegepast, is het resultaat een tweedimensionale array van uitvoerwaarden die een filtering van de invoer vertegenwoordigen. Als zodanig wordt de tweedimensionale uitvoerarray van deze bewerking een “feature map” genoemd.

Zodra een feature map is gemaakt, kunnen we elke waarde in de feature map door een niet-lineariteit laten gaan, zoals een ReLU, net zoals we doen voor de outputs van een volledig verbonden laag.

Voorbeeld van een filter Toegepast op een tweedimensionale invoer om een functiekaart te maken

Als u afkomstig bent uit een digitaal signaalverwerkingsveld of gerelateerd gebied van de wiskunde, kunt u de convolutiebewerking op een matrix als iets anders opvatten . In het bijzonder wordt het filter (pit) omgedraaid voordat het op de invoer wordt toegepast. Technisch gezien is de convolutie zoals beschreven bij het gebruik van convolutionele neurale netwerken eigenlijk een “kruiscorrelatie”. Desalniettemin wordt het bij deep learning een “convolutie” -bewerking genoemd.

Veel bibliotheken voor machine learning implementeren kruiscorrelatie, maar noemen het convolutie.

– Pagina 333, Deep Learning, 2016.

Samenvattend hebben we een invoer, zoals een afbeelding van pixelwaarden, en we hebben een filter, een set gewichten, en het filter wordt systematisch toegepast op de invoergegevens om een feature map te maken .

Convolutie in Computer Vision

Het idee om de convolutionele operatie toe te passen op beeldgegevens is niet nieuw of uniek voor convolutionele neurale netwerken; het is een veelgebruikte techniek die wordt gebruikt in computervisie.

In het verleden werden filters met de hand ontworpen door experts op het gebied van computervisie, die vervolgens werden toegepast op een afbeelding om te resulteren in een feature map of output van het toepassen van het filter. de analyse van de afbeelding op de een of andere manier gemakkelijker.

Hieronder ziet u bijvoorbeeld een met de hand vervaardigd filter van 3 × 3 elementen voor het detecteren van verticale lijnen:

1
2
3

0,0, 1,0, 0,0
0,0, 1,0, 0,0
0.0, 1.0, 0.0

Dit filter toepassen op een image resulteert in een feature map die alleen verticale lijnen bevat. Het is een verticale lijndetector.

Dit kun je zien aan de gewichtswaarden in het filter; alle pixelwaarden in de middelste verticale lijn worden positief geactiveerd en alle pixels aan beide zijden worden negatief geactiveerd. Door dit filter systematisch over pixelwaarden in een afbeelding te slepen, kunnen alleen verticale lijnpixels worden gemarkeerd.

Een horizontale lijndetector kan ook worden gemaakt en ook op de afbeelding worden toegepast, bijvoorbeeld:

1
2
3

0,0, 0,0, 0,0
1.0, 1.0, 1.0
0.0, 0.0, 0.0

De resultaten van beide filters combineren, bijv Door beide feature maps te combineren, worden alle lijnen in een afbeelding gemarkeerd.

Een reeks van tientallen of zelfs honderden andere kleine filters kan worden ontworpen om andere features in de afbeelding te detecteren.

De innovatie van het gebruik van de convolutie-operatie in een neuraal netwerk is dat de waarden van het filter gewichten zijn die moeten worden geleerd tijdens de training van het netwerk.

Het netwerk leert welke soorten functies uittreksel uit de invoer. Specifiek, training onder stochastische gradiëntafdaling, wordt het netwerk gedwongen te leren kenmerken uit het beeld te extraheren die het verlies minimaliseren voor de specifieke taak waarvoor het netwerk wordt getraind om op te lossen, b.v. extraheer functies die het nuttigst zijn om afbeeldingen als honden of katten te classificeren.

In deze context kunt u zien dat dit een krachtig idee is.

Kracht van aangeleerde filters

Het leren van een enkel filter specifiek voor een machine learning-taak is een krachtige techniek.

Toch bereiken convolutionele neurale netwerken in de praktijk veel meer .

Meerdere filters

Convolutionele neurale netwerken leren geen enkel filter; ze leren in feite meerdere functies parallel voor een bepaalde invoer.

Het is bijvoorbeeld gebruikelijk dat een convolutionele laag 32 tot 512 filters parallel leert voor een bepaalde invoer.

Dit geeft het model 32, of zelfs 512, verschillende manieren om kenmerken uit een invoer te halen, of veel verschillende manieren om zowel te “leren zien” als na training, veel verschillende manieren om de invoergegevens te “zien”.

Deze diversiteit maakt specialisatie mogelijk, bijv niet alleen lijnen, maar de specifieke lijnen die in uw specifieke trainingsgegevens te zien zijn.

Meerdere kanalen

Kleurenafbeeldingen hebben meerdere kanalen, meestal één voor elk kleurkanaal, zoals rood, groen, en blauw.

Vanuit een gegevensperspectief betekent dit dat een enkele afbeelding die als invoer voor het model wordt geleverd, in feite drie afbeeldingen zijn.

Een filter moet altijd hetzelfde nummer hebben van kanalen als de input, vaak aangeduid als “diepte”. Als een invoerbeeld 3 kanalen heeft (bijvoorbeeld een diepte van 3), dan moet een filter dat op dat beeld wordt toegepast ook 3 kanalen hebben (bijvoorbeeld een diepte van 3). In dit geval zou een filter van 3 × 3 in feite 3x3x3 zijn of voor rijen, kolommen en diepte. Ongeacht de diepte van de invoer en diepte van het filter, wordt het filter toegepast op de invoer met behulp van een puntproductbewerking die resulteert in een enkele waarde.

Dit betekent dat als een convolutionele laag 32 filters heeft, deze 32 filters zijn niet alleen tweedimensionaal voor de tweedimensionale beeldinvoer, maar ook driedimensionaal en hebben specifieke filtergewichten voor elk van de drie kanalen. Toch resulteert elk filter in een enkele feature map. Wat betekent dat de diepte van de uitvoer van het toepassen van de convolutionele laag met 32 filters 32 is voor de 32 gemaakte feature maps.

Meerdere lagen

Convolutionele lagen worden niet alleen toegepast op invoergegevens , bijv onbewerkte pixelwaarden, maar ze kunnen ook worden toegepast op de uitvoer van andere lagen.

Het stapelen van convolutionele lagen maakt een hiërarchische ontleding van de invoer mogelijk.

Bedenk dat de filters die werken rechtstreeks op de onbewerkte pixelwaarden zal leren kenmerken op laag niveau te extraheren, zoals lijnen.

De filters die werken op de uitvoer van de eerste lijnlagen kunnen kenmerken extraheren die combinaties zijn van kenmerken op een lager niveau, zoals kenmerken die uit meerdere lijnen bestaan om vormen uit te drukken.

Dit proces gaat door totdat zeer diepe lagen gezichten, dieren, huizen enzovoort extraheren.

Dit is precies wat we zien in praktijk. De abstractie van functies naar hoge en hogere orden naarmate de diepte van het netwerk toeneemt.

Bewerkt voorbeeld van convolutionele lagen

De Keras deep learning-bibliotheek biedt een reeks convolutionele lagen.

We kunnen de convolutie-operatie beter begrijpen door te kijken naar enkele uitgewerkte voorbeelden met gekunstelde gegevens en handgemaakte filters.

In deze sectie kijken we naar zowel een eendimensionale convolutionele laag als een tweedimensionaal voorbeeld van convolutionele lagen om zowel de convolutiebewerking concreet te maken als een uitgewerkt voorbeeld te geven van het gebruik van de Keras-lagen.

Voorbeeld van 1D convolutionele laag

We kunnen een een- dimensionale invoer met acht elementen, allemaal met de waarde 0.0, met een bult van twee elementen in het midden met de waarden 1.0.

1

De invoer naar Keras moet driedimensionaal zijn voor een 1D convolutionele laag.

De eerste dimensie verwijst naar elk invoermonster; in dit geval hebben we maar één monster. De tweede dimensie verwijst naar de lengte van elk monster; in dit geval is de lengte acht. De derde dimensie verwijst naar het aantal kanalen in elk monster; in dit geval hebben we maar één kanaal.

Daarom zal de vorm van de invoerarray zijn.

1
2
3

# definieer invoer data
data = asarray ()
data = data.reshape (1, 8, 1)

We zullen een model definiëren dat verwacht dat invoervoorbeelden de vorm hebben.

Het model heeft een enkel filter met de vorm van 3, of drie elementen breed. Keras verwijst naar de vorm van het filter als de kernelgrootte.

1
2
3

# create model
model = Sequential ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))

Standaard worden de filters in een convolutionele laag geïnitialiseerd met willekeurige gewichten. In dit gekunstelde voorbeeld zullen we handmatig de gewichten voor het enkele filter specificeren. We zullen een filter definiëren dat hobbels kan detecteren, dat wil zeggen een hoge invoerwaarde omgeven door lage invoerwaarden, zoals we hebben gedefinieerd in ons invoervoorbeeld.

Het filter met drie elementen dat we zullen definiëren ziet er als volgt uit:

1

De convolutionele laag heeft ook een bias-invoerwaarde die ook een gewicht vereist dat we op nul zetten.

Daarom, we kunnen de gewichten van onze eendimensionale convolutionele laag dwingen om ons handgemaakte filter als volgt te gebruiken:

De gewichten moeten worden gespecificeerd in op driedimensionale structuur, in termen van rijen, kolommen en kanalen. Het filter heeft één rij, drie kolommen en één kanaal.

We kunnen de gewichten ophalen en bevestigen dat ze correct zijn ingesteld.

1
2

# bevestig dat ze zijn opgeslagen
print (model.get_weights ())

Ten slotte kunnen we het enkele filter toepassen op onze invoergegevens.

We kunnen dit bereiken door de predict () functie op het model aan te roepen. Hierdoor wordt de feature map direct geretourneerd: dat is de output van het systematisch toepassen van het filter op de inputreeks.

1
2
3

# pas filter toe op invoergegevens
yhat = model.predict (data)
print (yhat )

Dit alles samen, het complete voorbeeld is hieronder vermeld.

Als u het voorbeeld uitvoert, worden eerst de gewichten van het netwerk afgedrukt; dat is de bevestiging dat ons handgemaakte filter in het model was ingesteld zoals we hadden verwacht.

Vervolgens wordt het filter toegepast op het invoerpatroon en wordt de feature map berekend en weergegeven. We kunnen aan de waarden van de feature map zien dat de hobbel correct werd gedetecteerd.

1
2
3
4
5
6
7
8
9
10

],
],
]], dtype = float32), array (, dtype = float32)]
]]

Laten we eens nader bekijken wat hier is gebeurd.

Bedenk dat de invoer een acht elementenvector met de waarden:.

Eerst werd het filter met drie elementen toegepast op de eerste drie ingangen van de in gezet door de puntproduct (“.” operator) te berekenen, wat resulteerde in een enkele uitvoerwaarde in de feature map van nul.

1
2

van numpy import asarray
print (asarray (). dot (asarray ()))

In ons handmatige voorbeeld is dit als volgt:

1

. = 0

Het filter werd vervolgens verplaatst langs een element van de invoervolgorde en het proces werd herhaald; in het bijzonder werd hetzelfde filter toegepast op de invoersequentie op indexen 1, 2 en 3, wat ook resulteerde in een nuluitvoer in de feature map.

1

. = 0

We zijn systematisch, dus nogmaals, de filter wordt langs nog een element van de invoer verplaatst en toegepast op de invoer op indexen 2, 3 en 4. Deze keer is de uitvoer een waarde van één in de feature map. We hebben de functie gedetecteerd en op de juiste manier geactiveerd.

1

. = 1

Het proces wordt herhaald totdat we de volledige feature map.

1

Merk op dat de feature map zes elementen heeft, terwijl onze invoer acht elementen heeft. Dit is een artefact van hoe het filter werd toegepast op de invoersequentie. Er zijn andere manieren om het filter toe te passen op de invoervolgorde die de vorm van de resulterende feature map verandert, zoals opvulling, maar we zullen deze methoden niet bespreken in dit bericht.

Je kunt je dat voorstellen met verschillende ingangen, kunnen we het kenmerk met meer of minder intensiteit detecteren, en met verschillende gewichten in het filter, zodat we verschillende kenmerken in de invoersequentie zouden detecteren.

Voorbeeld van 2D convolutionele laag

We kunnen het voorbeeld van stootdetectie in de vorige sectie uitbreiden naar een verticale lijndetector in een tweedimensionaal beeld.

Nogmaals , kunnen we de invoer beperken, in dit geval tot een vierkant invoerbeeld van 8 × 8 pixels met een enkel kanaal (bijvoorbeeld grijswaarden) met een enkele verticale lijn in het midden.

1
2
3
4
5
6
7
8

De invoer voor een Conv2D-laag moet vierdimensionaal zijn.

De eerste dimensie definieert de monsters; in dit geval is er slechts een enkele sample. De tweede dimensie definieert het aantal rijen; in dit geval acht. De derde dimensie definieert het aantal kolommen, opnieuw acht in dit geval, en tenslotte het aantal kanalen, dat in dit geval één is.

Daarom moet de invoer de vierdimensionale vorm hebben of in dit case.

We zullen de Conv2D definiëren met een enkel filter zoals we in de vorige sectie deden met het Conv1D-voorbeeld.

Het filter is tweedimensionaal en vierkant met de vorm 3 × 3. De laag verwacht dat invoervoorbeelden de vorm hebben of.

1
2
3

# create model
model = Sequential ()
model.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))

We zullen een verticale lijndetectorfilter om de enkele verticale lijn in onze invoergegevens te detecteren.

Het filter ziet er als volgt uit:

1
2
3

0, 1, 0
0, 1, 0
0, 1, 0

We kunnen dit als volgt implementeren:

Ten slotte zullen we pas het filter toe op het invoerbeeld, wat zal resulteren in een feature map waarvan we verwachten dat het de detectie van de verticale lijn in het invoerbeeld laat zien.

1
2
# pas filter toe op invoergegevens
yhat = model.predict (data)

De vorm van de feature map output zal vierdimensionaal zijn met de vorm. We zullen een enkele batch uitvoeren en we hebben een enkel filter (een filter en een invoerkanaal), dus de uitvoervorm is. We kunnen de inhoud van de single feature map als volgt mooi afdrukken:

1
2
3

voor r in bereik (yhat.shape):
# print elke kolom in de rij
print (voor c in bereik ( yhat.shape)])

Dit alles samenbinden , het volledige voorbeeld staat hieronder vermeld.

Als u het voorbeeld eerst uitvoert, bevestigt u dat het handgemaakte filter correct was gedefinieerd in de laaggewichten.

Vervolgens wordt de berekende feature-map afgedrukt. We kunnen aan de schaal van de getallen zien dat het filter inderdaad de enkele verticale lijn met sterke activering in het midden van de feature map heeft gedetecteerd.

Laten we eens nader bekijken wat er werd berekend.

Eerst werd het filter toegepast op de linkerbovenhoek van de afbeelding, of een afbeeldingspatch van 3 × 3 elementen. Technisch gezien is het beeldpatch driedimensionaal met een enkel kanaal en heeft het filter dezelfde afmetingen. We kunnen dit niet implementeren in NumPy met de functie dot (), in plaats daarvan moeten we de functie tensordot () gebruiken zodat we op de juiste manier kunnen optellen over alle dimensies, bijvoorbeeld:

Deze berekening resulteert in een enkele uitvoerwaarde van 0,0, bijv. het kenmerk werd niet gedetecteerd. Dit geeft ons het eerste element in de linkerbovenhoek van de feature map.

Handmatig zou dit als volgt zijn:

1
2
3

0, 1, 0 0, 0, 0
0, 1, 0. 0, 0, 0 = 0
0, 1, 0 0, 0

Het filter wordt één kolom naar links verplaatst en het proces wordt herhaald. Nogmaals, de functie wordt niet gedetecteerd.

1
2
3

0, 1, 0 0, 0, 1
0, 1, 0. 0, 0, 1 = 0
0, 1, 0 0, 0, 1

Nog een beweging naar links naar de volgende kolom en de functie wordt voor de eerste keer gedetecteerd, wat resulteert in een sterke activering.

1
2
3

0, 1, 0 0, 1, 1
0, 1, 0. 0, 1, 1 = 3
0, 1, 0 0, 1, 1

Dit proces wordt herhaald totdat de rand van het filter tegen de rand of laatste kolom van het invoerbeeld rust. Dit geeft het laatste element in de eerste volledige rij van de feature map.

1

Het filter gaat dan één rij omlaag en terug naar de eerste kolom en de proces is van links naar rechts gerelateerd om de tweede rij van de feature map te geven. En door totdat de onderkant van het filter op de onderste of laatste rij van het invoerbeeld rust.

Nogmaals, net als bij de vorige sectie, kunnen we zien dat de feature map een 6 × 6 matrix is, kleiner dan de 8 × 8 invoerafbeelding vanwege de beperkingen van hoe het filter kan worden toegepast op de invoerafbeelding.

Verder lezen

Deze sectie biedt meer bronnen over het onderwerp als je dieper willen gaan.

Berichten

  • Spoedcursus in convolutionele neurale netwerken voor machinaal leren

Boeken

  • Hoofdstuk 9: Convolutional Networks, Deep Learning, 2016.
  • Hoofdstuk 5: Deep Learning for Computer Vision, Deep Learning with Python, 2017.

API

  • Keras Convolutional Layers API
  • numpy.asarray API

Samenvatting

In deze tutorial ontdekte je hoe convoluties werken in het convolutionele neurale netwerk.

In het bijzonder leerde je:

  • Convolutionele neurale netwerken passen een filter toe op een input om een feature map te maken die de aanwezigheid van gedetecteerde features in de input samenvat.
  • Filters kunnen met de hand worden gemaakt, zoals lijndetectoren, maar de innovatie van convolutionele neurale netwerken is om de filters tijdens de training te leren in de context van een specifiek voorspellingsprobleem.
  • Hoe te berekenen de feature map voor één- en tweedimensionale convolutionele lagen in een convolutioneel neuraal netwerk.

Heb je nog vragen?
Stel je vragen in de comments hieronder en ik zal mijn best te beantwoorden.

Ontwikkel vandaag diepgaande leermodellen voor visie!

Ontwikkel uw eigen visiemodellen in minuten

… met slechts een paar regels pythoncode

Ontdek hoe in mijn nieuwe e-boek:
Deep Learning for Computer Vision

Het biedt zelfstudiehandleidingen over onderwerpen als: classificatie, objectdetectie (yolo en rcnn), gezichtsherkenning (vggface en facenet) , gegevensvoorbereiding en nog veel meer …

Breng eindelijk diep leren in uw visieprojecten

Sla de academici over. Alleen resultaten.

Bekijk wat erin zit

Tweet Delen Delen

Leave a Reply

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *