Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Тренування Моделі | Нейронні Мережі в PyTorch
Основи PyTorch

bookТренування Моделі

Підготовка до навчання

Спочатку необхідно переконатися, що модель, функція втрат і оптимізатор належним чином визначені. Розглянемо кожен крок:

  1. Функція втрат: для класифікації можна використовувати CrossEntropyLoss, яка очікує на вхід сирі неперервні значення (логіти) та автоматично застосовує softmax;
  2. Оптимізатор: для ефективного оновлення градієнтів можна використовувати оптимізатор Adam.
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)

У PyTorch функція крос-ентропії поєднує log-softmax та negative log-likelihood (NLL) втрату в одну функцію втрат:

де:

  • zy — логіт, що відповідає правильному класу;
  • C — загальна кількість класів.

Також важливо розділити дані на навчальну та валідаційну вибірки (ідеально, якщо існує окрема тестова вибірка). Оскільки набір даних відносно невеликий (1143 рядки), використовується розподіл 80% на 20%. У цьому випадку валідаційна вибірка також буде виконувати роль тестової.

Крім того, отримані масиви NumPy слід перетворити у тензори, оскільки моделі PyTorch потребують тензорних вхідних даних для обчислень.

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)

Цикл навчання

Цикл навчання включає наступні етапи для кожної епохи:

  1. Прямий прохід: пропуск вхідних ознак через модель для отримання прогнозів;
  2. Обчислення втрат: порівняння прогнозів із фактичними значеннями за допомогою функції втрат;
  3. Зворотний прохід: обчислення градієнтів відносно параметрів моделі за допомогою зворотного поширення помилки;
  4. Оновлення параметрів: коригування параметрів моделі за допомогою оптимізатора;
  5. Моніторинг прогресу: періодичний вивід значення втрат для спостереження за збіжністю.

Як видно, процес навчання подібний до навчання лінійної регресії.

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

Спостереження за збіжністю

Окрім навчання моделі, ми також фіксуємо значення втрат на кожній епосі та будуємо графік їх зміни з часом. Як видно з графіка, навчальні втрати спочатку швидко зменшуються, а потім поступово стабілізуються приблизно на 60-й епосі. Після цього втрати зменшуються значно повільніше, що свідчить про ймовірну збіжність моделі. Тому для цієї моделі достатньо використовувати близько 40 епох.

question mark

Яка з наведених послідовностей кроків є правильною для циклу навчання в PyTorch?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 2

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Awesome!

Completion rate improved to 5

bookТренування Моделі

Свайпніть щоб показати меню

Підготовка до навчання

Спочатку необхідно переконатися, що модель, функція втрат і оптимізатор належним чином визначені. Розглянемо кожен крок:

  1. Функція втрат: для класифікації можна використовувати CrossEntropyLoss, яка очікує на вхід сирі неперервні значення (логіти) та автоматично застосовує softmax;
  2. Оптимізатор: для ефективного оновлення градієнтів можна використовувати оптимізатор Adam.
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)

У PyTorch функція крос-ентропії поєднує log-softmax та negative log-likelihood (NLL) втрату в одну функцію втрат:

де:

  • zy — логіт, що відповідає правильному класу;
  • C — загальна кількість класів.

Також важливо розділити дані на навчальну та валідаційну вибірки (ідеально, якщо існує окрема тестова вибірка). Оскільки набір даних відносно невеликий (1143 рядки), використовується розподіл 80% на 20%. У цьому випадку валідаційна вибірка також буде виконувати роль тестової.

Крім того, отримані масиви NumPy слід перетворити у тензори, оскільки моделі PyTorch потребують тензорних вхідних даних для обчислень.

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)

Цикл навчання

Цикл навчання включає наступні етапи для кожної епохи:

  1. Прямий прохід: пропуск вхідних ознак через модель для отримання прогнозів;
  2. Обчислення втрат: порівняння прогнозів із фактичними значеннями за допомогою функції втрат;
  3. Зворотний прохід: обчислення градієнтів відносно параметрів моделі за допомогою зворотного поширення помилки;
  4. Оновлення параметрів: коригування параметрів моделі за допомогою оптимізатора;
  5. Моніторинг прогресу: періодичний вивід значення втрат для спостереження за збіжністю.

Як видно, процес навчання подібний до навчання лінійної регресії.

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

Спостереження за збіжністю

Окрім навчання моделі, ми також фіксуємо значення втрат на кожній епосі та будуємо графік їх зміни з часом. Як видно з графіка, навчальні втрати спочатку швидко зменшуються, а потім поступово стабілізуються приблизно на 60-й епосі. Після цього втрати зменшуються значно повільніше, що свідчить про ймовірну збіжність моделі. Тому для цієї моделі достатньо використовувати близько 40 епох.

question mark

Яка з наведених послідовностей кроків є правильною для циклу навчання в PyTorch?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 2
some-alt