Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Erstellung Eines Einfachen Neuronalen Netzwerks | Abschnitt
Practice
Projects
Quizzes & Challenges
Quizze
Challenges
/
PyTorch-Grundlagen für ML-Ingenieure

bookErstellung Eines Einfachen Neuronalen Netzwerks

Unser Ziel ist es, ein einfaches PyTorch-Neuronales Netzwerk mit dem Digits-Datensatz zu erstellen, einem klassischen Datensatz im Bereich des maschinellen Lernens. Die Aufgabe besteht darin, die Ziffer (Zielvariable) anhand des Bildes ihrer Handschrift vorherzusagen, das als eine Menge von Pixelwerten (Merkmale) dargestellt wird.

Datensatzübersicht

Der Digits-Datensatz enthält Bilder handgeschriebener Ziffern, die als numerische Pixelwerte dargestellt werden. Jede Stichprobe besteht aus 64 Merkmalen, die den Pixelintensitäten eines 8×8-Graustufenbildes entsprechen. Die Zielvariable ('target'-Spalte) repräsentiert die Ziffernklasse (0-9) und gibt an, welche Zahl das Bild darstellt.

Der erste Schritt besteht darin, die CSV-Datei einzulesen und die Merkmale (X) sowie die Zielvariable (y) zu extrahieren, die die vorherzusagende Ausgabe darstellt:

import pandas as pd

digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv')
# Extract features and target
X = digits_df.drop(columns=["target"]).values
y = digits_df["target"].values

Definition der Modellklasse

Zunächst sollten alle erforderlichen PyTorch-Module (nn, F) importiert werden. Das nn-Modul wird zur Definition von Modellschichten und -architekturen verwendet, während das F-Modul Aktivierungsfunktionen, Verlustfunktionen und weitere häufig im funktionalen Stil genutzte Hilfsfunktionen enthält.

import torch.nn as nn
import torch.nn.functional as F

Nun kann die Modellklasse definiert werden:

class DigitsClassifier(nn.Module):
    ...
Note
Hinweis

Jede Modellklasse in PyTorch muss von nn.Module erben, da dies grundlegende Funktionalitäten wie automatische Parameterverwaltung, die Definition der Methode forward() sowie die Nutzung integrierter Werkzeuge wie Speichern/Laden des Modells und Zugriff auf Parameter bereitstellt. Dadurch wird der Prozess des Erstellens, Trainings und Deployments von neuronalen Netzen vereinfacht, da viele Aufgaben im Hintergrund übernommen werden.

Modellarchitektur

Da es sich um eine einfache multiklassige Klassifikationsaufgabe handelt, ist ein Multilayer Perceptron (MLP) mit 2 versteckten Schichten ausreichend.

class DigitsClassifier(nn.Module):
    def __init__(self, input_features, hidden1, hidden2, output_classes):
        super().__init__()
        # Define the layers
        self.fc1 = nn.Linear(input_features, hidden1)  # Input to first hidden layer
        self.fc2 = nn.Linear(hidden1, hidden2)  # First hidden to second hidden layer
        self.out = nn.Linear(hidden2, output_classes)  # Second hidden to output layer
Note
Hinweis

Der Aufruf super().__init__() initialisiert die Elternklasse nn.Module und ermöglicht dadurch wesentliche Funktionalitäten wie Parameterverfolgung, Registrierung von Submodulen sowie Speichern/Laden des Modells, die für das Erstellen und Trainieren des Modells unerlässlich sind.

Wie bereits bekannt, besteht ein MLP aus vollständig verbundenen Schichten (auch dichte Schichten genannt), wobei verdeckte Schichten die Eingabemerkmale verarbeiten und die Ausgabeschicht die endgültigen Klassenprognosen liefert. Diese vollständig verbundenen Schichten werden in PyTorch als nn.Linear-Schichten dargestellt.

Forward Propagation

Die Methode .forward() definiert die Vorwärtsausbreitung der Daten durch das Modell.

def forward(self, x):
    # Pass data through layers with activation functions
    a1 = F.relu(self.fc1(x))  # First hidden layer with ReLU
    a2 = F.relu(self.fc2(a1))  # Second hidden layer with ReLU
    output = self.out(a2)          # Output layer (no activation for raw scores)
    return output

Der Eingabetensor x wird zunächst durch die erste vollständig verbundene Schicht (fc1) geleitet, gefolgt von der ReLU-Aktivierungsfunktion zur Einführung von Nichtlinearität. Anschließend durchläuft er die zweite vollständig verbundene Schicht (fc2), erneut gefolgt von ReLU.

Abschließend werden die transformierten Daten durch die Ausgabeschicht (out) geleitet, die die Rohwerte (Logits) für die Ausgabeklassen erzeugt.

Modell erstellen

Da die Modellklasse nun definiert ist, können wir nun die Modellparameter festlegen und das Modell instanziieren.

Ähnlich wie bei der Anzahl der verdeckten Schichten wird die Anzahl der Neuronen in jeder verdeckten Schicht in unserem Beispiel beliebig gewählt: 32 und 16 für die erste bzw. zweite verdeckte Schicht.

Daraus ergibt sich folgende Modellstruktur:

  • Eingabeschicht: entspricht der Anzahl der Merkmale im Datensatz (64 für diesen Datensatz);
  • Verdeckte Schichten: beliebige Neuronenzahlen (32 und 16);
  • Ausgabeschicht: entspricht der Anzahl der Klassen (10 Ziffern).

Vollständige Implementierung

12345678910111213141516171819202122232425262728293031323334
import torch.nn as nn import torch.nn.functional as F import pandas as pd digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv') # Extract features and target X = digits_df.drop(columns=["target"]).values y = digits_df["target"].values # Define the model class class DigitsClassifier(nn.Module): def __init__(self, input_features, hidden1, hidden2, output_classes): super().__init__() # Define the layers self.fc1 = nn.Linear(input_features, hidden1) # Input to first hidden layer self.fc2 = nn.Linear(hidden1, hidden2) # First hidden to second hidden layer self.out = nn.Linear(hidden2, output_classes) # Second hidden to output layer def forward(self, x): # Pass data through layers with activation functions a1 = F.relu(self.fc1(x)) # First hidden layer with ReLU a2 = F.relu(self.fc2(a1)) # Second hidden layer with ReLU output = self.out(a2) # Output layer (no activation for raw scores) return output # Define model parameters input_features = X.shape[1] # Number of features (pixels) hidden1 = 32 # Number of neurons in first hidden layer hidden2 = 16 # Number of neurons in second hidden layer output_classes = len(digits_df["target"].unique()) # Number of unique digits (0-9) # Create an instance of the model model = DigitsClassifier(input_features, hidden1, hidden2, output_classes) # Display the model structure print(model)
copy
question mark

Welche der folgenden Aussagen zur Implementierung eines neuronalen Netzes in PyTorch ist korrekt?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 17

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

bookErstellung Eines Einfachen Neuronalen Netzwerks

Swipe um das Menü anzuzeigen

Unser Ziel ist es, ein einfaches PyTorch-Neuronales Netzwerk mit dem Digits-Datensatz zu erstellen, einem klassischen Datensatz im Bereich des maschinellen Lernens. Die Aufgabe besteht darin, die Ziffer (Zielvariable) anhand des Bildes ihrer Handschrift vorherzusagen, das als eine Menge von Pixelwerten (Merkmale) dargestellt wird.

Datensatzübersicht

Der Digits-Datensatz enthält Bilder handgeschriebener Ziffern, die als numerische Pixelwerte dargestellt werden. Jede Stichprobe besteht aus 64 Merkmalen, die den Pixelintensitäten eines 8×8-Graustufenbildes entsprechen. Die Zielvariable ('target'-Spalte) repräsentiert die Ziffernklasse (0-9) und gibt an, welche Zahl das Bild darstellt.

Der erste Schritt besteht darin, die CSV-Datei einzulesen und die Merkmale (X) sowie die Zielvariable (y) zu extrahieren, die die vorherzusagende Ausgabe darstellt:

import pandas as pd

digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv')
# Extract features and target
X = digits_df.drop(columns=["target"]).values
y = digits_df["target"].values

Definition der Modellklasse

Zunächst sollten alle erforderlichen PyTorch-Module (nn, F) importiert werden. Das nn-Modul wird zur Definition von Modellschichten und -architekturen verwendet, während das F-Modul Aktivierungsfunktionen, Verlustfunktionen und weitere häufig im funktionalen Stil genutzte Hilfsfunktionen enthält.

import torch.nn as nn
import torch.nn.functional as F

Nun kann die Modellklasse definiert werden:

class DigitsClassifier(nn.Module):
    ...
Note
Hinweis

Jede Modellklasse in PyTorch muss von nn.Module erben, da dies grundlegende Funktionalitäten wie automatische Parameterverwaltung, die Definition der Methode forward() sowie die Nutzung integrierter Werkzeuge wie Speichern/Laden des Modells und Zugriff auf Parameter bereitstellt. Dadurch wird der Prozess des Erstellens, Trainings und Deployments von neuronalen Netzen vereinfacht, da viele Aufgaben im Hintergrund übernommen werden.

Modellarchitektur

Da es sich um eine einfache multiklassige Klassifikationsaufgabe handelt, ist ein Multilayer Perceptron (MLP) mit 2 versteckten Schichten ausreichend.

class DigitsClassifier(nn.Module):
    def __init__(self, input_features, hidden1, hidden2, output_classes):
        super().__init__()
        # Define the layers
        self.fc1 = nn.Linear(input_features, hidden1)  # Input to first hidden layer
        self.fc2 = nn.Linear(hidden1, hidden2)  # First hidden to second hidden layer
        self.out = nn.Linear(hidden2, output_classes)  # Second hidden to output layer
Note
Hinweis

Der Aufruf super().__init__() initialisiert die Elternklasse nn.Module und ermöglicht dadurch wesentliche Funktionalitäten wie Parameterverfolgung, Registrierung von Submodulen sowie Speichern/Laden des Modells, die für das Erstellen und Trainieren des Modells unerlässlich sind.

Wie bereits bekannt, besteht ein MLP aus vollständig verbundenen Schichten (auch dichte Schichten genannt), wobei verdeckte Schichten die Eingabemerkmale verarbeiten und die Ausgabeschicht die endgültigen Klassenprognosen liefert. Diese vollständig verbundenen Schichten werden in PyTorch als nn.Linear-Schichten dargestellt.

Forward Propagation

Die Methode .forward() definiert die Vorwärtsausbreitung der Daten durch das Modell.

def forward(self, x):
    # Pass data through layers with activation functions
    a1 = F.relu(self.fc1(x))  # First hidden layer with ReLU
    a2 = F.relu(self.fc2(a1))  # Second hidden layer with ReLU
    output = self.out(a2)          # Output layer (no activation for raw scores)
    return output

Der Eingabetensor x wird zunächst durch die erste vollständig verbundene Schicht (fc1) geleitet, gefolgt von der ReLU-Aktivierungsfunktion zur Einführung von Nichtlinearität. Anschließend durchläuft er die zweite vollständig verbundene Schicht (fc2), erneut gefolgt von ReLU.

Abschließend werden die transformierten Daten durch die Ausgabeschicht (out) geleitet, die die Rohwerte (Logits) für die Ausgabeklassen erzeugt.

Modell erstellen

Da die Modellklasse nun definiert ist, können wir nun die Modellparameter festlegen und das Modell instanziieren.

Ähnlich wie bei der Anzahl der verdeckten Schichten wird die Anzahl der Neuronen in jeder verdeckten Schicht in unserem Beispiel beliebig gewählt: 32 und 16 für die erste bzw. zweite verdeckte Schicht.

Daraus ergibt sich folgende Modellstruktur:

  • Eingabeschicht: entspricht der Anzahl der Merkmale im Datensatz (64 für diesen Datensatz);
  • Verdeckte Schichten: beliebige Neuronenzahlen (32 und 16);
  • Ausgabeschicht: entspricht der Anzahl der Klassen (10 Ziffern).

Vollständige Implementierung

12345678910111213141516171819202122232425262728293031323334
import torch.nn as nn import torch.nn.functional as F import pandas as pd digits_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/digits.csv') # Extract features and target X = digits_df.drop(columns=["target"]).values y = digits_df["target"].values # Define the model class class DigitsClassifier(nn.Module): def __init__(self, input_features, hidden1, hidden2, output_classes): super().__init__() # Define the layers self.fc1 = nn.Linear(input_features, hidden1) # Input to first hidden layer self.fc2 = nn.Linear(hidden1, hidden2) # First hidden to second hidden layer self.out = nn.Linear(hidden2, output_classes) # Second hidden to output layer def forward(self, x): # Pass data through layers with activation functions a1 = F.relu(self.fc1(x)) # First hidden layer with ReLU a2 = F.relu(self.fc2(a1)) # Second hidden layer with ReLU output = self.out(a2) # Output layer (no activation for raw scores) return output # Define model parameters input_features = X.shape[1] # Number of features (pixels) hidden1 = 32 # Number of neurons in first hidden layer hidden2 = 16 # Number of neurons in second hidden layer output_classes = len(digits_df["target"].unique()) # Number of unique digits (0-9) # Create an instance of the model model = DigitsClassifier(input_features, hidden1, hidden2, output_classes) # Display the model structure print(model)
copy
question mark

Welche der folgenden Aussagen zur Implementierung eines neuronalen Netzes in PyTorch ist korrekt?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 17
some-alt