Функция outer
Функция outer вычисляет внешнее произведение двух векторов.
Первым параметром передаётся первый вектор (тензор размерности 1),
вторым параметром - второй вектор.
Результатом является двумерный тензор (матрица),
где элемент с индексами i, j равен произведению элемента
i первого вектора на элемент j второго вектора.
Функция поддерживает вычисления на GPU и автоматическое дифференцирование.
Синтаксис
torch.outer(vec1, vec2)
Пример
Давайте вычислим внешнее произведение двух простых векторов:
import torch
v1 = torch.tensor([1, 2, 3])
v2 = torch.tensor([4, 5, 6])
res = torch.outer(v1, v2)
print(res)
Результат выполнения кода:
tensor([
[4, 5, 6],
[8, 10, 12],
[12, 15, 18],
])
Как видно из результата, каждый элемент результирующей матрицы равен произведению элемента из первого вектора на элемент из второго.
Пример
Вычислим внешнее произведение векторов с плавающей точкой:
import torch
v1 = torch.tensor([1.5, 2.0], dtype=torch.float32)
v2 = torch.tensor([3.0, 4.0, 5.0], dtype=torch.float32)
res = torch.outer(v1, v2)
print(res)
Результат выполнения кода:
tensor([
[4.5000, 6.0000, 7.5000],
[6.0000, 8.0000, 10.0000],
])
Пример
Используем функцию outer для создания матрицы весов
в задачах линейной алгебры. Например, для вычисления
матрицы ковариации между двумя наборами данных:
import torch
torch.manual_seed(0)
mean1 = torch.tensor([2.0])
mean2 = torch.tensor([3.0])
centered1 = torch.tensor([1.0, -1.0, 2.0])
centered2 = torch.tensor([2.0, -2.0, 1.0])
cov_matrix = torch.outer(centered1, centered2) / len(centered1)
print(cov_matrix)
Результат выполнения кода:
tensor([
[0.6667, -0.6667, 0.3333],
[-0.6667, 0.6667, -0.3333],
[1.3333, -1.3333, 0.6667],
])
Пример
Функцию outer можно использовать для создания
матриц специального вида, например, матрицы
Якоби для градиентных вычислений:
import torch
x = torch.tensor([2.0, 3.0, 4.0], requires_grad=True)
w = torch.tensor([1.0, 2.0, 3.0])
grad = torch.outer(x, w)
print(grad.shape)
print(grad)
Результат выполнения кода:
torch.Size([3, 3])
tensor([
[2., 4., 6.],
[3., 6., 9.],
[4., 8., 12.],
], grad_fn=<OuterBackward0>)
Обратите внимание на наличие grad_fn - это означает,
что функция поддерживает автоматическое дифференцирование.