Почему градиент относительно входных данных равен нулю?Python

Программы на Python
Anonymous
Почему градиент относительно входных данных равен нулю?

Сообщение Anonymous »

Этот фрагмент пытается применить градиент к входным данным обученной модели

Код: Выделить всё

import torch
import torch.nn as nn

DATASET_SIZE = 10
TUNING_EPOCH = 10
RANDOMIZATION = "rand"
shape = (10000,)
bsize = 1
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

input = eval(f"torch.{RANDOMIZATION}")(bsize, *shape).to(device).requires_grad_()
numel = input.numel()
model = nn.Sequential(
nn.Flatten(),
nn.Linear(numel, numel//2),
nn.Tanh(),
nn.Linear(numel//2, 1)
).to(device)
model_optimizer = torch.optim.Adam(model.parameters())
optimizer = torch.optim.Adam([input])
dataset = [(eval(f"torch.{RANDOMIZATION}_like")(input), (torch.rand(bsize,1)+8).to(device)) for i in range(DATASET_SIZE)]

model.train()
for e in range(TUNING_EPOCH):
for x, y in dataset:
model_optimizer.zero_grad()
output = model(x)
loss = torch.nn.MSELoss()(output, y)
loss.backward(inputs=list(model.parameters()))
model_optimizer.step()

model.eval()
optimizer.zero_grad()
output = model(input)
output.backward(inputs=input)
print("\ninput.grad", input.grad)
Градиент input.grad, однако, равен 0. Есть 3 отдельных исправления
  • установите TUNING_EPOCH = 0, т.е. не обучайте модель
  • установите RANDOMIZATION = "randn", т.е. другое распределение входных данных
    < li>установите shape = (1000,), уменьшив размер ввода
Почему эти три изменения по отдельности устранят проблему с нулевым градиентом?< /п>

Подробнее здесь: https://stackoverflow.com/questions/787 ... input-zero

Вернуться в «Python»