Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Training van het Model | Neurale Netwerken in PyTorch
PyTorch Essentials

bookTraining van het Model

Voorbereiding op training

Allereerst moet worden gecontroleerd of het model, de verliesfunctie en de optimizer correct zijn gedefinieerd. De stappen zijn als volgt:

  1. Verliesfunctie: voor classificatie kan CrossEntropyLoss worden gebruikt, die ruwe continue waarden (logits) als invoer verwacht en automatisch softmax toepast;
  2. Optimizer: de Adam-optimizer kan worden gebruikt voor efficiënte gradiëntupdates.
import torch.nn as nn
import torch.optim as optim
# Define the loss function (cross-entropy for multi-class classification)
criterion = nn.CrossEntropyLoss()
# Define the optimizer (Adam with a learning rate of 0.01)
optimizer = optim.Adam(model.parameters(), lr=0.01)

In PyTorch combineert cross-entropy verlies log-softmax en negative log-likelihood (NLL) verlies in één verliesfunctie:

waarbij:

  • zy de logit is die overeenkomt met de juiste klasse;
  • C het totaal aantal klassen is.

Het is ook belangrijk om de data te splitsen in trainings- en validatiesets (idealiter is er ook een aparte testset). Omdat de dataset relatief klein is (1143 rijen), wordt een 80% tot 20% verdeling gebruikt. In dit geval fungeert de validatieset ook als testset.

Daarnaast moeten de resulterende NumPy-arrays worden omgezet naar tensors, aangezien PyTorch-modellen tensorinvoer vereisen voor berekeningen.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test =  train_test_split(X, y, test_size=0.2, random_state=42)
X_train = torch.tensor(X_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.long)
y_test = torch.tensor(y_test, dtype=torch.long)

Trainingslus

De trainingslus omvat de volgende stappen voor elk epoch:

  1. Voorwaartse propagatie: voer de invoerkenmerken door het model om voorspellingen te genereren;
  2. Berekening van verlies: vergelijk de voorspellingen met de werkelijke waarden met behulp van de verliesfunctie;
  3. Achterwaartse propagatie: bereken de gradiënten ten opzichte van de modelparameters via backpropagation;
  4. Parameterupdate: pas de modelparameters aan met behulp van de optimizer;
  5. Voortgang monitoren: druk periodiek het verlies af om de convergentie te observeren.

Zoals te zien is, lijkt het trainingsproces op dat van lineaire regressie.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
import torch.nn as nn import torch import torch.optim as optim import matplotlib.pyplot as plt import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/model_definition.py 2>/dev/null') from model_definition import model, X, y from sklearn.model_selection import train_test_split # Set manual seed for reproducibility torch.manual_seed(42) # Reinitialize model after setting seed model.apply(lambda m: m.reset_parameters() if hasattr(m, "reset_parameters") else None) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) X_train = torch.tensor(X_train, dtype=torch.float32) X_test = torch.tensor(X_test, dtype=torch.float32) y_train = torch.tensor(y_train, dtype=torch.long) y_test = torch.tensor(y_test, dtype=torch.long) # Define the loss function (Cross-Entropy for multi-class classification) criterion = nn.CrossEntropyLoss() # Define the optimizer (Adam with a learning rate of 0.01) optimizer = optim.Adam(model.parameters(), lr=0.01) # Number of epochs epochs = 100 # Store losses for plotting training_losses = [] # Training loop for epoch in range(epochs): # Zero out gradients from the previous step optimizer.zero_grad() # Compute predictions predictions = model(X_train) # Compute the loss loss = criterion(predictions, y_train) # Compute gradients loss.backward() # Update parameters optimizer.step() # Store the loss training_losses.append(loss.item()) # Plot the training loss plt.plot(range(epochs), training_losses, label="Training Loss") plt.xlabel("Epoch") plt.ylabel("Loss") plt.title("Training Loss over Epochs") plt.legend() plt.show()
copy

Convergentie observeren

Naast het trainen van het model registreren we ook het trainingsverlies bij elk epoch en visualiseren we dit in de tijd. Zoals te zien is in de grafiek, neemt het trainingsverlies aanvankelijk snel af en stabiliseert het geleidelijk rond epoch 60. Na dit punt neemt het verlies veel langzamer af, wat suggereert dat het model waarschijnlijk geconvergeerd is. Daarom is het gebruik van ongeveer 40 epochs voor dit model voldoende.

question mark

Wat is de juiste volgorde van stappen in een PyTorch-trainingslus?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 2

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 5

bookTraining van het Model

Veeg om het menu te tonen

Voorbereiding op training

Allereerst moet worden gecontroleerd of het model, de verliesfunctie en de optimizer correct zijn gedefinieerd. De stappen zijn als volgt:

  1. Verliesfunctie: voor classificatie kan CrossEntropyLoss worden gebruikt, die ruwe continue waarden (logits) als invoer verwacht en automatisch softmax toepast;
  2. Optimizer: de Adam-optimizer kan worden gebruikt voor efficiënte gradiëntupdates.
import torch.nn as nn
import torch.optim as optim
# Define the loss function (cross-entropy for multi-class classification)
criterion = nn.CrossEntropyLoss()
# Define the optimizer (Adam with a learning rate of 0.01)
optimizer = optim.Adam(model.parameters(), lr=0.01)

In PyTorch combineert cross-entropy verlies log-softmax en negative log-likelihood (NLL) verlies in één verliesfunctie:

waarbij:

  • zy de logit is die overeenkomt met de juiste klasse;
  • C het totaal aantal klassen is.

Het is ook belangrijk om de data te splitsen in trainings- en validatiesets (idealiter is er ook een aparte testset). Omdat de dataset relatief klein is (1143 rijen), wordt een 80% tot 20% verdeling gebruikt. In dit geval fungeert de validatieset ook als testset.

Daarnaast moeten de resulterende NumPy-arrays worden omgezet naar tensors, aangezien PyTorch-modellen tensorinvoer vereisen voor berekeningen.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test =  train_test_split(X, y, test_size=0.2, random_state=42)
X_train = torch.tensor(X_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.long)
y_test = torch.tensor(y_test, dtype=torch.long)

Trainingslus

De trainingslus omvat de volgende stappen voor elk epoch:

  1. Voorwaartse propagatie: voer de invoerkenmerken door het model om voorspellingen te genereren;
  2. Berekening van verlies: vergelijk de voorspellingen met de werkelijke waarden met behulp van de verliesfunctie;
  3. Achterwaartse propagatie: bereken de gradiënten ten opzichte van de modelparameters via backpropagation;
  4. Parameterupdate: pas de modelparameters aan met behulp van de optimizer;
  5. Voortgang monitoren: druk periodiek het verlies af om de convergentie te observeren.

Zoals te zien is, lijkt het trainingsproces op dat van lineaire regressie.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
import torch.nn as nn import torch import torch.optim as optim import matplotlib.pyplot as plt import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_3/model_definition.py 2>/dev/null') from model_definition import model, X, y from sklearn.model_selection import train_test_split # Set manual seed for reproducibility torch.manual_seed(42) # Reinitialize model after setting seed model.apply(lambda m: m.reset_parameters() if hasattr(m, "reset_parameters") else None) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) X_train = torch.tensor(X_train, dtype=torch.float32) X_test = torch.tensor(X_test, dtype=torch.float32) y_train = torch.tensor(y_train, dtype=torch.long) y_test = torch.tensor(y_test, dtype=torch.long) # Define the loss function (Cross-Entropy for multi-class classification) criterion = nn.CrossEntropyLoss() # Define the optimizer (Adam with a learning rate of 0.01) optimizer = optim.Adam(model.parameters(), lr=0.01) # Number of epochs epochs = 100 # Store losses for plotting training_losses = [] # Training loop for epoch in range(epochs): # Zero out gradients from the previous step optimizer.zero_grad() # Compute predictions predictions = model(X_train) # Compute the loss loss = criterion(predictions, y_train) # Compute gradients loss.backward() # Update parameters optimizer.step() # Store the loss training_losses.append(loss.item()) # Plot the training loss plt.plot(range(epochs), training_losses, label="Training Loss") plt.xlabel("Epoch") plt.ylabel("Loss") plt.title("Training Loss over Epochs") plt.legend() plt.show()
copy

Convergentie observeren

Naast het trainen van het model registreren we ook het trainingsverlies bij elk epoch en visualiseren we dit in de tijd. Zoals te zien is in de grafiek, neemt het trainingsverlies aanvankelijk snel af en stabiliseert het geleidelijk rond epoch 60. Na dit punt neemt het verlies veel langzamer af, wat suggereert dat het model waarschijnlijk geconvergeerd is. Daarom is het gebruik van ongeveer 40 epochs voor dit model voldoende.

question mark

Wat is de juiste volgorde van stappen in een PyTorch-trainingslus?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 2
some-alt