PyTorch - konwolucyjna sieć neuronowa

Głębokie uczenie się jest działem uczenia maszynowego i jest uważane za kluczowy krok podjęty przez naukowców w ostatnich dziesięcioleciach. Przykłady implementacji uczenia głębokiego obejmują aplikacje takie jak rozpoznawanie obrazu i rozpoznawanie mowy.

Poniżej podano dwa ważne typy głębokich sieci neuronowych -

  • Konwolucyjne sieci neuronowe
  • Powtarzające się sieci neuronowe.

W tym rozdziale skupimy się na pierwszym typie, tj. Konwolucyjnych sieciach neuronowych (CNN).

Konwolucyjne sieci neuronowe

Konwolucyjne sieci neuronowe są przeznaczone do przetwarzania danych przez wiele warstw macierzy. Ten typ sieci neuronowych jest używany w aplikacjach takich jak rozpoznawanie obrazu lub rozpoznawanie twarzy.

Podstawowa różnica między CNN a jakąkolwiek inną zwykłą siecią neuronową polega na tym, że CNN przyjmuje dane wejściowe jako dwuwymiarowa tablica i działa bezpośrednio na obrazach, zamiast skupiać się na ekstrakcji cech, na której koncentrują się inne sieci neuronowe.

Dominujące podejście CNN obejmuje rozwiązania problemów rozpoznawania. Czołowe firmy, takie jak Google i Facebook, zainwestowały w projekty badawczo-rozwojowe projektów rozpoznawczych, aby szybciej wykonywać działania.

Każda konwolucyjna sieć neuronowa obejmuje trzy podstawowe idee -

  • Lokalne odpowiednie pola
  • Convolution
  • Pooling

Rozumiemy szczegółowo każdą z tych terminologii.

Odpowiednie pola lokalne

CNN wykorzystuje korelacje przestrzenne, które istnieją w danych wejściowych. Każda z równoległych warstw sieci neuronowych łączy niektóre neurony wejściowe. Ten konkretny region nazywany jest lokalnym polem odbioru. Skupia się tylko na ukrytych neuronach. Ukryty neuron będzie przetwarzał dane wejściowe wewnątrz wspomnianego pola, nie zdając sobie sprawy ze zmian poza określonymi granicami.

Schemat generowania odpowiednich pól lokalnych jest wymieniony poniżej -

Skręt

Na powyższym rysunku widzimy, że każde połączenie uczy się wagi ukrytego neuronu z powiązanym połączeniem z ruchem z jednej warstwy do drugiej. Tutaj poszczególne neurony od czasu do czasu dokonują przesunięcia. Ten proces nazywa się „konwolucją”.

Mapowanie połączeń z warstwy wejściowej do mapy obiektów ukrytych jest definiowane jako „współdzielone wagi”, a uwzględnione odchylenie jest nazywane „współdzielonym odchyleniem”.

Pooling

Konwolucyjne sieci neuronowe wykorzystują warstwy puli, które są umieszczane bezpośrednio po deklaracji CNN. Pobiera dane wejściowe od użytkownika jako mapę cech, która wychodzi z sieci konwolucyjnych i przygotowuje skondensowaną mapę cech. Łączenie warstw pomaga w tworzeniu warstw z neuronami z poprzednich warstw.

Wdrożenie PyTorch

Poniższe kroki służą do tworzenia konwolucyjnej sieci neuronowej za pomocą PyTorch.

Krok 1

Zaimportuj niezbędne pakiety do tworzenia prostej sieci neuronowej.

from torch.autograd import Variable
import torch.nn.functional as F

Krok 2

Utwórz klasę z zbiorczą reprezentacją konwolucyjnej sieci neuronowej. Nasz kształt wsadu dla danych wejściowych x ma wymiar (3, 32, 32).

class SimpleCNN(torch.nn.Module):
   def __init__(self):
      super(SimpleCNN, self).__init__()
      #Input channels = 3, output channels = 18
      self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
      self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
      #4608 input features, 64 output features (see sizing flow below)
      self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
      #64 input features, 10 output features for our 10 defined classes
      self.fc2 = torch.nn.Linear(64, 10)

Krok 3

Obliczyć aktywację zmian rozmiaru pierwszego splotu od (3, 32, 32) do (18, 32, 32).

Rozmiar wymiaru zmienia się od (18, 32, 32) do (18, 16, 16). Przekształć wymiar danych warstwy wejściowej sieci neuronowej, dzięki czemu rozmiar zmienia się z (18, 16, 16) do (1, 4608).

Przypomnij sobie, że -1 wnioskuje ten wymiar z innego podanego wymiaru.

def forward(self, x):
   x = F.relu(self.conv1(x))
   x = self.pool(x)
   x = x.view(-1, 18 * 16 *16)
   x = F.relu(self.fc1(x))
   #Computes the second fully connected layer (activation applied later)
   #Size changes from (1, 64) to (1, 10)
   x = self.fc2(x)
   return(x)