Hur fungerar konvolutionella lager i djupt lärande neurala nätverk?

Tweet Share Dela

Senast uppdaterad den 17 april 2020

Konvolutionella lager är de viktigaste byggstenarna som används i konvolutionsneurala nätverk.

En faltning är den enkla applikationen av ett filter på en ingång som resulterar i en aktivering. Upprepad applicering av samma filter på en ingång resulterar i en karta över aktiveringar som kallas en funktionsmapp, som indikerar platserna och styrkan för en detekterad funktion i en ingång, till exempel en bild.

Innovationen i fällningsneural nätverk är möjligheten att automatiskt lära sig ett stort antal filter parallellt specifikt för en träningsdataset under begränsningarna för ett specifikt förutsägbart modelleringsproblem, såsom bildklassificering. Resultatet är mycket specifika funktioner som kan upptäckas var som helst på inmatade bilder.

I den här självstudien kommer du att upptäcka hur viklingar fungerar i det favsjonella neurala nätverket.

Efter att ha slutfört denna handledning, du kommer att veta:

  • Konvolutionsneurala nätverk tillämpar ett filter på en ingång för att skapa en funktionskarta som sammanfattar närvaron av detekterade funktioner i ingången.
  • Filter kan göras för hand , såsom linjedetektorer, men innovationen i favsionsneurala nätverk är att lära sig filtren under träning i samband med ett specifikt förutsägelseproblem.
  • Hur man beräknar funktionskartan för en- och tvådimensionell faltning lager i ett favörligt neuralt nätverk.

Starta ditt projekt med min nya bok Deep Learning for Computer Vision, inklusive steg-för-steg-självstudier och Pythons källkodsfiler för alla exempel.

Låt oss komma igång.

En skonsam Introduktion till Convolutional Layers for Deep Learning Neural Networks
Foto av mendhak, vissa rättigheter reserverade.

Handledning Översikt

Denna handledning är uppdelad i fyra delar; de är:

  1. Convolution in Convolutional Neural Networks
  2. Convolution in Computer Vision
  3. Power of Learned Filters
  4. Arbetat exempel på Fackliga lager

Vill du ha resultat med Deep Learning för datorvision?

Ta min gratis 7-dagars e-postkraschkurs nu (med exempelkod).

Klicka för att registrera dig och få även en gratis PDF Ebook-version av kursen.

Ladda ner din GRATIS Mini- Kurs

Convolution in Convolutional Neural Networks

The convolutional neural network, or CNN for short, is en specialiserad typ av neurala nätverksmodeller utformade för att arbeta med tvådimensionell bilddata, även om de kan användas med endimensionell och tredimensionell data. ger nätverket sitt namn. Detta lager utför en operation som kallas en ”konvolution”.

I ett konvolutionsneuralt nätverk är en konvolution en linjär operation som involverar multiplicering av en uppsättning vikter med ingången, ungefär som en traditionell neuralt nätverk. Med tanke på att tekniken var utformad för tvådimensionell inmatning utförs multiplikationen mellan en uppsättning ingångsdata och en tvådimensionell grupp av vikter, kallat ett filter eller en kärna.

Filtret är mindre än ingångsdata och typen av multiplikation som tillämpas mellan en filterstorlek på ingången och filtret är en punktprodukt. En punktprodukt är den elementvisa multiplikationen mellan filterstorleken för ingången och filtret, som sedan summeras, vilket alltid resulterar i ett enda värde. Eftersom det resulterar i ett enda värde kallas operationen ofta som ”skalär produkt”.

Att använda ett filter som är mindre än ingången är avsiktligt eftersom det gör att samma filter (uppsättning vikter) kan multiplicerat med inmatningsmatrisen flera gånger vid olika punkter på ingången. Specifikt appliceras filtret systematiskt på varje överlappande del eller filterstorlek på ingångsdata, vänster till höger, uppifrån och ned.

Denna systematiska tillämpning av samma filter över en bild är en kraftfull idé . Om filtret är utformat för att detektera en viss typ av funktion i ingången, tillåter tillämpningen av det filtret systematiskt över hela inmatningsbilden att filtret får möjlighet att upptäcka den funktionen var som helst i bilden. Denna förmåga kallas vanligtvis översättningsvariation, t.ex. det allmänna intresset för huruvida funktionen är närvarande snarare än var den fanns.

Avvikelse från lokal översättning kan vara en mycket användbar egenskap om vi bryr oss mer om om någon funktion är närvarande än exakt var den är.När vi till exempel bestämmer om en bild innehåller ett ansikte behöver vi inte veta var ögonen befinner sig med pixel-perfekt noggrannhet, vi behöver bara veta att det finns ett öga på vänster sida av ansiktet och ett öga till höger sidan av ansiktet.

– Sida 342, Deep Learning, 2016.

Utgången från att multiplicera filtret med inmatningsmatrisen en gång är ett enda värde. Eftersom filtret appliceras flera gånger på inmatningsmatrisen är resultatet en tvådimensionell matris med utmatningsvärden som representerar en filtrering av ingången. Som sådan kallas den tvådimensionella utmatningsmatrisen från denna operation en ”funktionskarta”.

När en funktionskarta har skapats kan vi skicka varje värde i funktionskartan genom en icke-linjäritet, såsom en ReLU, ungefär som vi gör för utgångarna från ett helt anslutet lager.

Exempel på ett filter Används på en tvådimensionell ingång för att skapa en funktionskarta

Om du kommer från ett digitalt signalbehandlingsfält eller ett relaterat matematikområde kan du förstå fällningsoperationen på en matris som något annat . Specifikt vänds filtret (kärnan) innan det appliceras på ingången. Tekniskt sett är konvolutionen som beskrivs i användningen av neurologiska nätverk i själva verket en ”korskorrelation”. I djupinlärning kallas den ändå som en ”konvolutionsoperation”.

Många maskininlärningsbibliotek implementerar korskorrelation men kallar det faltning.

– Sida 333, Deep Learning, 2016.

Sammanfattningsvis har vi en ingång, till exempel en bild av pixelvärden, och vi har ett filter, som är en uppsättning vikter, och filtret appliceras systematiskt på indata för att skapa en funktionskarta .

Konvolution i datorvisionen

Idén med att tillämpa konvolutionsoperationen på bilddata är inte ny eller unik för neurologiska nätverk; det är en vanlig teknik som används vid datorvision.

Historiskt designades filter för hand av datorsynsexperter, som sedan applicerades på en bild för att resultera i en funktionskarta eller resultat från att filtret applicerades och sedan analysen av bilden lättare på något sätt.

Till exempel är nedan ett handgjordt 3 × 3-elementfilter för att detektera vertikala linjer:

1
2
3

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

Tillämpa detta filter på ett bilden kommer att resultera i en funktionskarta som endast innehåller vertikala linjer. Det är en vertikal linjedetektor.

Du kan se detta från viktvärdena i filtret; eventuella pixelvärden i den vertikala mittlinjen kommer att aktiveras positivt och något på vardera sidan kommer att aktiveras negativt. Att dra detta filter systematiskt över pixelvärden i en bild kan bara markera vertikala linjepixlar.

En horisontell linjedetektor kan också skapas och även tillämpas på bilden, till exempel:

1
2
3

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

Kombinera resultaten från båda filtren, t.ex. Genom att kombinera båda funktionskartorna kommer alla rader i en bild att markeras.

En svit med tiotals eller till och med hundratals andra små filter kan utformas för att upptäcka andra funktioner i bilden.

Innovationen med att använda konvolutionsoperationen i ett neuralt nätverk är att värdena för filtret är vikter som ska läras under träningen av nätverket.

Nätverket lär sig vilka typer av funktioner som ska extrahera från ingången. Närmare bestämt tvingas nätverket att träna under stokastisk gradientnedgång att lära sig att extrahera funktioner från bilden som minimerar förlusten för den specifika uppgift som nätverket utbildas för att lösa, t.ex. extrahera funktioner som är mest användbara för att klassificera bilder som hundar eller katter.

I detta sammanhang kan du se att detta är en kraftfull idé.

Kraften hos inlärade filter

Att lära sig ett enda filter som är specifikt för en maskininlärningsuppgift är en kraftfull teknik.

Ändå uppnår fällningsneurala nätverk mycket mer i praktiken .

Flera filter

Fackliga neurala nätverk lär sig inte ett enda filter; de lär sig faktiskt flera funktioner parallellt för en given ingång.

Det är till exempel vanligt att ett fällningsskikt lär sig från 32 till 512 filter parallellt för en given ingång.

Detta ger modellen 32, eller till och med 512, olika sätt att extrahera funktioner från en ingång, eller många olika sätt att både ”lära sig att se” och efter träning, många olika sätt att ”se” indata.

Denna mångfald möjliggör specialisering, t.ex. inte bara rader utan de specifika raderna som visas i dina specifika träningsdata.

Flera kanaler

Färgbilder har flera kanaler, vanligtvis en för varje färgkanal, som röd, grön, och blått.

Ur ett dataperspektiv betyder det att en enda bild som tillhandahålls som inmatning till modellen faktiskt är tre bilder.

Ett filter måste alltid ha samma antal av kanaler som ingång, ofta kallad ”djup”. Om en ingångsbild har 3 kanaler (t.ex. ett djup av 3), måste ett filter som appliceras på den bilden också ha 3 kanaler (t.ex. ett djup av 3). I det här fallet skulle ett 3 × 3-filter faktiskt vara 3x3x3 eller för rader, kolumner och djup. Oavsett djupet för ingången och djupet för filtret appliceras filtret på ingången med hjälp av en punktproduktoperation som resulterar i ett enda värde.

Detta innebär att om ett fällningsskikt har 32 filter, dessa 32 filter är inte bara tvådimensionella för den tvådimensionella bildinmatningen, utan är också tredimensionella och har specifika filtervikter för var och en av de tre kanalerna. Ändå resulterar varje filter i en enda funktionskarta. Vilket innebär att djupet för utmatningen av att tillämpa konvolutionsskiktet med 32 filter är 32 för de 32 funktionskartor som skapats.

Flera lager

Följdskikt tillämpas inte bara på indata , t.ex råa pixelvärden, men de kan också tillämpas på utdata från andra lager.

Stapling av fällningsskikt möjliggör en hierarkisk nedbrytning av ingången.

Tänk på att de filter som fungerar direkt på de råa pixelvärdena kommer att lära sig att extrahera lågnivåfunktioner, till exempel linjer.

Filtren som fungerar på utgången från de första radlagren kan extrahera funktioner som är kombinationer av funktioner på lägre nivå, till exempel funktioner som består av flera rader för att uttrycka former.

Denna process fortsätter tills mycket djupa lager extraherar ansikten, djur, hus och så vidare.

Detta är precis vad vi ser i praktiken. Abstraktion av funktioner till höga och högre ordningar när djupet i nätverket ökar.

Arbetat exempel på konvolutionella lager

Keras deep learning-biblioteket tillhandahåller en svit av konvolutionslag.

Vi kan bättre förstå konvolutionsoperationen genom att titta på några bearbetade exempel med konstruerade data och handgjorda filter.

I det här avsnittet tittar vi på både ett endimensionellt konvolutionsskikt och ett tvådimensionellt fältskiktsexempel för att båda göra fällningsoperationen konkret och ge ett bearbetat exempel på användning av Keras-skikten.

Exempel på 1D-faltningslager

Vi kan definiera en- dimensionell ingång som har åtta element, alla med värdet 0,0, med en tvåelementbump i mitten med värdena 1.0.

1

Ingången till Keras måste vara tredimensionell för ett 1D-fällningsskikt.

Den första dimensionen avser varje ingångssampel; i det här fallet har vi bara ett prov. Den andra dimensionen avser längden på varje prov; i det här fallet är längden åtta. Den tredje dimensionen hänvisar till antalet kanaler i varje sampel; i det här fallet har vi bara en enda kanal.

Därför kommer ingångsgruppens form att vara.

1
2
3

# definiera ingång data
data = asarray ()
data = data.reshape (1, 8, 1)

Vi definierar en modell som förväntar att ingångsprover ska ha formen.

Modellen kommer att ha ett enda filter med formen på 3 eller tre element breda. Keras refererar till filtrets form som kärnstorleken.

1
2
3

# skapa modell
modell = Sekventiell ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))

Som standard initialiseras filtren i ett fällningsskikt med slumpmässiga vikter. I det här konstruerade exemplet kommer vi manuellt att specificera vikterna för det enskilda filtret. Vi kommer att definiera ett filter som kan detektera stötar, det vill säga ett högt ingångsvärde omgivet av låga ingångsvärden, som vi definierade i vårt ingångsexempel.

Det treelementfiltret vi kommer att definiera ser ut som följer:

1

Följeskiktet har också ett förspänningsinmatningsvärde som också kräver en vikt som vi kommer att sätta till noll.

Därför vi kan tvinga vikterna i vårt endimensionella fällningsskikt att använda vårt handgjorda filter enligt följande:

Vikten måste anges i vid tredimensionell struktur, i termer av rader, kolumner och kanaler. Filtret har en enda rad, tre kolumner och en kanal.

Vi kan hämta vikterna och bekräfta att de var rätt inställda.

1
2

# bekräfta att de har lagrats
print (model.get_weights ())

Slutligen kan vi tillämpa det enda filtret på våra indata.

Vi kan uppnå detta genom att anropa förutsäga () -funktionen på modellen. Detta returnerar funktionsöversikten direkt: det är resultatet av att filtret appliceras systematiskt över ingångssekvensen.

1
2
3

# tillämpa filter på inmatningsdata
yhat = model.predict (data)
print (yhat )

Att knyta ihop allt detta är hela exemplet som anges nedan.

Att köra exemplet skriver först ut nätverkets vikter. det är bekräftelsen på att vårt handgjorda filter var inställt i modellen som vi förväntade oss.

Därefter appliceras filtret på inmatningsmönstret och funktionskartan beräknas och visas. Vi kan se från värdena på funktionskartan att bumpen upptäcktes korrekt.

1
2
3
4
5
6
7
8
9
10

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

Låt oss titta närmare på vad som hände här.

Minns att ingången är en åtta elementvektorer med värdena:.

Först applicerades treelementfiltret på de första tre ingångarna i uttryckt genom att beräkna punktprodukten (”.” -operatören), vilket resulterade i ett enda utdatavärde i funktionskartan noll.

1
2

från numpy import asarray
print (asarray (). dot (asarray ()))

I vårt handboksexempel är detta följande:

1

. = 0

Filtret flyttades sedan längs ett element av inmatningssekvensen och processen upprepades; specifikt applicerades samma filter på ingångssekvensen vid index 1, 2 och 3, vilket också resulterade i en nollutgång i funktionskartan.

1

. = 0

Vi är systematiska, så igen, filtret flyttas längs ytterligare ett element i ingången och appliceras på ingången vid index 2, 3 och 4. Denna gång är utgången ett värde på en i funktionskartan. Vi upptäckte funktionen och aktiverade på lämpligt sätt.

1

. = 1

Processen upprepas tills vi beräknar hela funktionskarta.

1

Observera att funktionskartan har sex element, medan vår ingång har åtta element. Detta är en artefakt av hur filtret applicerades på inmatningssekvensen. Det finns andra sätt att tillämpa filtret på inmatningssekvensen som ändrar formen på den resulterande funktionskartan, till exempel vaddering, men vi kommer inte att diskutera dessa metoder i detta inlägg. ingångar, kan vi upptäcka funktionen med mer eller mindre intensitet och med olika vikter i filtret, att vi skulle upptäcka olika funktioner i ingångssekvensen.

Exempel på 2D-konvolutionsskikt

Vi kan utöka bumpdetekteringsexemplet i föregående avsnitt till en vertikal linjedetektor i en tvådimensionell bild.

Återigen , kan vi begränsa ingången, i detta fall till en kvadratisk 8 × 8 pixel ingångsbild med en enda kanal (t.ex. gråskala) med en enda vertikal linje i mitten.

1
2
3
4
5
6
7
8

Ingången till ett Conv2D-lager måste vara fyrdimensionell.

Den första dimensionen definierar proverna; i det här fallet finns det bara ett enda prov. Den andra dimensionen definierar antalet rader; i det här fallet åtta. Den tredje dimensionen definierar antalet kolumner, återigen åtta i det här fallet, och slutligen antalet kanaler, vilket är en i detta fall.

Därför måste ingången ha den fyrdimensionella formen eller i denna fall.

Vi definierar Conv2D med ett enda filter som vi gjorde i föregående avsnitt med Conv1D-exemplet.

Filtret kommer att vara tvådimensionellt och kvadratiskt med formen 3 × 3. Skiktet förväntar sig att ingångsprover har formen.

1
2
3

# skapa modell
modell = Sekventiell ()
modell.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))

Vi definierar en vertikal raddetektorfilter för att detektera den enskilda vertikala linjen i våra ingångsdata.

Filtret ser ut så här:

1
2
3

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

Vi kan implementera detta enligt följande:

Slutligen kommer vi tillämpa filtret på den inmatade bilden, vilket kommer att resultera i en funktionskarta som vi förväntar oss att detektera den vertikala linjen i inmatningsbilden.

1
2
# tillämpa filter på inmatningsdata
yhat = model.predict (data)

Formen på funktionskartutmatningen kommer att vara fyrdimensionell med formen. Vi kommer att utföra en enda sats och vi har ett enda filter (ett filter och en ingångskanal), därför är utgångsformen. Vi kan skriva ut innehållet på enskild funktionskarta enligt följande:

1
2
3

för r inom intervallet (yhat.shape):
# skriv ut varje kolumn i raden
print (för c inom intervallet ( yhat.shape)])

Binder samman allt detta , det fullständiga exemplet listas nedan.

Att köra exemplet först bekräftar att det handgjorda filtret var korrekt definierat i lagervikterna

Därefter skrivs den beräknade funktionskartan ut. Vi kan från siffrans skala se att filtret verkligen har upptäckt den enskilda vertikala linjen med stark aktivering mitt på funktionskartan.

Låt oss titta närmare på vad som beräknades.

Först applicerades filtret i bildens övre vänstra hörn eller en bildkorrigering med 3 × 3-element. Tekniskt sett är bildplåstret tredimensionellt med en enda kanal och filtret har samma dimensioner. Vi kan inte implementera detta i NumPy med dot () -funktionen, istället måste vi använda tensordot () -funktionen så att vi kan summera på lämpligt sätt över alla dimensioner, till exempel:

Denna beräkning resulterar i ett enda utgångsvärde på 0,0, t.ex. upptäcktes inte funktionen. Detta ger oss det första elementet i det övre vänstra hörnet av funktionskartan.

Manuellt skulle detta vara som följer:

1
2
3

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

Filtret flyttas längs en kolumn till vänster och processen upprepas. Återigen upptäcks inte funktionen.

1
2
3

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

Ytterligare en flyttning till vänster till nästa kolumn och funktionen upptäcks för första gången, vilket resulterar i en stark aktivering.

1
2
3

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

Denna process upprepas tills kanten på filtret vilar mot kanten eller den sista kolumnen i den inmatade bilden. Detta ger det sista elementet i den första hela raden på funktionsöversikten.

1

Filtret rör sig sedan ner en rad och tillbaka till den första kolumnen och processen är relaterad från vänster till höger för att ge den andra raden på funktionskartan. Och på tills filtrets botten vilar på den nedre eller sista raden av inmatningsbilden.

Återigen, som med föregående avsnitt, kan vi se att funktionskartan är en 6 × 6-matris, mindre än 8 × 8-inmatningsbilden på grund av begränsningarna för hur filtret kan appliceras på inmatningsbilden.

Ytterligare läsning

Detta avsnitt ger fler resurser om ämnet om du är vill gå djupare.

Inlägg

  • Crash Course in Convolutional Neural Networks for Machine Learning

Books

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

API

  • Keras Convolutional Layers API
  • numpy.asarray API

Sammanfattning

I den här självstudien upptäckte du hur krånglar fungerar i det favsjonella neurala nätverket.

Du lärde dig specifikt:

  • Convolutionsneurala nätverk tillämpar ett filter på en ingång för att skapa en funktionskarta som sammanfattar närvaron av upptäckta funktioner i ingången.
  • Filter kan vara handgjorda, till exempel linjedetektorer, men innovationen i favörande neurala nätverk är att lära sig filtren under träning i samband med ett specifikt förutsägelsesproblem.
  • Hur man beräknar funktionsöversikten för ett- och tvådimensionellt konvolutionsskikt i ett konvolutionsneuralt nätverk.

Har du några frågor?
Ställ dina frågor i kommentarerna nedan så gör jag mitt bäst att svara.

Utveckla Deep Learning-modeller för vision idag!

Utveckla dina egna visionmodeller på några minuter

… med bara några rader pythonkod

Upptäck hur i min nya e-bok:
Deep Learning for Computer Vision

Den innehåller självstudier om ämnen som:
klassificering, objektdetektering (yolo och rcnn), ansiktsigenkänning (vggface och facenet) , dataförberedelse och mycket mer …

Ta äntligen djupt lärande till dina Vision-projekt

Hoppa över akademikerna. Bara resultat.

Se vad som finns i

Tweet Dela Dela

Leave a Reply

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *