Cum se utilizează funcția torch.stack (Programare, Python, Pytorch, Tensor)

조수호 a intrebat.

Am o întrebare despre torch.stack

Am 2 tensori, a.shape=(2, 3, 4) și b.shape=(2, 3).Cum să le stivuiesc fără operație in-place?

3 răspunsuri
arjoonn

Stivuirea necesită același număr de dimensiuni. O variantă ar fi să desfaceți și să stivuiți. De exemplu:

a.size()  # 2, 3, 4
b.size()  # 2, 3
b = torch.unsqueeze(b, dim=2)  # 2, 3, 1
# torch.unsqueeze(b, dim=-1) does the same thing

torch.stack([a, b], dim=2)  # 2, 3, 5

Comentarii

  • Răspuns perfect. Mulțumesc mult –  > Por 조수호.
  • Ceea ce doriți este să utilizați torch.cat cu unsqueeze așa cum ați făcut dumneavoastră. torch.stack creează o dimensiune NOUĂ, iar toți tensorii furnizați trebuie să aibă aceeași dimensiune. –  > Por drevicko.
  • Acest răspuns este incorect cu torch.stack([a, b], dim=2), în schimb, trebuie să utilizați torch.cat([a,b], dim=2) așa cum a menționat corect @drevicko. torch.cat concatenează secvențele în dimensiunea dată, în timp ce torch.stack concatenează secvențele într-o nouă dimensiune, așa cum se menționează aici: stackoverflow.com/questions/54307225/… . –  > Por războinicUSP.
  • Acest lucru nu va rula. În schimb, veți primi ‘RuntimeError: stack expects each tensor to be equal size, but got [2, 3, 4] at entry 0 and [2, 3, 1] at entry 1’ –  > Por JP Zhang.
gil.fernandes

Folosind pytorch 1.2 sau 1.4 răspunsul lui arjoonn nu a funcționat pentru mine.

În loc de torch.stack Am folosit torch.cat cu pytorch 1.2 și 1.4:

>>> import torch
>>> a = torch.randn([2, 3, 4])
>>> b = torch.randn([2, 3])
>>> b = b.unsqueeze(dim=2)
>>> b.shape
torch.Size([2, 3, 1])
>>> torch.cat([a, b], dim=2).shape
torch.Size([2, 3, 5])

Dacă doriți să utilizați torch.stack dimensiunile tensorilor trebuie să fie aceleași:

>>> a = torch.randn([2, 3, 4])
>>> b = torch.randn([2, 3, 4])
>>> torch.stack([a, b]).shape
torch.Size([2, 2, 3, 4])

Iată un alt exemplu:

>>> t = torch.tensor([1, 1, 2])
>>> stacked = torch.stack([t, t, t], dim=0)
>>> t.shape, stacked.shape, stacked

(torch.Size([3]),
 torch.Size([3, 3]),
 tensor([[1, 1, 2],
         [1, 1, 2],
         [1, 1, 2]]))

Cu stack aveți dim care vă permite să precizați pe ce dimensiune se suprapun tensorii cu dimensiuni egale.

pourya

să presupunem că aveți doi tensori a, b care sunt egali în dimensiuni adică a ( A, B, C) deci b (A, B , C)un exemplu

a=torch.randn(2,3,4)
b=torch.randn(2,3,4)
print(a.size())  # 2, 3, 4
print(b.size()) # 2, 3, 4

f=torch.stack([a, b], dim=2)  # 2, 3, 2, 4
f

nu va acționa dacă nu ar fi de aceeași dim. Aveți grijă!!!