pytorch之scatter_的用法及說(shuō)明
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)文章
使用PyTorch訓(xùn)練一個(gè)圖像分類器實(shí)例
今天小編就為大家分享一篇使用PyTorch訓(xùn)練一個(gè)圖像分類器實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python + opencv對(duì)拍照得到的圖片進(jìn)行背景去除的實(shí)現(xiàn)方法
這篇文章主要介紹了Python + opencv對(duì)拍照得到的圖片進(jìn)行背景去除的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11python實(shí)時(shí)監(jiān)控cpu小工具
這篇文章主要為大家詳細(xì)介紹了python實(shí)時(shí)監(jiān)控cpu的小工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Python實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)采集新型冠狀病毒數(shù)據(jù)實(shí)例
在本篇文章里小編給大家整理了關(guān)于Python實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)采集新型冠狀病毒數(shù)據(jù)實(shí)例內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2020-02-02Python中的time模塊與datetime模塊用法總結(jié)
Python中內(nèi)置的各項(xiàng)時(shí)間日期函數(shù)幾乎都來(lái)自于time和datetime這兩個(gè)模塊,下面整理了Python中的time模塊與datetime模塊用法總結(jié),需要的朋友可以參考下2016-06-06Python使用Selenium實(shí)現(xiàn)按文本查找元素
本文我們將通過(guò)示例為大家詳細(xì)介紹如何在Python中使用selenium通過(guò)文本查找元素的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-11-11Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法
這篇文章主要介紹了Python使用內(nèi)置json模塊解析json格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Python使用內(nèi)置的json模塊實(shí)現(xiàn)json格式數(shù)據(jù)的解析、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-07-07