Erstellung Eines Einfachen Neuronalen Netzwerks
Unser Ziel ist es, ein einfaches PyTorch-Neuronales Netzwerk unter Verwendung des Digits-Datensatzes 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 auf dem Bild dargestellt ist.
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):
...
Modellarchitektur
Da es sich um eine einfache Multiklassen-Klassifizierungsaufgabe handelt, ist ein Multilayer-Perzeptron (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
Wie bereits bekannt, besteht ein MLP aus vollständig verbundenen Schichten (auch dichte Schichten genannt), wobei versteckte Schichten die Eingabemerkmale verarbeiten und die Ausgabeschicht die endgültigen Klassenprädiktionen liefert. Diese vollständig verbundenen Schichten werden in PyTorch als nn.Linear-Schichten dargestellt.
Vorwärtspropagation
Die Methode .forward() definiert die Vorwärtspropagation 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 Modellparameter festlegen und das Modell instanziieren.
Ähnlich wie bei der Anzahl der versteckten Schichten wird die Anzahl der Neuronen in jeder versteckten Schicht in unserem Beispiel willkürlich gewählt: 32 und 16 für die erste bzw. zweite versteckte Schicht.
Daraus ergibt sich folgende Struktur des Modells:
- Eingabeschicht: entspricht der Anzahl der Merkmale im Datensatz (
64für diesen Datensatz); - Versteckte Schichten: willkürliche Neuronenzahlen (
32und16); - Ausgabeschicht: entspricht der Anzahl der Klassen (
10Ziffern).
Vollständige Implementierung
12345678910111213141516171819202122232425262728293031323334import 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)
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Can you explain how to train this model on the digits dataset?
What loss function and optimizer should I use for this classification task?
How do I evaluate the model's performance after training?
Awesome!
Completion rate improved to 5
Erstellung Eines Einfachen Neuronalen Netzwerks
Swipe um das Menü anzuzeigen
Unser Ziel ist es, ein einfaches PyTorch-Neuronales Netzwerk unter Verwendung des Digits-Datensatzes 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 auf dem Bild dargestellt ist.
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):
...
Modellarchitektur
Da es sich um eine einfache Multiklassen-Klassifizierungsaufgabe handelt, ist ein Multilayer-Perzeptron (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
Wie bereits bekannt, besteht ein MLP aus vollständig verbundenen Schichten (auch dichte Schichten genannt), wobei versteckte Schichten die Eingabemerkmale verarbeiten und die Ausgabeschicht die endgültigen Klassenprädiktionen liefert. Diese vollständig verbundenen Schichten werden in PyTorch als nn.Linear-Schichten dargestellt.
Vorwärtspropagation
Die Methode .forward() definiert die Vorwärtspropagation 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 Modellparameter festlegen und das Modell instanziieren.
Ähnlich wie bei der Anzahl der versteckten Schichten wird die Anzahl der Neuronen in jeder versteckten Schicht in unserem Beispiel willkürlich gewählt: 32 und 16 für die erste bzw. zweite versteckte Schicht.
Daraus ergibt sich folgende Struktur des Modells:
- Eingabeschicht: entspricht der Anzahl der Merkmale im Datensatz (
64für diesen Datensatz); - Versteckte Schichten: willkürliche Neuronenzahlen (
32und16); - Ausgabeschicht: entspricht der Anzahl der Klassen (
10Ziffern).
Vollständige Implementierung
12345678910111213141516171819202122232425262728293031323334import 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)
Danke für Ihr Feedback!