欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytorch之scatter_的用法及說(shuō)明

 更新時(shí)間:2023年09月11日 11:21:36   作者:czg792845236  
這篇文章主要介紹了pytorch之scatter_的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

pytorch scatter_的用法

scatter_(input, dim, index, src)將src中數(shù)據(jù)根據(jù)index中的索引按照dim的方向填進(jìn)input中

這個(gè)函數(shù)可以從轉(zhuǎn)換成onehot編碼來(lái)理解。

看下面代碼:

index = torch.tensor([1,2,1,2,0])
torch.zeros(5,3).scatter_(1, index.unsqueeze(1), 1)  
# tensor([[0., 1., 0.],
#         [0., 0., 1.],
#         [0., 1., 0.],
#         [0., 0., 1.],
#         [1., 0., 0.]])

簡(jiǎn)要說(shuō)明

這段代碼的目的就是將李表[1,2,1,2,0]轉(zhuǎn)成one-hot編碼的形式。

因?yàn)橛?個(gè)數(shù)據(jù),然后數(shù)值范圍從0~2,所以需要設(shè)置3列,所以目標(biāo)矩陣應(yīng)該是5x3。

scatter_ 中第一個(gè)1表示沿著維度1的方向也就是列的方向,第二個(gè)參數(shù)表示需要填值的索引,第三個(gè)參數(shù)表示填的值。

比如以輸出結(jié)果的第一行為例,原本 torch.zeros 使得第一行的元素都是0,但是 scatter_ 的第二個(gè)輸入?yún)?shù)第一行是1(因?yàn)榻?jīng)過(guò)unsqueeze后第一行只有一個(gè)元素了),所以輸出結(jié)果的第一行的第1個(gè)元素(從0開(kāi)始)應(yīng)該填上 scatter 最后一個(gè)參數(shù)所表示的值,剩下的以此類推。

不過(guò)其實(shí)得到onehot編碼可以用pandas.get_dummies

index = [1,2,1,2,0]
pd.get_dummies(index)

.scatter_函數(shù)

.scatter_函數(shù)放置元素或者修改元素。

>>> x = torch.rand(2, 5)
>>> x
tensor([[0.6132, 0.8931, 0.7345, 0.6793, 0.6606],
        [0.0630, 0.1785, 0.7312, 0.6456, 0.6307]])
>>> torch.zeros(3, 5).scatter_(0, torch.LongTensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), 1)
tensor([[1., 1., 1., 1., 1.],
        [0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1.]])
>>> torch.zeros(3, 5).scatter_(0, torch.LongTensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), x)
tensor([[0.6132, 0.1785, 0.7312, 0.6793, 0.6606],
        [0.0000, 0.8931, 0.0000, 0.6456, 0.0000],
        [0.0630, 0.0000, 0.7345, 0.0000, 0.6307]])

torch.zeros(3,5),先創(chuàng)建一個(gè)3行5列的全為0的tensor,后續(xù)使用scatter函數(shù)往里放置元素,如何放置按照參數(shù)1和參數(shù)2的規(guī)定,放置哪些元素,按照參數(shù)3的規(guī)定。

具體來(lái)說(shuō)

上述.scatter_(參數(shù)1,參數(shù)2,參數(shù)3)中,參數(shù)0/1表示,按行/列進(jìn)行元素的放置(維度再高類比擴(kuò)展),參數(shù)2用于找索引(找torch.zeros中位置),參數(shù)3為希望放入的元素。例如當(dāng)參數(shù)3為x的時(shí)候,torch.zeros(3,5)中填入的為x中的元素;當(dāng)參數(shù)3為1的時(shí)候,形成的tensor中為1,即表示希望放入的元素為1。

如何放置,先從簡(jiǎn)單的,放置的元素為1開(kāi)始:

第一步,先看參數(shù)2,找index。

參數(shù)2的值是一個(gè)tensor:

[[0, 1, 2, 0, 0],
[2, 0, 0, 1, 2]]

例如,其中第1行第0列(1,0)的值為2,即index=2。

第二步,根據(jù)index確定行/列,看參數(shù)1。

本例中參數(shù)1為0,按放置,因此在torch.zeros(3,5)的第2行(注意從0開(kāi)始)填入1,那么,在第2行(從0開(kāi)始)的哪一列填入1呢,需要遵循的原則是:第一步中index所在位置為第1列,因此放入第1列。因此在torch.zeros(3,5)的(2,1)位置上放入1。

即往torch.zeros(3,5)中填入元素的時(shí)候,torch.zeros(3,5)中元素的列與x的列是相同的,這一點(diǎn)當(dāng)x是具體數(shù)值的時(shí)候比較清晰??梢钥闯鰔的列與torch.zeros(3,5)最后填完之后的列中的元素是對(duì)應(yīng)的,比如第1列的元素不會(huì)跑到第2列去,但是行不一定。

那么,復(fù)雜一點(diǎn),如果放置的元素不是1,而是需要把x中的元素放入呢。增加第三步,目前已經(jīng)找到參數(shù)2中 (1,0) 的index是2了,再看參數(shù)3,此時(shí)參數(shù)3為x,在x中找 (1,0) 位置上的元素是0.0630,因此這時(shí)候在第二步中,放入第1行第0列的元素不是1,而是0.0630。因此在torch.zeros(3,5)的(2,1)位置上放入0.0630。

Note:

  • 第二步中,如果參數(shù)=1,表示按行放置,則先確定行再確定列;如果參數(shù)=0,表示按列放置,則先確定列再確定行。
  • 本例中因?yàn)槭前葱蟹胖?,要求torch.zeros(3,5)的列與x的列是相同的,否則沒(méi)法做到列列對(duì)應(yīng);如果是按列方式,則要求【被填入的torch】與x的行是相同的,否則沒(méi)法做到行行對(duì)應(yīng)。
  • 參數(shù)2中的值控制的是【被填入的torch】的x行或者x列,因此參數(shù)2中的最大值,不應(yīng)該超過(guò)【被填入的torch】的行/列(按列排序/按行排序)–>參數(shù)2控制位置。

->按行排序,列列對(duì)應(yīng);按列排序,行行對(duì)應(yīng)。

參數(shù)2,參數(shù)1,最后再看參數(shù)3。

index數(shù)值找到確定行/列,再看index位置,確定列/行。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論