Я пытаюсь выяснить, как минимизировать скаляр в pytorch, который представляет угол поворота оси / угла.My target
- это выборочный набор трехмерных векторов, my input
- это target
, повернутый на определенную ось / угол поворота (плюс некоторый гауссов шум).Ось известна и фиксирована.Я хочу найти угол, используя pytorch.
На данный момент у меня есть следующее: nn.Module
:
class AngleModel(torch.nn.Module):
def __init__(self):
super(AngleModel, self).__init__()
self.angle = nn.Parameter(Variable(torch.Tensor([0.0]), requires_grad=True))
self.qw = torch.cos(self.angle / 2.)
self.qx = 0.0
self.qy = 0.0
self.qz = torch.sin(self.angle / 2.)
def forward(self, input):
matrix_np = transform_from_pq([0, 0, 0, self.qw, self.qx, self.qy, self.qz])
matrix = torch.from_numpy(matrix_np)
input_ext = torch.cat((input, torch.ones(input.size(0)).reshape(-1, 1)), 1)
output = torch.matmul(input_ext.float(), matrix.float())
return output[:, :3]
Однако использование этого в оптимизаторе дает сбой, потому что model.parameters()
возвращает пустой список (т. Е. "Пустой" генератор).
Я совершенно новичок в pytorch.Что я делаю неправильно?
Соответствующий код
Инициализация:
def _init_model(self):
self.model = AngleModel()
self.crit = torch.nn.MSELoss()
l_rate = 0.01
print(list(self.model.parameters()))
self.optim = torch.optim.SGD(self.model.parameters(), lr = l_rate)
self.epochs = 2000
Функция обучения:
for epoch in range(self.epochs):
inputs = torch.from_numpy(normalize(input))
labels = torch.from_numpy(normalize(target))
_x = Variable(inputs, requires_grad = True) # without it complains about no grad_fn
_y = Variable(labels)
self.optim.zero_grad()
outputs = self.model.forward(_x)
loss = self.crit(outputs, _y)
loss.backward()
self.optim.step()
print("Epoch %6d loss %05.3f; %s" % (epoch, loss.data[0], self.model.angle))
Обновление 1:
- Кодмодуля обновлено
- Добавлен окружающий код
- Это, по крайней мере, больше не выдает никаких ошибок, но также не оптимизирует
angle