РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
731 of 769 menu

Метод update

Метод update класса GradScaler обновляет состояние масштабирования после завершения шага оптимизации. Он вызывается после методов scale и step и принимает на вход оптимизатор, который был использован для обновления весов.

Синтаксис

scaler.update(optimizer)

Метод update анализирует градиенты, полученные в результате обратного распространения, и при необходимости корректирует значение масштабирующего множителя. Если градиенты содержат значения NaN или Inf, масштабирующий множитель уменьшается. В противном случае он может быть увеличен до максимально допустимого значения.

Пример

Давайте создадим простую модель и оптимизатор, а затем применим масштабирование градиентов с использованием GradScaler:

import torch from torch.cuda.amp import GradScaler torch.manual_seed(0) model = torch.nn.Linear(10, 1) optimizer = torch.optim.SGD(model.parameters(), lr=0.01) scaler = GradScaler() data = torch.randn(5, 10) target = torch.randn(5, 1) with torch.cuda.amp.autocast(): output = model(data) loss = torch.nn.functional.mse_loss(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update(optimizer) print("Обновление масштабирования выполнено")

Результат выполнения кода:

"Обновление масштабирования выполнено"

Пример

В этом примере показан полный цикл обучения с использованием метода update внутри цикла по эпохам:

import torch from torch.cuda.amp import GradScaler torch.manual_seed(0) model = torch.nn.Linear(10, 1) optimizer = torch.optim.Adam(model.parameters(), lr=0.001) scaler = GradScaler() data = torch.randn(20, 10) target = torch.randn(20, 1) for epoch in range(3): optimizer.zero_grad() with torch.cuda.amp.autocast(): output = model(data) loss = torch.nn.functional.mse_loss(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update(optimizer) print(f"Epoch {epoch + 1}: loss = {loss.item():.4f}")

Результат выполнения кода:

Epoch 1: loss = 0.9660 Epoch 2: loss = 0.9395 Epoch 3: loss = 0.9148

Пример

Метод update также можно использовать без передачи оптимизатора, если необходимо обновить состояние масштабирования без привязки к конкретному оптимизатору:

import torch from torch.cuda.amp import GradScaler torch.manual_seed(0) scaler = GradScaler() model = torch.nn.Linear(5, 3) optimizer = torch.optim.SGD(model.parameters(), lr=0.1) data = torch.randn(4, 5) target = torch.randn(4, 3) with torch.cuda.amp.autocast(): output = model(data) loss = torch.nn.functional.mse_loss(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() print("Обновление выполнено без оптимизатора")

Результат выполнения кода:

"Обновление выполнено без оптимизатора"

Смотрите также

  • класс GradScaler,
    который управляет масштабированием градиентов
  • метод scale,
    который применяет масштабирование к потерям
  • метод step,
    который выполняет шаг оптимизации с масштабированием
  • метод unscale_,
    который отменяет масштабирование градиентов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить