Konwolucyjne sieci neuronowe

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Michal Oleszak

Machine Learning Engineer

Dlaczego nie używać warstw liniowych?

Czarny kwadrat reprezentujący obraz w skali szarości 256×256.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Dlaczego nie używać warstw liniowych?

Obraz w skali szarości 256×256 zawiera około 65 tys. wartości pikseli.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Dlaczego nie używać warstw liniowych?

Warstwa liniowa 1000 neuronów przetwarza 65 tys. wartości pikseli.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Dlaczego nie używać warstw liniowych?

Między obrazem a warstwą istnieje 65 mln połączeń.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Dlaczego nie używać warstw liniowych?

W przypadku kolorowego obrazu RGB istnieje 200 mln połączeń.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Dlaczego nie używać warstw liniowych?

  • Warstwy liniowe:
    • Wolne uczenie
    • Nadmierne dopasowanie
    • Nie rozpoznają wzorców przestrzennych
  • Lepsza alternatywa: warstwy konwolucyjne!

Obraz z kotem w rogu i neuronami odczytującymi tę część obrazu

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Warstwa konwolucyjna

Filtr 3×3 przesuwa się po wejściu 5×5, tworząc mapę cech 3×3.

  • Przesuń filtr(y) parametrów po wejściu
  • W każdej pozycji wykonaj splot
  • Wynikowa mapa cech:
    • Zachowuje wzorce przestrzenne z wejścia
    • Używa mniej parametrów niż warstwa liniowa
  • Jeden filtr = jedna mapa cech
  • Zastosuj aktywacje do map cech
  • Wszystkie mapy cech tworzą wyjście
  • nn.Conv2d(3, 32, kernel_size=3)
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Splot

Dwie macierze 3×3 są mnożone element po elemencie, a wyniki są sumowane.

  1. Oblicz iloczyn skalarny fragmentu wejścia i filtru
    • Lewy górny element: 2 × 1 = 2
  2. Zsumuj wynik
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Dopełnienie zerami

Obraz 4×4 otoczony ramką pikseli o wartości zero.

  • Dodaj ramkę zer do wejścia warstwy konwolucyjnej
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • Zachowuje wymiary przestrzenne tensorów wejścia i wyjścia
  • Zapewnia równe traktowanie pikseli brzegowych
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Max Pooling

Macierz 4×4, w której każda ćwiartka 2×2 jest zaznaczona innym kolorem, staje się macierzą 2×2 po max poolingu.

  • Przesuń niepokrywające się okno po wejściu
  • W każdej pozycji zachowaj tylko wartość maksymalną
  • Stosowany po warstwach konwolucyjnych do redukcji wymiarów przestrzennych
  • nn.MaxPool2d(kernel_size=2)
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Konwolucyjna sieć neuronowa

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: (splot, aktywacja, pooling), powtórzone dwukrotnie i spłaszczone
  • classifier: pojedyncza warstwa liniowa
  • forward(): przekazuje obraz wejściowy przez ekstraktor cech i klasyfikator
Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Rozmiar wyjścia ekstraktora cech

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)
`

Schemat pokazujący, jak obrazy wejściowe o kształcie 3×64×64 przechodzą przez warstwę konwolucyjną, warstwę poolingu, kolejną warstwę konwolucyjną i kolejną warstwę poolingu.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Rozmiar wyjścia ekstraktora cech

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)
`

Schemat pokazujący, jak obrazy wejściowe o kształcie 3×64×64 przechodzą przez warstwę konwolucyjną, warstwę poolingu, kolejną warstwę konwolucyjną i kolejną warstwę poolingu.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Rozmiar wyjścia ekstraktora cech

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)
`

Schemat pokazujący, jak obrazy wejściowe o kształcie 3×64×64 przechodzą przez warstwę konwolucyjną, warstwę poolingu, kolejną warstwę konwolucyjną i kolejną warstwę poolingu.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Rozmiar wyjścia ekstraktora cech

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)
`

Schemat pokazujący, jak obrazy wejściowe o kształcie 3×64×64 przechodzą przez warstwę konwolucyjną, warstwę poolingu, kolejną warstwę konwolucyjną i kolejną warstwę poolingu.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Rozmiar wyjścia ekstraktora cech

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)
`

Schemat pokazujący, jak obrazy wejściowe o kształcie 3×64×64 przechodzą przez warstwę konwolucyjną, warstwę poolingu, kolejną warstwę konwolucyjną i kolejną warstwę poolingu.

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Lass uns üben!

Głębokie uczenie z PyTorch – poziom średnio zaawansowany

Preparing Video For Download...