Fonction torch.index_copy de PyTorch
Manuel de référence Pytorch torch
torch.index_copyest une fonction de PyTorch utilisée pour copier le tenseur source vers les positions d'index spécifiées. Elle, selon la dimension spécifiéedim, àindexles positions d'index spécifiées, copiesourcela valeur de.
ettorch.index_addLa différence est,index_copyécrase plutôt que d'accumuler.
Définition de fonction
torch.index_copy(input, dim, index, source)
Parameters:
input(Tensor) : tenseur d'entrée.dim(int) : la dimension de l'index.index(Tensor) : un tenseur d'entiers unidimensionnel spécifiant les positions vers lesquelles copier.source(Tensor) : le tenseur source, les valeurs à copier.
Valeur de retour:
torch.Tensor: renvoie le tenseur modifié.
Exemple d'utilisation
Exemple
import torch
# Créer le 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)
# Copier le long de dim=0
output = torch.index_copy(input, dim=0, index=index, source=source)
print(Entrée :)
print(input)
print(nSource :)
print(source)
print(nLe résultat après copie aux positions [0, 2, 3] :)
print(output)
# Créer le 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)
# Copier le long de dim=0
output = torch.index_copy(input, dim=0, index=index, source=source)
print(Entrée :)
print(input)
print(nSource :)
print(source)
print(nLe résultat après copie aux positions [0, 2, 3] :)
print(output)
La sortie est :
输入:
tensor([[ 0.3456, -0.1234, 0.5678, -0.2345, 0.8901],
[-0.5678, 0.1234, -0.6789, 0.2345, -0.1234],
[ 0.7890, -0.3456, 0.1234, -0.5678, 0.3456],
[-0.1234, 0.4567, -0.8901, 0.6789, -0.5678]])
源:
tensor([[-1.2345, 0.5678, -1.2345, 0.5678, -1.2345],
[ 1.5678, -0.6789, 1.5678, -0.6789, 1.5678],
[-0.8901, 1.2345, -0.8901, 1.2345, -0.8901]])
复制到位置 [0, 2, 3] 后的结果:
tensor([[-1.2345, 0.5678, -1.2345, 0.5678, -1.2345],
[-0.5678, 0.1234, -0.6789, 0.2345, -0.1234],
[ 1.5678, -0.6789, 1.5678, -0.6789, 1.5678],
[-0.8901, 1.2345, -0.8901, 1.2345, -0.8901]])
Exemple
import torch
# Copier le long de dim=1
input = torch.zeros(3, 5)
index = torch.tensor([1, 3])
source = torch.tensor([[10, 20, 30, 40, 50],
[60, 70, 80, 90, 100]])
output = torch.index_copy(input, dim=1, index=index, source=source)
print(Entrée :)
print(input)
print(nSource :)
print(source)
print(nLe résultat après copie aux positions [1, 3] :)
print(output)
# Copier le long de dim=1
input = torch.zeros(3, 5)
index = torch.tensor([1, 3])
source = torch.tensor([[10, 20, 30, 40, 50],
[60, 70, 80, 90, 100]])
output = torch.index_copy(input, dim=1, index=index, source=source)
print(Entrée :)
print(input)
print(nSource :)
print(source)
print(nLe résultat après copie aux positions [1, 3] :)
print(output)
La sortie est :
输入:
tensor([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
源:
tensor([[ 10., 20., 30., 40., 50.],
[ 60., 70., 80., 90., 100.]])
复制到位置 [1, 3] 后的结果:
tensor([[ 0., 10., 0., 20., 0.],
[ 0., 60., 0., 70., 0.],
[ 0., 0., 0., 0., 0.]])
Exemple
import torch
# Construire un grand tenseur
# Supposons que nous devions fusionner les résultats de plusieurs petits lots en un seul grand lot
# Tenseur cible
batch_size = 8
feature_dim = 4
output = torch.zeros(batch_size, feature_dim)
# Simuler les résultats de plusieurs petits lots
mini_batches = [
torch.randn(2, feature_dim),
torch.randn(3, feature_dim),
torch.randn(1, feature_dim)
]
# La position où chaque lot doit être placé
indices = [0, 2, 5]
# Copier chaque lot dans l'ordre
for idx, batch in zip(indices, mini_batches):
# Créer un index de taille correspondante
index = torch.arange(idx, idx + len(batch))
output = torch.index_copy(output, dim=0, index=index, source=batch)
print(Forme de sortie finale :, output.shape)
print(output)
# Construire un grand tenseur
# Supposons que nous devions fusionner les résultats de plusieurs petits lots en un seul grand lot
# Tenseur cible
batch_size = 8
feature_dim = 4
output = torch.zeros(batch_size, feature_dim)
# Simuler les résultats de plusieurs petits lots
mini_batches = [
torch.randn(2, feature_dim),
torch.randn(3, feature_dim),
torch.randn(1, feature_dim)
]
# La position où chaque lot doit être placé
indices = [0, 2, 5]
# Copier chaque lot dans l'ordre
for idx, batch in zip(indices, mini_batches):
# Créer un index de taille correspondante
index = torch.arange(idx, idx + len(batch))
output = torch.index_copy(output, dim=0, index=index, source=batch)
print(Forme de sortie finale :, output.shape)
print(output)
La sortie est :
最终输出形状: torch.Size([8, 4])
tensor([[ 0.1234, -0.5678, 0.8901, -0.2345],
[ 0.6789, -0.1234, -0.5678, 0.3456],
[ 1.2345, -0.8901, 0.1234, -0.6789],
[-0.3456, 0.5678, -0.1234, 0.8901],
[ 1.5678, -0.2345, 0.6789, -0.1234],
[-0.8901, 0.3456, 0.5678, -0.8901],
[ 0.0000, 0.0000, 0.0000, 0.0000],
[ 0.0000, 0.0000, 0.0000, 0.0000]])
Remarque :torch.index_copyne modifie pas le tenseur d'entrée d'origine, mais renvoie un nouveau tenseur.index_copyest une opération d'écrasement, contrairement àtorch.index_addl'opération d'accumulation est différente.
Autres extensions