Deep-Learning-with-PyTorch-3.8.2 轉(zhuǎn)置而不復(fù)制

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)寫形式:

# 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ǔ)跳過兩個(gè)元素,在增加第二個(gè)索引(從點(diǎn)[0,0]到點(diǎn)[0,1]的同時(shí))將沿著存儲(chǔ)空間跳一。 換句話說,存儲(chǔ)器將張量中的元素逐行順序地保持。

我們可以將點(diǎn)轉(zhuǎn)置為points_t,如圖3.6所示。 我們按步幅改變?cè)氐捻樞颉?之后,增加行(張量的第一個(gè)索引)將沿存儲(chǔ)空間跳過一個(gè),就像我們沿點(diǎn)的列移動(dòng)時(shí)一樣。 這就是轉(zhuǎn)置的定義。 沒有分配新的內(nèi)存:僅通過創(chuàng)建步長(zhǎng)順序與原始步長(zhǎng)順序不同的新Tensor實(shí)例來獲得轉(zhuǎn)置。

圖3.6 在向量上的轉(zhuǎn)置
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容