PyTorch - Faltungsneurales Netzwerk
Deep Learning ist eine Abteilung des maschinellen Lernens und wird von Forschern in den letzten Jahrzehnten als ein entscheidender Schritt angesehen. Die Beispiele für die Implementierung von Deep Learning umfassen Anwendungen wie Bilderkennung und Spracherkennung.
Die zwei wichtigen Arten von tiefen neuronalen Netzen sind unten angegeben -
- Faltungsneurale Netze
- Wiederkehrende neuronale Netze.
In diesem Kapitel konzentrieren wir uns auf den ersten Typ, dh Convolutional Neural Networks (CNN).
Faltungsneurale Netze
Faltungs-Neuronale Netze dienen zur Verarbeitung von Daten über mehrere Arrays. Diese Art von neuronalen Netzen wird in Anwendungen wie der Bilderkennung oder der Gesichtserkennung verwendet.
Der Hauptunterschied zwischen CNN und jedem anderen gewöhnlichen neuronalen Netzwerk besteht darin, dass CNN die Eingabe als zweidimensionales Array verwendet und direkt auf die Bilder einwirkt, anstatt sich auf die Merkmalsextraktion zu konzentrieren, auf die sich andere neuronale Netzwerke konzentrieren.
Der vorherrschende Ansatz von CNN beinhaltet die Lösung von Erkennungsproblemen. Top-Unternehmen wie Google und Facebook haben in Forschungs- und Entwicklungsprojekte von Anerkennungsprojekten investiert, um Aktivitäten schneller durchzuführen.
Jedes Faltungs-Neuronale Netzwerk enthält drei Grundideen:
- Lokale entsprechende Felder
- Convolution
- Pooling
Lassen Sie uns jede dieser Terminologien im Detail verstehen.
Lokale jeweilige Felder
CNN verwendet räumliche Korrelationen, die in den Eingabedaten vorhanden sind. Jedes in den gleichzeitigen Schichten neuronaler Netze verbindet einige Eingangsneuronen. Diese spezifische Region wird als lokales Empfangsfeld bezeichnet. Es konzentriert sich nur auf versteckte Neuronen. Das versteckte Neuron verarbeitet die Eingabedaten innerhalb des genannten Feldes, ohne die Änderungen außerhalb der spezifischen Grenze zu realisieren.
Die Diagrammdarstellung der Erzeugung lokaler entsprechender Felder wird unten erwähnt -
Faltung
In der obigen Abbildung beobachten wir, dass jede Verbindung ein Gewicht eines versteckten Neurons mit einer damit verbundenen Verbindung mit der Bewegung von einer Schicht zur anderen lernt. Hier führen einzelne Neuronen von Zeit zu Zeit eine Verschiebung durch. Dieser Vorgang wird als "Faltung" bezeichnet.
Die Zuordnung von Verbindungen von der Eingabeebene zur verborgenen Feature-Map wird als "gemeinsame Gewichtung" definiert, und die enthaltene Verzerrung wird als "gemeinsame Verzerrung" bezeichnet.
Pooling
Faltungs-Neuronale Netze verwenden Pooling-Schichten, die unmittelbar nach der CNN-Deklaration positioniert werden. Die Eingabe des Benutzers wird als Feature-Map verwendet, die aus Faltungsnetzwerken hervorgeht und eine komprimierte Feature-Map erstellt. Das Zusammenlegen von Ebenen hilft beim Erstellen von Ebenen mit Neuronen früherer Ebenen.
Implementierung von PyTorch
Die folgenden Schritte werden verwendet, um mit PyTorch ein Faltungs-Neuronales Netzwerk zu erstellen.
Schritt 1
Importieren Sie die erforderlichen Pakete zum Erstellen eines einfachen neuronalen Netzwerks.
from torch.autograd import Variable
import torch.nn.functional as F
Schritt 2
Erstellen Sie eine Klasse mit Batch-Darstellung des Faltungsnetzwerks. Unsere Stapelform für Eingabe x hat die Dimension (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)
Schritt 3
Berechnen Sie die Aktivierung der ersten Faltungsgrößenänderungen von (3, 32, 32) zu (18, 32, 32).
Die Größe der Bemaßung ändert sich von (18, 32, 32) zu (18, 16, 16). Umformen der Datendimension der Eingangsschicht des neuronalen Netzes, aufgrund derer sich die Größe von (18, 16, 16) auf (1, 4608) ändert.
Denken Sie daran, dass -1 diese Dimension von der anderen angegebenen Dimension ableitet.
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)