Fonction torch.index_add de PyTorch
Manuel de référence Pytorch torch
torch.index_addest une fonction de PyTorch utilisée pour ajouter les valeurs d’un tenseur source à des positions d’index spécifiées. Le long de la dimension spécifiéedim, àindexajouter aux positions d'index spécifiéessourceles valeurs de.
Définition de fonction
torch.index_add(input, dim, index, source, *, alpha=1)
Parameters:
input(Tensor) : tenseur d'entrée.dim(int) : La dimension de l'index.index(Tensor) : Un tenseur entier unidimensionnel spécifiant les positions auxquelles ajouter.source(Tensor) : Tenseur source, les valeurs à ajouter.alpha(float, facultatif) : Facteur d'échelle pour source, la valeur par défaut est 1.
Valeur de retour:
torch.Tensor: Renvoie le tenseur modifié.
Exemples d'utilisation
Exemple
import torch
# Créer un tenseur d'entrée
input = torch.randn(4, 5)
# Créer l'index et la source
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Ajouter le long de dim=0
output = torch.index_add(input, dim=0, index=index, source=source)
print("Forme de l'entrée :", input.shape)
print("Index :", index)
print("Source shape:", source.shape)
print("Forme du résultat :", output.shape)
print("nRésultat :")
print(output)
# Créer un tenseur d'entrée
input = torch.randn(4, 5)
# Créer l'index et la source
index = torch.tensor([0, 2, 3])
source = torch.randn(3, 5)
# Ajouter le long de dim=0
output = torch.index_add(input, dim=0, index=index, source=source)
print("Forme de l'entrée :", input.shape)
print("Index :", index)
print("Source shape:", source.shape)
print("Forme du résultat :", output.shape)
print("nRésultat :")
print(output)
Résultat de sortie :
输入形状: 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]])
Exemple
import torch
# Utiliser le paramètre alpha pour mettre à l'échelle source
input = torch.zeros(5)
index = torch.tensor([0, 2, 4])
source = torch.tensor([10, 20, 30])
# alpha=2 signifie ajouter après avoir multiplié source par 2
output = torch.index_add(input, dim=0, index=index, source=source, alpha=2)
print("Entrée :", input)
print("Source :", source)
print("Résultat après alpha=2 :", output)
# Utiliser le paramètre alpha pour mettre à l'échelle source
input = torch.zeros(5)
index = torch.tensor([0, 2, 4])
source = torch.tensor([10, 20, 30])
# alpha=2 signifie ajouter après avoir multiplié source par 2
output = torch.index_add(input, dim=0, index=index, source=source, alpha=2)
print("Entrée :", input)
print("Source :", source)
print("Résultat après alpha=2 :", output)
Résultat de sortie :
输入: tensor([0., 0., 0., 0., 0.]) 源: tensor([10., 20., 30.]) alpha=2 后的结果: tensor([20., 0., 40., 0., 60.])
Exemple
import torch
# Ajouter selon une autre dimension
input = torch.zeros(3, 4, 5)
index = torch.tensor([1, 3])
source = torch.randn(2, 4, 5)
# Ajouter selon dim=1
output = torch.index_add(input, dim=1, index=index, source=source)
print("Forme de l'entrée :", input.shape)
print("Forme de l'index :", index.shape)
print("Source shape:", source.shape)
print("Forme du résultat :", output.shape)
# Ajouter selon une autre dimension
input = torch.zeros(3, 4, 5)
index = torch.tensor([1, 3])
source = torch.randn(2, 4, 5)
# Ajouter selon dim=1
output = torch.index_add(input, dim=1, index=index, source=source)
print("Forme de l'entrée :", input.shape)
print("Forme de l'index :", index.shape)
print("Source shape:", source.shape)
print("Forme du résultat :", output.shape)
Résultat de sortie :
输入形状: torch.Size([3, 4, 5]) 索引形状: torch.Size([2]) 源形状: torch.Size([2, 4, 5]) 结果形状: torch.Size([3, 4, 5])
Exemple
import torch
# Application dans les réseaux de neurones : mécanisme d'attention
# Supposer qu'il y a plusieurs paires clé-valeur à agréger à la requête
# Simuler une requête et une paire clé-valeur
num_queries = 2
num_kv = 4
dim = 3
# Indices de requête
query_idx = torch.tensor([0, 1])
# Valeurs correspondantes
values = torch.randn(num_queries, dim) * 10
# Sortie
output = torch.zeros(num_kv, dim)
# Ajouter la valeur à la position correspondante
output = torch.index_add(output, dim=0, index=query_idx, source=values)
print("Indices de requête :", query_idx)
print("Valeurs :", values)
print("Résultat d'agrégation :", output)
# Application dans les réseaux de neurones : mécanisme d'attention
# Supposer qu'il y a plusieurs paires clé-valeur à agréger à la requête
# Simuler une requête et une paire clé-valeur
num_queries = 2
num_kv = 4
dim = 3
# Indices de requête
query_idx = torch.tensor([0, 1])
# Valeurs correspondantes
values = torch.randn(num_queries, dim) * 10
# Sortie
output = torch.zeros(num_kv, dim)
# Ajouter la valeur à la position correspondante
output = torch.index_add(output, dim=0, index=query_idx, source=values)
print("Indices de requête :", query_idx)
print("Valeurs :", values)
print("Résultat d'agrégation :", output)
Remarque :torch.index_addne modifie pas le tenseur d'entrée d'origine, mais renvoie un nouveau tenseur. Siindexil y a des indices en double dans [index], les valeurs seront accumulées.alphaLe paramètre [alpha] peut être utilisé pour mettre à l'échelle les valeurs source.
Autres extensions