Fonction torch.stack de PyTorch
Manuel de référence Pytorch torch
torch.stackC'est une fonction de PyTorch utilisée pour empiler plusieurs tenseurs le long d'une nouvelle dimension. Elle crée une nouvelle dimension et place tous les tenseurs d'entrée le long de cette nouvelle dimension.
Elle est couramment utilisée en apprentissage profond pour des scénarios tels que la création de lots de données et l'empilement des sorties de plusieurs modèles.
Définition de fonction
torch.stack(tensors, dim=0, out=None)
Parameters:
tensors(Séquence de Tensor) : La séquence de tenseurs à empiler. Tous les tenseurs doivent avoir la même forme.dim(int, optionnel) : La dimension le long de laquelle empiler, par défaut 0. La nouvelle dimension sera insérée à cette position.out(Tensor, optionnel) : Le tenseur de sortie.
Valeur de retour:
torch.Tensor: Renvoie le tenseur empilé.
Exemples d'utilisation
Exemple 1: Empilement de base
Exemple
import torch
# Créer deux tenseurs unidimensionnels
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# Empiler selon une nouvelle dimension
c = torch.stack([a, b])
print("Forme de a :", a.shape)
print("Forme de b :", b.shape)
print("Forme de c :", c.shape)
print(c)
# Créer deux tenseurs unidimensionnels
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# Empiler selon une nouvelle dimension
c = torch.stack([a, b])
print("Forme de a :", a.shape)
print("Forme de b :", b.shape)
print("Forme de c :", c.shape)
print(c)
Le résultat de sortie est:
a 的形状: torch.Size([3])
b 的形状: torch.Size([3])
c 的形状: torch.Size([2, 3])
tensor([[1, 2, 3],
[4, 5, 6]])
Exemple 2: Spécification de la dimension d'empilement
Exemple
import torch
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# Empiler selon dim=1
c = torch.stack([a, b], dim=1)
print("Forme de c :", c.shape)
print(c)
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# Empiler selon dim=1
c = torch.stack([a, b], dim=1)
print("Forme de c :", c.shape)
print(c)
Le résultat de sortie est:
c 的形状: torch.Size([3, 2])
tensor([[1, 4],
[2, 5],
[3, 6]])
Exemple 3: Empilement de plusieurs tenseurs
Exemple
import torch
# Créer plusieurs tenseurs
tensors = [torch.tensor([i, i+1, i+2]) for i in range(5)]
# Empiler tous les tenseurs
result = torch.stack(tensors)
print("Forme du résultat :", result.shape)
print(result)
# Créer plusieurs tenseurs
tensors = [torch.tensor([i, i+1, i+2]) for i in range(5)]
# Empiler tous les tenseurs
result = torch.stack(tensors)
print("Forme du résultat :", result.shape)
print(result)
Le résultat de sortie est:
结果形状: torch.Size([5, 3])
tensor([[0, 1, 2],
[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
Exemple 4: Sauvegarde de plusieurs états dans un réseau de neurones
Exemple
import torch
# Simuler l'enregistrement des valeurs de perte pour plusieurs époques
losses = []
for epoch in range(5):
loss = torch.tensor([epoch * 0.1, (epoch + 1) * 0.1])
losses.append(loss)
# Empiler les pertes de toutes les époques
all_losses = torch.stack(losses)
print("Forme de la perte au fil des époques :", all_losses.shape)
print(all_losses)
# Simuler l'enregistrement des valeurs de perte pour plusieurs époques
losses = []
for epoch in range(5):
loss = torch.tensor([epoch * 0.1, (epoch + 1) * 0.1])
losses.append(loss)
# Empiler les pertes de toutes les époques
all_losses = torch.stack(losses)
print("Forme de la perte au fil des époques :", all_losses.shape)
print(all_losses)
Le résultat de sortie est:
各 epoch 损失形状: torch.Size([5, 2])
tensor([[0.0000, 0.1000],
[0.1000, 0.2000],
[0.2000, 0.3000],
[0.3000, 0.4000],
[0.4000, 0.5000]])
Différence entre torch.stack et torch.cat
Exemple
import torch
a = torch.randn(2, 3)
b = torch.randn(2, 3)
# stack crée une nouvelle dimension
stack_result = torch.stack([a, b])
print("forme du résultat de stack :", stack_result.shape)
# cat ne crée pas de nouvelle dimension
cat_result = torch.cat([a, b], dim=0)
print("forme du résultat de cat :", cat_result.shape)
a = torch.randn(2, 3)
b = torch.randn(2, 3)
# stack crée une nouvelle dimension
stack_result = torch.stack([a, b])
print("forme du résultat de stack :", stack_result.shape)
# cat ne crée pas de nouvelle dimension
cat_result = torch.cat([a, b], dim=0)
print("forme du résultat de cat :", cat_result.shape)
Le résultat de sortie est:
stack 结果形状: torch.Size([2, 2, 3]) cat 结果形状: torch.Size([4, 3])
torch.stack: Empile le long d'une nouvelle dimension ; les tenseurs d'entrée doivent avoir exactement la même forme, et une nouvelle dimension est ajoutée.torch.cat: Concatène le long d'une dimension existante ; les tenseurs d'entrée peuvent différer dans la dimension de concaténation, et aucune nouvelle dimension n'est ajoutée.
Autres extensions