Рассчитать градиент относительно метки данных в PytorchPython

Программы на Python
Anonymous
Рассчитать градиент относительно метки данных в Pytorch

Сообщение Anonymous »

Я работаю над реализацией метода из исследовательской работы, где мне нужно рассчитать градиенты относительно меток данных. Вот подход, которому я следую:
Изображение

Рассчитать градиент потерь относительно параметров модели (grad1).
Рассчитать градиент grad1 относительно меток данных.
Однако я возникла проблема, из-за которой градиент по отношению к меткам данных всегда имеет значение «Нет». Кажется, метки данных (y) не являются частью вычислительного графа (y.grad_fn возвращает None).

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

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from torch.nn.utils import parameters_to_vector

class LeNet(nn.Module):
def __init__(self):
super(LeNet, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)

def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = self.pool(torch.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x)
return x

# Load CIFAR10 dataset
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=1, shuffle=True)

model = LeNet()
criterion = nn.CrossEntropyLoss()

# Get a batch of data
x, y = next(iter(trainloader))

y = y.float().requires_grad_(True)

output = model(x)
loss = criterion(output, y.long())

first_order_grads = torch.autograd.grad(loss, model.parameters(), create_graph=True)

Jm_list = []

for grad in first_order_grads:
if grad is not None:
for grad_element in parameters_to_vector(grad):
Jm = torch.autograd.grad(grad_element, y, retain_graph=True, allow_unused=True)[0]
Jm_list.append(Jm)
Мне нужен совет по двум вопросам:
Как включить метки данных в вычислительный график?
Есть ли альтернатива методы для эффективного расчета градиентов по отношению к меткам данных?
Будем очень признательны за любую информацию или ссылки на аналогичные реализации!

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

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