Определить пользовательский переменный тензор Pytorch - PullRequest
0 голосов
/ 29 января 2020

У меня есть проблема, похожая на эту:

Есть входной вектор вида (n1, n2), и я хочу модель, где f(n1, n2) = f(n2, n1). Я хочу, чтобы эта модель была линейной. Например, матрица 2x2, которую я хочу выучить. Матрица 2x2 имеет 4 веса, которые тренинг попытается выучить. Тем не менее, сжатие позволяет умное решение проблемы. f(nvec) = W*nvec, будучи nvec=(n1, n2). Итак, пусть X = [[0, 1],[1, 0]] будет 2x2 матрицей, которая переворачивает векторы, тогда f(n2,n1) = W*X*(n1, n2) = f(n1, n2) = W (n1, n2).

По существу, равенство подразумевает, что W*X = W, или, если W = [[w1, w2], [w3, w4]], то равенство подразумевает W = [[w1, w1], [w3, w3]] матрица имеет только 2 свободных параметра. Как я могу определить модель, подобную этой, в pytorch?

Спасибо.

1 Ответ

1 голос
/ 29 января 2020

Если у вас есть специальная структура для ваших параметров, и вы не хотите использовать параметры по умолчанию, сохраненные слоями по умолчанию, вы можете определить слой самостоятельно и использовать nn.Parameter для хранения ваши параметры.

Например,

class CustomLayer(nn.Module):  # layer must be derived from nn.Module class
  def __init__(self):  # you can have arguments here...
    super(CustomLayer, self).__init__()
    self.params = nn.Parameter(data=torch.rand((2, 1), dtype=torch.float), requires_grad=True)

  def forward(self, x):
    w = self.params.repeat(1, 2)  # create a 2x2 matrix from the two parameters
    y = torch.bmm(x, w)
    return y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...