Функция torch.index_add в PyTorch
Справочное руководство Pytorch torch
torch.index_add— это функция в PyTorch, используемая для добавления значений тензора-источника в указанные индексные позиции. Вдоль указанного измеренияdim, поindexдобавить в указанные позиции индексаsourceзначения из.
Определение функции
torch.index_add(input, dim, index, source, *, alpha=1)
Parameters:
input(Tensor): входной тензор.dim(int): Размерность индекса.index(Tensor): Одномерный целочисленный тензор, задающий позиции, в которые нужно добавить.source(Tensor): Тензор-источник, значения, которые нужно добавить.alpha(float, optional): Коэффициент масштабирования для source, по умолчанию 1.
Возвращаемое значение:
torch.Tensor: Возвращает изменённый тензор.
Примеры использования
Пример
import torch
# Создать входной тензор
input = torch.randn(4, 5)
# Создать index и source
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Добавить вдоль dim=0
output = torch.index_add(input, dim=0, index=index, source=source)
print("Форма входных данных:", input.shape)
print("Индекс:", index)
print("Форма source:", source.shape)
print("Форма результата:", output.shape)
print("nРезультат:")
print(output)
# Создать входной тензор
input = torch.randn(4, 5)
# Создать index и source
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Добавить вдоль dim=0
output = torch.index_add(input, dim=0, index=index, source=source)
print("Форма входных данных:", input.shape)
print("Индекс:", index)
print("Форма source:", source.shape)
print("Форма результата:", output.shape)
print("nРезультат:")
print(output)
Результат вывода:
输入形状: torch.Size([4, 5])
索引: tensor([0, 2, 3])
源形状: torch.Size([3, 5])
结果形状: torch.Size([4, 5])
结果:
tensor([[ 1.8435, 0.3463, -0.1024, 0.5678, 0.1234],
[-0.5678, 0.8901, -0.2345, 0.6789, -0.1234],
[ 2.3456, 0.4567, 0.7890, -0.3456, 0.5678],
[-0.7890, 1.2345, 0.3456, -0.8901, 0.2345]])
Пример
import torch
# Используйте параметр alpha для масштабирования source
input = torch.zeros(5)
index = torch.tensor([0, 2, 4])
source = torch.tensor([10, 20, 30])
# alpha=2 означает добавление после умножения source на 2
output = torch.index_add(input, dim=0, index=index, source=source, alpha=2)
print("Ввод:", input)
print("Источник:", source)
print("Результат после alpha=2:", output)
# Используйте параметр alpha для масштабирования source
input = torch.zeros(5)
index = torch.tensor([0, 2, 4])
source = torch.tensor([10, 20, 30])
# alpha=2 означает добавление после умножения source на 2
output = torch.index_add(input, dim=0, index=index, source=source, alpha=2)
print("Ввод:", input)
print("Источник:", source)
print("Результат после alpha=2:", output)
Результат вывода:
输入: tensor([0., 0., 0., 0., 0.]) 源: tensor([10., 20., 30.]) alpha=2 后的结果: tensor([20., 0., 40., 0., 60.])
Пример
import torch
# Добавить по другому измерению
input = torch.zeros(3, 4, 5)
index = torch.tensor([1, 3])
source = torch.randn(2, 4, 5)
# Добавить по dim=1
output = torch.index_add(input, dim=1, index=index, source=source)
print("Форма входных данных:", input.shape)
print("Форма индекса:", index.shape)
print("Форма source:", source.shape)
print("Форма результата:", output.shape)
# Добавить по другому измерению
input = torch.zeros(3, 4, 5)
index = torch.tensor([1, 3])
source = torch.randn(2, 4, 5)
# Добавить по dim=1
output = torch.index_add(input, dim=1, index=index, source=source)
print("Форма входных данных:", input.shape)
print("Форма индекса:", index.shape)
print("Форма source:", source.shape)
print("Форма результата:", output.shape)
Результат вывода:
输入形状: torch.Size([3, 4, 5]) 索引形状: torch.Size([2]) 源形状: torch.Size([2, 4, 5]) 结果形状: torch.Size([3, 4, 5])
Пример
import torch
# Применение в нейронных сетях: механизм внимания
# Предположим, есть несколько пар ключ-значение, которые нужно агрегировать в запрос
# Смоделировать запрос и ключ-значение
num_queries = 2
num_kv = 4
dim = 3
# Индексы запросов
query_idx = torch.tensor([0, 1])
# Соответствующие значения
values = torch.randn(num_queries, dim) * 10
# Вывод
output = torch.zeros(num_kv, dim)
# Добавить значение в соответствующую позицию
output = torch.index_add(output, dim=0, index=query_idx, source=values)
print("Индексы запроса:", query_idx)
print("Значения:", values)
print("Результат агрегации:", output)
# Применение в нейронных сетях: механизм внимания
# Предположим, есть несколько пар ключ-значение, которые нужно агрегировать в запрос
# Смоделировать запрос и ключ-значение
num_queries = 2
num_kv = 4
dim = 3
# Индексы запросов
query_idx = torch.tensor([0, 1])
# Соответствующие значения
values = torch.randn(num_queries, dim) * 10
# Вывод
output = torch.zeros(num_kv, dim)
# Добавить значение в соответствующую позицию
output = torch.index_add(output, dim=0, index=query_idx, source=values)
print("Индексы запроса:", query_idx)
print("Значения:", values)
print("Результат агрегации:", output)
Примечание:torch.index_addне изменяет исходный входной тензор, но возвращает новый тензор. Еслиindexесли в [index] есть повторяющиеся индексы, значения будут накапливаться.alphaПараметр [alpha] можно использовать для масштабирования исходных значений.
Другие расширения