Вычисление производных матриц с помощью torch.autograd.grad (PyTorch)

Я пытаюсь вычислить производные матриц в PyTorch, используя torch.autograd.grad, однако у меня возникает несколько проблем. Вот минимальный рабочий пример для воспроизведения ошибки.

theta = torch.tensor(np.random.uniform(low=-np.pi, high=np.pi), requires_grad=True)
rot_mat = torch.tensor([[torch.cos(theta), torch.sin(theta), 0], 
                        [-torch.sin(theta), torch.cos(theta), 0]], 
                        dtype=torch.float, requires_grad=True)
torch.autograd.grad(outputs=rot_mat, 
                    inputs=theta, grad_outputs=torch.ones_like(rot_mat), 
                    create_graph=True, retain_graph=True)

Этот код приводит к ошибке. Похоже, что один из дифференцированных тензоров не использовался на графике. Установите allow_unused = True, если это желаемое поведение.

Я пробовал использовать allow_unused = True, но градиенты возвращаются как None. Я не уверен, что вызывает отключение графика здесь.


person CodeEnthusiast    schedule 16.08.2020    source источник


Ответы (1)


Граф автограда Pytorch будет создан только при использовании функций pytorch.

Я думаю, что список Python 2d, используемый при создании rot_mat, отключает график. Таким образом, использование функций torch создает матрицу вращения, а также просто использует функцию backward() для вычисления градиентов. Вот пример кода:

import torch
import numpy as np

theta   = torch.tensor(np.random.uniform(low=-np.pi, high=np.pi), requires_grad=True)

# create required values and convert it to torch 1d tensor
cos_t   = torch.cos(theta).view(1)
sin_t   = torch.sin(theta).view(1)
msin_t  = -sin_t
zero    = torch.zeros(1)

# create rotation matrix using only pytorch functions
rot_1d  = torch.cat((cos_t, sin_t, zero, msin_t, cos_t, zero))
rot_mat = rot_1d.view((2, 3)) 

# Autograd
rot_mat.backward(torch.ones_like(rot_mat))

# gradient
print(theta.grad)
person Girish Dattatray Hegde    schedule 16.08.2020