Convolutionella neurala nätverk

Fördjupad djupinlärning med PyTorch

Michal Oleszak

Machine Learning Engineer

Varför inte använda linjära lager?

En svart kvadrat som representerar en gråskalebild på 256x256.

Fördjupad djupinlärning med PyTorch

Varför inte använda linjära lager?

En gråskalebild på 256 x 256 innehåller ungefär 65 000 pixelvärden.

Fördjupad djupinlärning med PyTorch

Varför inte använda linjära lager?

Ett linjärt lager med 1 000 neuroner bearbetar de 65 000 pixelvärdena.

Fördjupad djupinlärning med PyTorch

Varför inte använda linjära lager?

Det finns 65 miljoner kopplingar mellan bilden och lagret.

Fördjupad djupinlärning med PyTorch

Varför inte använda linjära lager?

Med en RGB-färgbild finns det 200 miljoner kopplingar.

Fördjupad djupinlärning med PyTorch

Varför inte använda linjära lager?

  • Linjära lager:
    • Långsam träning
    • Överanpassning
    • Känner inte igen rumsliga mönster
  • Ett bättre alternativ: konvolutionella lager!

Bild med en katt i hörnet och de neuroner som läser den delen av bilden

Fördjupad djupinlärning med PyTorch

Konvolutionellt lager

Ett filter av storleken 3 x 3 glider över indata av storleken 5 x 5 och producerar en särdragskarta av storleken 3 x 3.

  • Låt filter med parametrar glida över indata
  • Utför konvolution i varje position
  • Resulterande särdragskarta:
    • Bevarar rumsliga mönster från indata
    • Använder färre parametrar än linjärt lager
  • Ett filter = en särdragskarta
  • Applicera aktiveringar på särdragskartor
  • Alla särdragskartor kombineras till utdata
  • nn.Conv2d(3, 32, kernel_size=3)
Fördjupad djupinlärning med PyTorch

Konvolution

Två 3 x 3-matriser multipliceras elementvis med varandra och alla tal i den resulterande matrisen summeras.

  1. Beräkna skalärprodukten av indatapatch och filter
    • Övre vänstra fält: 2 × 1 = 2
  2. Summera resultatet
Fördjupad djupinlärning med PyTorch

Zero-padding

En 4 x 4-bild omgiven av en ram med pixlar med värdet noll.

  • Lägg till en ram av nollor runt det konvolutionella lagrets indata
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • Bibehåller indatans och utdatans rumsliga dimensioner
  • Säkerställer att kantpixlar behandlas på samma sätt som övriga
Fördjupad djupinlärning med PyTorch

Max-poolning

En 4 x 4-matris där varje 2 x 2-kvadrant är markerad i olika färg blir en 2 x 2-matris efter max-poolning.

  • Låt ett icke-överlappande fönster glida över indata
  • Behåll enbart maxvärdet i varje position
  • Används efter konvolutionella lager för att minska rumsliga dimensioner
  • nn.MaxPool2d(kernel_size=2)
Fördjupad djupinlärning med PyTorch

Konvolutionellt neuralt nätverk

class Net(nn.Module):
    def __init__(self, num_classes):
        super().__init__()

self.feature_extractor = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Flatten(), )
self.classifier = nn.Linear(64*16*16, num_classes)
def forward(self, x): x = self.feature_extractor(x) x = self.classifier(x) return x
  • feature_extractor: (konvolution, aktivering, poolning) upprepas två gånger och plattas ut
  • classifier: ett enda linjärt lager
  • forward(): skickar indatabilden genom särdragsextraheraren och klassificeraren
Fördjupad djupinlärning med PyTorch

Särdragsextraherarens utdatastorlek

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Schematisk diagram som visar hur indatabilder av storleken 3 x 64 x 64 passerar genom ett konvolutionslager, ett poolningslager, ytterligare ett konvolutionslager och ytterligare ett poolningslager.

Fördjupad djupinlärning med PyTorch

Särdragsextraherarens utdatastorlek

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Schematisk diagram som visar hur indatabilder av storleken 3 x 64 x 64 passerar genom ett konvolutionslager, ett poolningslager, ytterligare ett konvolutionslager och ytterligare ett poolningslager.

Fördjupad djupinlärning med PyTorch

Särdragsextraherarens utdatastorlek

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Schematisk diagram som visar hur indatabilder av storleken 3 x 64 x 64 passerar genom ett konvolutionslager, ett poolningslager, ytterligare ett konvolutionslager och ytterligare ett poolningslager.

Fördjupad djupinlärning med PyTorch

Särdragsextraherarens utdatastorlek

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Schematisk diagram som visar hur indatabilder av storleken 3 x 64 x 64 passerar genom ett konvolutionslager, ett poolningslager, ytterligare ett konvolutionslager och ytterligare ett poolningslager.

Fördjupad djupinlärning med PyTorch

Särdragsextraherarens utdatastorlek

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

Schematisk diagram som visar hur indatabilder av storleken 3 x 64 x 64 passerar genom ett konvolutionslager, ett poolningslager, ytterligare ett konvolutionslager och ytterligare ett poolningslager.

Fördjupad djupinlärning med PyTorch

Nu kör vi en övning!

Fördjupad djupinlärning med PyTorch

Preparing Video For Download...