Факел назначается не на месте путем тензорной нарезки в pytorch - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь преобразовать мой текущий код, который присваивает тензоры на месте, во внешнюю операцию.
То есть в настоящее время код равен

self.X[:, nc:] = D

Где D находится в той же форме как self.X[:, nc:]
Но я хотел бы преобразовать его в

sliced_index = ~ somehow create an indexed tensor from self.X[:, nc:]
self.X = self.X.scatter(1,sliced_index,mm(S_, Z[:, :n - nc]))

И не знаю, как создать этот тензор индексной маски, который представляет только записи в нарезанном тензоре

Минимальный пример:

a = [[0,1,2],[3,4,5]]
D = [[6],[7]]
Not_in_place = [[0,1,6],[3,4,7]]

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Маскированный разброс немного легче. Сама маска может быть вычислена как операция на месте, после которой вы можете использовать masked_scatter

mask = torch.zeros(self.X.shape, device=self.X.device, dtype=torch.bool)
mask[:, nc:] = True
self.X = self.X.masked_scatter(mask, D)

Более специализированная версия, которая полагается на вещание, но должна быть более эффективной, будет

mask = torch.zeros([1, self.X.size(1)], device=self.X.device, dtype=torch.bool)
mask[0, nc:] = True
self.X = self.X.masked_scatter(mask, D)
1 голос
/ 30 марта 2020

Используйте Tensor.clone для копирования тензора.

a = torch.tensor([[0,1,2],[3,4,5]])
D = torch.tensor([[6],[7]])

n, n[:,-1:] = a.clone(), D
n
tensor([[0, 1, 6],
        [3, 4, 7]])
a
tensor([[0, 1, 2],
        [3, 4, 5]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...