 Mallin Koulutus
Mallin Koulutus
Valmistautuminen mallin koulutukseen
Ensiksi tulee varmistaa, että malli, tappiollisuusfunktio ja optimoija on määritelty oikein. Käydään läpi jokainen vaihe:
- Tappiollisuusfunktio: luokittelutehtävissä voidaan käyttää CrossEntropyLoss-funktiota, joka odottaa syötteenä raakoja jatkuvia arvoja (logit) ja soveltaa automaattisestisoftmax-toiminnon;
- Optimoija: Adam-optimoijaa voidaan käyttää tehokkaaseen gradienttipäivitykseen.
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)
PyTorchissa ristientropiatappio yhdistää log-softmax- ja negatiivisen log-todennäköisyys (NLL) -tappion yhdeksi tappiollisuusfunktioksi:
missä:
- zy on oikean luokan logit;
- C on luokkien kokonaismäärä.
On myös tärkeää jakaa data koulutus- ja validointijoukkoihin (ihanteellisesti tulisi olla myös erillinen testijoukko). Koska aineisto on melko pieni (1143 riviä), käytetään 80 % ja 20 % jakoa. Tässä tapauksessa validointijoukko toimii myös testijoukkona.
Lisäksi saadut NumPy-taulukot tulee muuntaa tensoreiksi, sillä PyTorch-mallit vaativat tensorisyötteitä laskentaa varten.
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)
Koulutussilmukka
Koulutussilmukka sisältää seuraavat vaiheet jokaiselle epookille:
- Eteenpäin suuntautuva laskenta: syöteominaisuuksien läpivienti mallin läpi ennusteiden tuottamiseksi;
- Häviön laskeminen: ennusteiden vertaaminen todellisiin arvoihin häviöfunktion avulla;
- Taaksepäin suuntautuva laskenta: gradienttien laskeminen mallin parametrien suhteen takaisinkytkennän avulla;
- Parametrien päivitys: mallin parametrien säätäminen optimoijan avulla;
- Edistymisen seuranta: häviön tulostaminen säännöllisesti konvergenssin seuraamiseksi.
Kuten huomaat, koulutusprosessi on samanlainen kuin lineaarisessa regressiossa.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import 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()
Konvergenssin havainnointi
Mallin kouluttamisen lisäksi tallennetaan koulutushäviö jokaisella epookilla ja piirretään se ajan funktiona. Kuten kuvasta näkyy, koulutushäviö vähenee aluksi nopeasti ja vakautuu vähitellen noin epookin 60 kohdalla. Tämän jälkeen häviö pienenee huomattavasti hitaammin, mikä viittaa siihen, että malli on todennäköisesti konvergoitunut. Siksi noin 40 epookkia riittää tälle mallille.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain why we use CrossEntropyLoss for classification tasks?
How do I know if my model is overfitting or underfitting during training?
What should I do if my training loss doesn't decrease as expected?
Awesome!
Completion rate improved to 5 Mallin Koulutus
Mallin Koulutus
Pyyhkäise näyttääksesi valikon
Valmistautuminen mallin koulutukseen
Ensiksi tulee varmistaa, että malli, tappiollisuusfunktio ja optimoija on määritelty oikein. Käydään läpi jokainen vaihe:
- Tappiollisuusfunktio: luokittelutehtävissä voidaan käyttää CrossEntropyLoss-funktiota, joka odottaa syötteenä raakoja jatkuvia arvoja (logit) ja soveltaa automaattisestisoftmax-toiminnon;
- Optimoija: Adam-optimoijaa voidaan käyttää tehokkaaseen gradienttipäivitykseen.
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)
PyTorchissa ristientropiatappio yhdistää log-softmax- ja negatiivisen log-todennäköisyys (NLL) -tappion yhdeksi tappiollisuusfunktioksi:
missä:
- zy on oikean luokan logit;
- C on luokkien kokonaismäärä.
On myös tärkeää jakaa data koulutus- ja validointijoukkoihin (ihanteellisesti tulisi olla myös erillinen testijoukko). Koska aineisto on melko pieni (1143 riviä), käytetään 80 % ja 20 % jakoa. Tässä tapauksessa validointijoukko toimii myös testijoukkona.
Lisäksi saadut NumPy-taulukot tulee muuntaa tensoreiksi, sillä PyTorch-mallit vaativat tensorisyötteitä laskentaa varten.
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)
Koulutussilmukka
Koulutussilmukka sisältää seuraavat vaiheet jokaiselle epookille:
- Eteenpäin suuntautuva laskenta: syöteominaisuuksien läpivienti mallin läpi ennusteiden tuottamiseksi;
- Häviön laskeminen: ennusteiden vertaaminen todellisiin arvoihin häviöfunktion avulla;
- Taaksepäin suuntautuva laskenta: gradienttien laskeminen mallin parametrien suhteen takaisinkytkennän avulla;
- Parametrien päivitys: mallin parametrien säätäminen optimoijan avulla;
- Edistymisen seuranta: häviön tulostaminen säännöllisesti konvergenssin seuraamiseksi.
Kuten huomaat, koulutusprosessi on samanlainen kuin lineaarisessa regressiossa.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import 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()
Konvergenssin havainnointi
Mallin kouluttamisen lisäksi tallennetaan koulutushäviö jokaisella epookilla ja piirretään se ajan funktiona. Kuten kuvasta näkyy, koulutushäviö vähenee aluksi nopeasti ja vakautuu vähitellen noin epookin 60 kohdalla. Tämän jälkeen häviö pienenee huomattavasti hitaammin, mikä viittaa siihen, että malli on todennäköisesti konvergoitunut. Siksi noin 40 epookkia riittää tälle mallille.
Kiitos palautteestasi!