Hvordan fungerer konvolusjonslag i dyplærende nevrale nettverk?

Tweet Share Del

Sist oppdatert 17. april 2020

Konvolusjonslag er de viktigste byggesteinene som brukes i konvolusjonelle nevrale nettverk.

En konvolusjon er den enkle applikasjonen av et filter på en inngang som resulterer i en aktivering. Gjentatt bruk av det samme filteret på en inngang resulterer i et aktiveringskart som kalles et funksjonskart, som indikerer plasseringene og styrken til en oppdaget funksjon i en inngang, for eksempel et bilde.

Innovasjonen med konvolusjonell nevral nettverk er muligheten til automatisk å lære et stort antall filtre parallelt spesifikt til et treningsdatasett under begrensningene til et spesifikt prediktivt modelleringsproblem, for eksempel bildeklassifisering. Resultatet er svært spesifikke funksjoner som kan oppdages hvor som helst på inngangsbilder.

I denne veiledningen vil du oppdage hvordan viklinger fungerer i det konvolusjonelle nevrale nettverket.

Etter å ha fullført denne veiledningen du vet:

  • Konvolusjonelle nevrale nettverk bruker et filter på en inngang for å lage et funksjonskart som oppsummerer tilstedeværelsen av oppdagede funksjoner i inngangen.
  • Filtre kan håndlages , for eksempel linjedetektorer, men innovasjonen av konvolusjonelle nevrale nettverk er å lære filtrene under trening i sammenheng med et spesifikt prediksjonsproblem.
  • Hvordan beregne funksjonskartet for en- og todimensjonal konvolusjon lag i et konvolusjonalt nevralt nettverk.

Start prosjektet ditt med min nye bok Deep Learning for Computer Vision, inkludert trinnvise opplæringsprogrammer og Python-kildekodefiler for alle eksempler.

La oss komme i gang.

En skånsom Introduksjon til konvolusjonslag for Deep Learning Neural Networks
Foto av mendhak, noen rettigheter forbeholdt.

Opplæringsoversikt

Denne opplæringen er delt inn i fire deler; de er:

  1. Convolution in Convolutional Neural Networks
  2. Convolution in Computer Vision
  3. Power of Learned Filters
  4. Arbeidet eksempel på Convolutional Layers

Vil du ha resultater med Deep Learning for Computer Vision?

Ta min gratis 7-dagers e-postkrasjkurs nå (med eksempelkode).

Klikk for å registrere deg og få også en gratis PDF-bokversjon av kurset.

Last ned din GRATIS Mini- Kurs

Convolution in Convolutional Neural Networks

The convolutional neural network, or CNN for short, is en spesialisert type nevrale nettverksmodell designet for å jobbe med todimensjonale bildedata, selv om de kan brukes med endimensjonale og tredimensjonale data.

Sentralt i det konvolusjonelle nevrale nettverket er det konvolusjonslaget som gir nettverket sitt navn. Dette laget utfører en operasjon kalt en «konvolusjon».

I sammenheng med et konvolusjonalt nevralt nettverk er en konvolusjon en lineær operasjon som involverer multiplikasjon av et sett med vekter med inngangen, omtrent som en tradisjonell nevrale nettverket. Gitt at teknikken ble designet for todimensjonal inngang, utføres multiplikasjonen mellom en rekke inngangsdata og et todimensjonalt matrise av vekter, kalt et filter eller en kjerne.

Filteret er mindre enn inngangsdataene og typen multiplikasjon som er brukt mellom en filterstørrelse av inngangen og filteret, er et punktprodukt. Et punktprodukt er den elementvise multiplikasjonen mellom filterstørrelsen på inngangen og filteret, som deretter summeres, noe som alltid resulterer i en enkelt verdi. Fordi det resulterer i en enkelt verdi, blir operasjonen ofte referert til som «skalarproduktet».

Å bruke et filter som er mindre enn inngangen, er forsettlig, da det tillater at det samme filteret (sett med vekter) er multiplisert med inngangsoppsettet flere ganger på forskjellige punkter på inngangen. Spesielt påføres filteret systematisk på hver overlappende del eller filterstørrelse av inngangsdataene, fra venstre til høyre, topp til bunn.

Denne systematiske applikasjonen av det samme filteret over et bilde er en kraftig idé . Hvis filteret er designet for å oppdage en bestemt type funksjon i inngangen, vil anvendelsen av filteret systematisk over hele inngangsbildet gi filteret en mulighet til å oppdage den funksjonen hvor som helst i bildet. Denne evnen blir ofte referert til som oversettelsesvariasjon, f.eks. den generelle interessen for om funksjonen er til stede i stedet for hvor den var tilstede.

Uoverensstemmelse med lokal oversettelse kan være en veldig nyttig egenskap hvis vi bryr oss mer om om noen funksjoner er til stede enn nøyaktig hvor den er.Når vi for eksempel bestemmer om et bilde inneholder et ansikt, trenger vi ikke å vite hvor øynene befinner seg med piksel-perfekt nøyaktighet, vi trenger bare å vite at det er et øye på venstre side av ansiktet og et øye til høyre siden av ansiktet.

– Side 342, Deep Learning, 2016.

Resultatet fra å multiplisere filteret med inngangsmatrisen en gang er en enkelt verdi. Ettersom filteret påføres flere ganger på inngangsmatrisen, blir resultatet en todimensjonal matrise med utgangsverdier som representerer en filtrering av inngangen. Som sådan kalles det todimensjonale utgangssamlingen fra denne operasjonen et «funksjonskart».

Når et funksjonskart er opprettet, kan vi sende hver verdi i funksjonskartet gjennom en ikke-linearitet, for eksempel en ReLU, akkurat som vi gjør for utgangene til et fullt tilkoblet lag.

Eksempel på et filter Brukes til en todimensjonal inngang for å lage et funksjonskart

Hvis du kommer fra et digitalt signalbehandlingsfelt eller et relatert område i matematikken, kan du forstå forståelsesoperasjonen på en matrise som noe annet . Spesielt vendes filteret (kjernen) før det påføres inngangen. Teknisk sett er konvolusjonen som beskrevet i bruken av konvolusjonelle nevrale nettverk faktisk en «krysskorrelasjon». I dyp læring blir det likevel referert til som en «konvolusjons» -operasjon. >

Mange maskinlæringsbiblioteker implementerer krysskorrelasjon, men kaller det konvolusjon.

– Side 333, Deep Learning, 2016.

Oppsummert har vi en inngang, for eksempel et bilde av pikselverdier, og vi har et filter som er et sett med vekter, og filteret brukes systematisk på inngangsdataene for å lage et funksjonskart .

Convolution in Computer Vision

Ideen om å bruke konvolusjonsoperasjonen på bildedata er ikke ny eller unik for konvolusjonelle nevrale nettverk; det er en vanlig teknikk som brukes i datasyn.

Historisk sett ble filtre designet for hånd av datasyneksperter, som deretter ble brukt på et bilde for å resultere i et funksjonskart eller utgang fra å bruke filteret og deretter lage analysen av bildet lettere på en eller annen måte.

Nedenfor er for eksempel et håndlaget 3 × 3 elementfilter for å oppdage vertikale linjer:

1
2
3

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

Bruk av dette filteret på et bildet vil resultere i et funksjonskart som bare inneholder vertikale linjer. Det er en vertikal linjedetektor.

Du kan se dette fra vektverdiene i filteret; eventuelle piksler verdier i den midtre vertikale linjen vil bli aktivert positivt og noen på hver side vil bli negativt aktivert. Å dra dette filteret systematisk over pikselverdier i et bilde kan bare markere vertikale linjepiksler.

En horisontal linjedetektor kan også opprettes og også brukes på bildet, for eksempel:

1
2
3

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

Kombinere resultatene fra begge filtrene, f.eks Ved å kombinere begge funksjonskartene, vil alle linjene i et bilde bli uthevet.

En pakke med titalls eller hundrevis av andre små filtre kan utformes for å oppdage andre funksjoner i bildet.

Innovasjonen ved å bruke konvolusjonsoperasjonen i et nevralt nettverk er at filterets verdier er vekter som skal læres under opplæringen av nettverket.

Nettverket vil lære hvilke typer funksjoner som skal trekke ut fra inngangen. Spesielt, trening under stokastisk gradientnedstigning, blir nettverket tvunget til å lære å trekke ut funksjoner fra bildet som minimerer tapet for den spesifikke oppgaven nettverket blir trent til å løse, f.eks. trekk ut funksjoner som er mest nyttige for å klassifisere bilder som hunder eller katter.

I denne sammenhengen kan du se at dette er en kraftig idé.

Power of Learned Filters

Å lære et enkelt filter som er spesifikt for en maskinlæringsoppgave er en kraftig teknikk.

Likevel oppnår konvolusjonelle nevrale nettverk mye mer i praksis .

Flere filtre

Konvolusjonelle nevrale nettverk lærer ikke et eneste filter; de lærer faktisk flere funksjoner parallelt for en gitt inngang.

For eksempel er det vanlig at et konvolusjonslag lærer fra 32 til 512 filtre parallelt for en gitt inngang.

Dette gir modellen 32, eller til og med 512, forskjellige måter å hente ut funksjoner fra en inngang, eller mange forskjellige måter for både «å lære å se» og etter trening, mange forskjellige måter å «se» inngangsdataene.

Dette mangfoldet tillater spesialisering, f.eks ikke bare linjer, men de spesifikke linjene du ser i dine spesifikke treningsdata.

Flere kanaler

Fargebilder har flere kanaler, vanligvis en for hver fargekanal, for eksempel rød, grønn, og blått.

Fra et dataperspektiv betyr det at et enkelt bilde som leveres som input til modellen, faktisk er tre bilder.

Et filter må alltid ha samme nummer av kanaler som inngang, ofte referert til som «dybde». Hvis et inngangsbilde har 3 kanaler (f.eks. En dybde på 3), må et filter som brukes på det bildet også ha 3 kanaler (f.eks. En dybde på 3). I dette tilfellet vil et 3 × 3-filter faktisk være 3x3x3 eller for rader, kolonner og dybde. Uansett dybden på inngangen og dybden på filteret, påføres filteret på inngangen ved hjelp av en punktproduktoperasjon som resulterer i en enkelt verdi.

Dette betyr at hvis et konvolusjonslag har 32 filtre, disse 32 filtrene er ikke bare todimensjonale for det todimensjonale bildet, men er også tredimensjonale, og har spesifikke filtervekter for hver av de tre kanalene. Likevel resulterer hvert filter i et enkelt funksjonskart. Noe som betyr at dybden på utdataene for å bruke konvolusjonslaget med 32 filtre er 32 for de 32 funksjonskartene som er opprettet.

Flere lag

Convolutionslag blir ikke bare brukt på inndata , f.eks rå pikselverdier, men de kan også brukes på utdata fra andre lag.

Stablingen av konvolusjonslag muliggjør en hierarkisk nedbrytning av inngangen.

Tenk på at filtrene som fungerer direkte på de rå pikselverdiene vil lære å trekke ut funksjoner på lavt nivå, for eksempel linjer.

Filtrene som fungerer på utgangen fra de første linjelagene, kan trekke ut funksjoner som er kombinasjoner av funksjoner på lavere nivå, for eksempel funksjoner som består av flere linjer for å uttrykke former.

Denne prosessen fortsetter til veldig dype lag trekker ut ansikter, dyr, hus og så videre.

Dette er akkurat det vi ser i praksis. Abstraksjonen av funksjoner til høye og høyere ordrer når dybden i nettverket økes.

Arbeidet eksempel på konvolusjonslag

Keras dyp læringsbibliotek gir en serie med konvolusjonslag.

Vi kan forstå forståelsesoperasjonen bedre ved å se på noen bearbeidede eksempler med konstruerte data og håndlagde filtre.

I denne delen ser vi på både et endimensjonalt konvolusjonslag og et todimensjonalt konvolusjonslagseksempel for både å gjøre konvolusjonsoperasjonen konkret og gi et bearbeidet eksempel på bruk av Keras-lagene.

Eksempel på 1D Convolutional Layer

Vi kan definere en en- dimensjonal inngang som har åtte elementer alle med verdien 0,0, med en to-element-bump i midten med verdiene 1.0.

1

Inngangen til Keras må være tredimensjonal for et 1D-konvolusjonslag.

Den første dimensjonen refererer til hver inngangsprøve; i dette tilfellet har vi bare ett utvalg. Den andre dimensjonen refererer til lengden på hver prøve; i dette tilfellet er lengden åtte. Den tredje dimensjonen refererer til antall kanaler i hver prøve; i dette tilfellet har vi bare en enkelt kanal.

Derfor vil formen på inngangsmatrisen være.

1
2
3

# definere inngang data
data = asarray ()
data = data.reshape (1, 8, 1)

Vi vil definere en modell som forventer at inngangsprøver skal ha formen.

Modellen vil ha et enkelt filter med formen på 3 eller tre elementer bredt. Keras refererer til formen på filteret som kernel_size.

1
2
3

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

Som standard initialiseres filtrene i et konvolusjonslag med tilfeldige vekter. I dette konstruerte eksemplet vil vi manuelt spesifisere vektene for enkeltfilteret. Vi vil definere et filter som er i stand til å oppdage ujevnheter, det vil si en høy inngangsverdi omgitt av lave inngangsverdier, som vi definerte i vårt inngangseksempel.

Treelementfilteret vi vil definere, ser slik ut:

1

Konvolusjonslaget har også en forspenningsinngangsverdi som også krever en vekt som vi vil sette til null.

Derfor, vi kan tvinge vektene av vårt endimensjonale konvolusjonslag til å bruke vårt håndlagde filter som følger:

Vektene må spesifiseres i kl. tredimensjonal struktur, når det gjelder rader, kolonner og kanaler. Filteret har en enkelt rad, tre kolonner og en kanal.

Vi kan hente vektene og bekrefte at de ble satt riktig.

1
2

# bekreft at de ble lagret
print (model.get_weights ())

Til slutt kan vi bruke enkeltfilteret på inngangsdataene våre.

Vi kan oppnå dette ved å kalle predict () -funksjonen på modellen. Dette vil returnere funksjonskartet direkte: det er resultatet av å bruke filteret systematisk over inngangssekvensen.

1
2
3

# bruk filter på inndata
yhat = model.predict (data)
print (yhat )

Binder alt dette sammen, er hele eksemplet oppført nedenfor.

Når du kjører eksemplet, skrives nettverkets vekter ut; det er bekreftelsen på at vårt håndlagde filter ble satt i modellen som vi forventet.

Deretter blir filteret brukt på inngangsmønsteret og funksjonskartet beregnes og vises. Vi kan se fra verdiene til funksjonskartet at bumpen ble oppdaget riktig.

1
2
3
4
5
6
7
8
9
10

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

La oss se nærmere på hva som skjedde her.

Husk at inngangen er en åtte elementvektor med verdiene:.

Først ble treelementfilteret brukt på de tre første inngangene til satt ved å beregne punktproduktet («.» -operatøren), noe som resulterte i en enkelt utgangsverdi i funksjonskartet null.

1
2

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

I vårt manuelle eksempel er dette som følger:

1

. = 0

Filteret ble deretter flyttet langs ett element av inngangssekvensen og prosessen ble gjentatt; spesielt ble det samme filteret brukt på inngangssekvensen ved indeksene 1, 2 og 3, noe som også resulterte i nullutgang i funksjonskartet.

1

. = 0

Vi er systematiske, så igjen, filteret flyttes langs ytterligere ett element av inngangen og påføres inngangen ved indeksene 2, 3 og 4. Denne gangen er utgangen en verdi av en i funksjonskartet. Vi oppdaget funksjonen og aktiverte riktig.

1

. = 1

Prosessen gjentas til vi beregner hele funksjonskart.

1

Legg merke til at funksjonskartet har seks elementer, mens inngangen vår har åtte elementer. Dette er en gjenstand for hvordan filteret ble brukt på inngangssekvensen. Det er andre måter å bruke filteret på inngangssekvensen som endrer formen på det resulterende funksjonskartet, for eksempel polstring, men vi vil ikke diskutere disse metodene i dette innlegget.

Du kan forestille deg det med forskjellige innganger, kan vi oppdage funksjonen med mer eller mindre intensitet, og med forskjellige vekter i filteret, at vi vil oppdage forskjellige funksjoner i inngangssekvensen.

Eksempel på 2D-konvolusjonslag

Vi kan utvide støtdeteksjonseksemplet i forrige avsnitt til en vertikal linjedetektor i et todimensjonalt bilde.

Igjen , kan vi begrense inngangen, i dette tilfellet til et kvadratisk inngangsbilde på 8 × 8 piksler med en enkelt kanal (f.eks. gråtoner) med en enkelt vertikal linje i midten.

1
2
3
4
5
6
7
8

Inngangen til et Conv2D-lag må være firedimensjonal.

Den første dimensjonen definerer prøvene; i dette tilfellet er det bare et enkelt utvalg. Den andre dimensjonen definerer antall rader; i dette tilfellet åtte. Den tredje dimensjonen definerer antall kolonner, igjen åtte i dette tilfellet, og til slutt antall kanaler, som er en i dette tilfellet.

Derfor må inngangen ha den firedimensjonale formen eller i denne case.

Vi vil definere Conv2D med et enkelt filter som vi gjorde i forrige avsnitt med Conv1D-eksemplet.

Filteret vil være todimensjonalt og kvadratisk med formen 3 × 3. Laget vil forvente at inngangsprøver har form eller.

1
2
3

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

Vi vil definere en vertikal linjedetektorfilter for å oppdage den enkelt vertikale linjen i inngangsdataene våre.

Filteret ser slik ut:

1
2
3

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

Vi kan implementere dette på følgende måte:

Til slutt vil vi bruk filteret på inngangsbildet, noe som vil resultere i et funksjonskart som vi forventer å vise påvisning av den vertikale linjen i inngangsbildet.

1
2
# bruk filter på inngangsdata
yhat = model.predict (data)

Formen på funksjonskartutgangen vil være firedimensjonal med formen. Vi skal utføre en enkelt batch, og vi har et enkelt filter (ett filter og en inngangskanal), derfor er utgangsformen. Vi kan skrive ut innholdet på enkeltfunksjonskartet som følger:

1
2
3

for r innen rekkevidde (yhat.shape):
# skriv ut hver kolonne i raden
print (for c i området ( yhat.shape)])

Binder alt dette sammen , er det komplette eksemplet listet opp nedenfor.

Å kjøre eksemplet først bekrefter at det håndlagde filteret var riktig definert i lagvektene

Deretter skrives det beregnede funksjonskartet ut. Vi kan se på tallskalaen at filteret faktisk har oppdaget den enkelt vertikale linjen med sterk aktivering midt på funksjonskartet.

La oss se nærmere på hva som ble beregnet.

Først ble filteret påført i øverste venstre hjørne av bildet, eller et bildeoppdatering med 3 × 3 elementer. Teknisk sett er bildepatchen tredimensjonal med en enkelt kanal, og filteret har samme dimensjoner. Vi kan ikke implementere dette i NumPy ved å bruke dot () -funksjonen, i stedet må vi bruke tensordot () -funksjonen, slik at vi kan summere riktig over alle dimensjoner, for eksempel:

Denne beregningen resulterer i en enkelt utgangsverdi på 0,0, for eksempel ble ikke funksjonen oppdaget. Dette gir oss det første elementet i øvre venstre hjørne av funksjonskartet.

Manuelt vil dette være som følger:

1
2
3

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

Filteret flyttes langs en kolonne til venstre og prosessen gjentas. Igjen oppdages ikke funksjonen.

1
2
3

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

Ytterligere ett trekk til venstre til neste kolonne, og funksjonen blir oppdaget for første gang, noe som resulterer i en sterk aktivering.

1
2
3

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

Denne prosessen gjentas til kanten på filteret hviler mot kanten eller den siste kolonnen i inngangsbildet. Dette gir det siste elementet i den første fulle raden av funksjonskartet.

1

Filteret beveger seg deretter ned en rad og tilbake til den første kolonnen og prosessen er relatert fra venstre til høyre for å gi den andre raden i funksjonskartet. Og på til bunnen av filteret hviler på den nederste eller siste raden av inngangsbildet.

Igjen, som med forrige avsnitt, kan vi se at funksjonskartet er en 6 × 6 matrise, mindre enn 8 × 8-inngangsbildet på grunn av begrensningene for hvordan filteret kan brukes på inngangsbildet.

Videre lesing

Denne delen gir flere ressurser om emnet hvis du er ønsker å gå dypere.

Innlegg

  • Crash Course in Convolutional Neural Networks for Machine Learning

Bøker

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

API

  • Keras Convolutional Layers API
  • numpy.asarray API

Sammendrag

I denne veiledningen oppdaget du hvordan konvolusjoner fungerer i det konvolusjonelle nevrale nettverket.

Spesielt lærte du:

  • Convolusjonale nevrale nettverk bruker et filter på en inngang for å lage et funksjonskart som oppsummerer tilstedeværelsen av oppdagede funksjoner i inngangen.
  • Filtre kan være håndlagde, for eksempel linjedetektorer, men innovasjonen av konvolusjonelle nevrale nettverk er å lære filtrene under trening i sammenheng med et spesifikt prediksjonsproblem.
  • funksjonskartet for ett- og todimensjonalt konvolusjonslag i et konvolusjonalt nevralt nettverk.

Har du noen spørsmål?
Still spørsmålene dine i kommentarene nedenfor, så skal jeg gjøre mitt best å svare på.

Utvikle Deep Learning Models for Vision Today!

Utvikle dine egne visjonsmodeller i løpet av minutter

… med bare noen få linjer med python-kode

Oppdag hvordan i min nye eBok:
Deep Learning for Computer Vision

Den gir selvstudier om emner som:
klassifisering, objektgjenkjenning (yolo og rcnn), ansiktsgjenkjenning (vggface og facenet) , dataforberedelse og mye mer …

Ta endelig dyp læring til dine visjonsprosjekter

Hopp over akademikerne. Bare resultater.

Se hva som er inne i

Tweet Del Del

Leave a Reply

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *