Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Träning av Modellen | Neurala Nätverk i PyTorch
Pytorch-Grunder

bookTräning av Modellen

Förberedelse för träning

Först måste du säkerställa att modellen, förlustfunktionen och optimeraren är korrekt definierade. Låt oss gå igenom varje steg:

  1. Förlustfunktion: för klassificering kan du använda CrossEntropyLoss, som förväntar sig råa kontinuerliga värden (logits) som indata och automatiskt applicerar softmax;
  2. Optimerare: du kan använda Adam-optimeraren för effektiva gradientuppdateringar.
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 kombinerar cross-entropy-förlusten log-softmax och negativ log-likelihood (NLL) till en enda förlustfunktion:

där:

  • zy är logiten som motsvarar korrekt klass;
  • C är det totala antalet klasser.

Det är också viktigt att dela upp data i tränings- och valideringsuppsättningar (idealiskt bör även en separat testuppsättning finnas). Eftersom datasetet är relativt litet (1143 rader), använder vi en 80% till 20% uppdelning. I detta fall kommer valideringsuppsättningen även att fungera som testuppsättning.

Dessutom bör de resulterande NumPy-arrayerna konverteras till tenstorer, eftersom PyTorch-modeller kräver tensorindata för beräkningar.

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)

Träningsloop

Träningsloopen omfattar följande steg för varje epok:

  1. Framåtriktad passering: mata in funktionerna genom modellen för att generera prediktioner;
  2. Beräkning av förlust: jämför prediktionerna med de faktiska värdena med hjälp av förlustfunktionen;
  3. Bakåtriktad passering: beräkna gradienter med avseende på modellparametrarna med hjälp av backpropagation;
  4. Uppdatering av parametrar: justera modellparametrarna med hjälp av optimeraren;
  5. Övervakning av framsteg: skriv ut förlusten periodiskt för att observera konvergens.

Som du kan se är träningsprocessen lik den för linjär regression.

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

Observera konvergens

Förutom att träna modellen registrerar vi även träningsförlusten vid varje epok och visualiserar den över tid. Som visas i grafen minskar träningsförlusten initialt snabbt och stabiliseras sedan gradvis runt epok 60. Efter denna punkt minskar förlusten i en mycket långsammare takt, vilket tyder på att modellen sannolikt har konvergerat. Därför skulle det vara tillräckligt att använda cirka 40 epoker för denna modell.

question mark

Vilken av följande är den korrekta sekvensen av steg i en PyTorch-träningsslinga?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Suggested prompts:

Can you explain why we use CrossEntropyLoss for classification?

How do I know if my model is overfitting or underfitting?

Can you show how to evaluate the model on the test set?

Awesome!

Completion rate improved to 5

bookTräning av Modellen

Svep för att visa menyn

Förberedelse för träning

Först måste du säkerställa att modellen, förlustfunktionen och optimeraren är korrekt definierade. Låt oss gå igenom varje steg:

  1. Förlustfunktion: för klassificering kan du använda CrossEntropyLoss, som förväntar sig råa kontinuerliga värden (logits) som indata och automatiskt applicerar softmax;
  2. Optimerare: du kan använda Adam-optimeraren för effektiva gradientuppdateringar.
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 kombinerar cross-entropy-förlusten log-softmax och negativ log-likelihood (NLL) till en enda förlustfunktion:

där:

  • zy är logiten som motsvarar korrekt klass;
  • C är det totala antalet klasser.

Det är också viktigt att dela upp data i tränings- och valideringsuppsättningar (idealiskt bör även en separat testuppsättning finnas). Eftersom datasetet är relativt litet (1143 rader), använder vi en 80% till 20% uppdelning. I detta fall kommer valideringsuppsättningen även att fungera som testuppsättning.

Dessutom bör de resulterande NumPy-arrayerna konverteras till tenstorer, eftersom PyTorch-modeller kräver tensorindata för beräkningar.

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)

Träningsloop

Träningsloopen omfattar följande steg för varje epok:

  1. Framåtriktad passering: mata in funktionerna genom modellen för att generera prediktioner;
  2. Beräkning av förlust: jämför prediktionerna med de faktiska värdena med hjälp av förlustfunktionen;
  3. Bakåtriktad passering: beräkna gradienter med avseende på modellparametrarna med hjälp av backpropagation;
  4. Uppdatering av parametrar: justera modellparametrarna med hjälp av optimeraren;
  5. Övervakning av framsteg: skriv ut förlusten periodiskt för att observera konvergens.

Som du kan se är träningsprocessen lik den för linjär regression.

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

Observera konvergens

Förutom att träna modellen registrerar vi även träningsförlusten vid varje epok och visualiserar den över tid. Som visas i grafen minskar träningsförlusten initialt snabbt och stabiliseras sedan gradvis runt epok 60. Efter denna punkt minskar förlusten i en mycket långsammare takt, vilket tyder på att modellen sannolikt har konvergerat. Därför skulle det vara tillräckligt att använda cirka 40 epoker för denna modell.

question mark

Vilken av följande är den korrekta sekvensen av steg i en PyTorch-träningsslinga?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 2
some-alt