Минимизировать угол в pytorch - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь выяснить, как минимизировать скаляр в 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

1 Ответ

0 голосов
/ 10 октября 2018

Вот необходимые изменения в классе AngleModel, чтобы он работал:

class AngleModel(nn.Module):
    def __init__(self):
        super(AngleModel, self).__init__()
        self.angle = nn.Parameter(torch.tensor(0.0))

    def forward(self, input):
        qw = torch.cos(self.angle / 2.)
        qx = 0.0
        qy = 0.0
        qz = torch.sin(self.angle / 2.)

        matrix = torch.zeros(3, 3)

        matrix[0, 0] = 1. - 2. * qy ** 2 - 2. * qz ** 2
        matrix[1, 1] = 1. - 2. * qx ** 2 - 2. * qz ** 2
        matrix[2, 2] = 1. - 2. * qx ** 2 - 2. * qy ** 2

        matrix[0, 1] = 2. * qx * qy - 2. * qz * qw
        matrix[1, 0] = 2. * qx * qy + 2. * qz * qw

        matrix[0, 2] = 2. * qx * qz + 2 * qy * qw
        matrix[2, 0] = 2. * qx * qz - 2 * qy * qw

        matrix[1, 2] = 2. * qy * qz - 2. * qx * qw
        matrix[2, 1] = 2. * qy * qz + 2. * qx * qw

        output = torch.matmul(input, matrix)
        return output

Среди прочего, главная причина, по которой он раньше не работал, заключалась в том, что график был непоследовательным из-запромежуточное использование NumPy.Кроме того, кватернионные компоненты qw..qz были вычислены только один раз в методе __init__.Их расчет тоже должен был перейти на шаг вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...