Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Trening av Modellen | Nevrale Nettverk i PyTorch
PyTorch-essensielt

bookTrening av Modellen

Forberedelse til trening

Først må du sørge for at modellen, tapsfunksjonen og optimalisereren er korrekt definert. La oss gå gjennom hvert steg:

  1. Tapsfunksjon: for klassifisering kan du bruke CrossEntropyLoss, som forventer rå kontinuerlige verdier (logits) som input og automatisk anvender softmax;
  2. Optimaliserer: du kan bruke Adam-optimalisereren for effektive gradientoppdateringer.
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)

I PyTorch kombinerer kryssentropitap log-softmax og negativ log-sannsynlighet (NLL) tap i én enkelt tapsfunksjon:

hvor:

  • zy er logitten som tilsvarer riktig klasse;
  • C er det totale antallet klasser.

Det er også viktig å dele dataene inn i trenings- og valideringssett (ideelt sett bør det også finnes et eget testsett). Siden datasettet er relativt lite (1143 rader), bruker vi en 80 % til 20 % fordeling. I dette tilfellet vil valideringssettet også fungere som testsett.

Videre bør de resulterende NumPy-arrayene konverteres til tensorkonstruksjoner, ettersom PyTorch-modeller krever tensorinput for beregninger.

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)

Treningssløyfe

Treningssløyfen innebærer følgende trinn for hver epoke:

  1. Fremoverpassering: før input-funksjonene gjennom modellen for å generere prediksjoner;
  2. Tap-beregning: sammenlign prediksjonene med fasiten ved hjelp av tapsfunksjonen;
  3. Bakoverpassering: beregn gradienter med hensyn til modellparametrene ved bruk av tilbakepropagering;
  4. Parameteroppdatering: juster modellparametrene ved hjelp av optimaliseringsalgoritmen;
  5. Overvåking av fremdrift: skriv ut tapet periodisk for å observere konvergens.

Som du ser, ligner treningsprosessen på den for lineær regresjon.

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

Observere konvergens

I tillegg til å trene modellen, registrerer vi også treningstapet ved hver epoke og visualiserer det over tid. Som vist i grafen, synker treningstapet raskt i starten og stabiliserer seg gradvis rundt epoke 60. Etter dette punktet synker tapet mye saktere, noe som tyder på at modellen sannsynligvis har konvergert. Derfor vil det være tilstrekkelig å bruke rundt 40 epoker for denne modellen.

question mark

Hvilken av følgende er den korrekte rekkefølgen av trinn i en PyTorch treningssløyfe?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 5

bookTrening av Modellen

Sveip for å vise menyen

Forberedelse til trening

Først må du sørge for at modellen, tapsfunksjonen og optimalisereren er korrekt definert. La oss gå gjennom hvert steg:

  1. Tapsfunksjon: for klassifisering kan du bruke CrossEntropyLoss, som forventer rå kontinuerlige verdier (logits) som input og automatisk anvender softmax;
  2. Optimaliserer: du kan bruke Adam-optimalisereren for effektive gradientoppdateringer.
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)

I PyTorch kombinerer kryssentropitap log-softmax og negativ log-sannsynlighet (NLL) tap i én enkelt tapsfunksjon:

hvor:

  • zy er logitten som tilsvarer riktig klasse;
  • C er det totale antallet klasser.

Det er også viktig å dele dataene inn i trenings- og valideringssett (ideelt sett bør det også finnes et eget testsett). Siden datasettet er relativt lite (1143 rader), bruker vi en 80 % til 20 % fordeling. I dette tilfellet vil valideringssettet også fungere som testsett.

Videre bør de resulterende NumPy-arrayene konverteres til tensorkonstruksjoner, ettersom PyTorch-modeller krever tensorinput for beregninger.

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)

Treningssløyfe

Treningssløyfen innebærer følgende trinn for hver epoke:

  1. Fremoverpassering: før input-funksjonene gjennom modellen for å generere prediksjoner;
  2. Tap-beregning: sammenlign prediksjonene med fasiten ved hjelp av tapsfunksjonen;
  3. Bakoverpassering: beregn gradienter med hensyn til modellparametrene ved bruk av tilbakepropagering;
  4. Parameteroppdatering: juster modellparametrene ved hjelp av optimaliseringsalgoritmen;
  5. Overvåking av fremdrift: skriv ut tapet periodisk for å observere konvergens.

Som du ser, ligner treningsprosessen på den for lineær regresjon.

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

Observere konvergens

I tillegg til å trene modellen, registrerer vi også treningstapet ved hver epoke og visualiserer det over tid. Som vist i grafen, synker treningstapet raskt i starten og stabiliserer seg gradvis rundt epoke 60. Etter dette punktet synker tapet mye saktere, noe som tyder på at modellen sannsynligvis har konvergert. Derfor vil det være tilstrekkelig å bruke rundt 40 epoker for denne modellen.

question mark

Hvilken av følgende er den korrekte rekkefølgen av trinn i en PyTorch treningssløyfe?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2
some-alt