Функция torch.index_add в PyTorch


Pytorch torch 参考手册Справочное руководство 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)

Результат вывода:

输入形状: 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)

Результат вывода:

输入: 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)

Результат вывода:

输入形状: 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)

Примечание:torch.index_addне изменяет исходный входной тензор, но возвращает новый тензор. Еслиindexесли в [index] есть повторяющиеся индексы, значения будут накапливаться.alphaПараметр [alpha] можно использовать для масштабирования исходных значений.


Pytorch torch 参考手册Справочное руководство Pytorch torch

Другие расширения