3.8.2 轉(zhuǎn)置而不復(fù)制
讓我們現(xiàn)在嘗試轉(zhuǎn)置聪姿。 讓我們看一下點(diǎn)張量,將其在行中具有單個(gè)點(diǎn)乙嘀,在列中具有X和Y坐標(biāo)咳燕,然后將其旋轉(zhuǎn)以使單個(gè)點(diǎn)在列中。 我們借此機(jī)會(huì)介紹t函數(shù)乒躺,它是二維張量轉(zhuǎn)置的一種簡(jiǎn)寫(xiě)形式:
# In[30]:
points = torch.tensor([[4.0, 1.0], [5.0, 3.0], [2.0, 1.0]])
points
# Out[30]:
tensor([[4., 1.],
[5., 3.],
[2., 1.]])
# In[31]:
points_t = points.t()
points_t
# Out[31]:
tensor([[4., 5., 2.],
[1., 3., 1.]])
提示:為幫助您深入了解張量的原理,在逐步閱讀本節(jié)中的代碼時(shí)低缩,最好拿起一支鉛筆嘉冒,一張紙和一個(gè)涂鴉圖,如圖3.5所示咆繁。
我們可以輕松地驗(yàn)證兩個(gè)張量共享相同的存儲(chǔ)
# In[32]:
id(points.storage()) == id(points_t.storage())
# Out[32]:
True
并且它們只是形狀和步幅不同:
# In[33]:
points.stride()
# Out[33]:
(2, 1)
# In[34]:
points_t.stride()
# Out[34]:
(1, 2)
這告訴我們讳推,將第一個(gè)索引以點(diǎn)為單位增加一個(gè),例如玩般,從points [0,0]到points [1,0]银觅,將沿著存儲(chǔ)跳過(guò)兩個(gè)元素,在增加第二個(gè)索引(從點(diǎn)[0,0]到點(diǎn)[0,1]的同時(shí))將沿著存儲(chǔ)空間跳一坏为。 換句話說(shuō)究驴,存儲(chǔ)器將張量中的元素逐行順序地保持。
我們可以將點(diǎn)轉(zhuǎn)置為points_t匀伏,如圖3.6所示洒忧。 我們按步幅改變?cè)氐捻樞颉?之后,增加行(張量的第一個(gè)索引)將沿存儲(chǔ)空間跳過(guò)一個(gè)够颠,就像我們沿點(diǎn)的列移動(dòng)時(shí)一樣熙侍。 這就是轉(zhuǎn)置的定義罩句。 沒(méi)有分配新的內(nèi)存:僅通過(guò)創(chuàng)建步長(zhǎng)順序與原始步長(zhǎng)順序不同的新Tensor實(shí)例來(lái)獲得轉(zhuǎn)置引颈。