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

Pytorch中的gather使用方法

 更新時間:2021年05月25日 12:08:03   作者:SY_curry  
這篇文章主要介紹了Pytorch中的gather使用方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

官方說明

gather可以對一個Tensor進(jìn)行聚合,聲明為:torch.gather(input, dim, index, out=None) → Tensor

一般來說有三個參數(shù):輸入的變量input、指定在某一維上聚合的dim、聚合的使用的索引index,輸出為Tensor類型的結(jié)果(index必須為LongTensor類型)。

#參數(shù)介紹:
input (Tensor) – The source tensor
dim (int) – The axis along which to index
index (LongTensor) – The indices of elements to gather
out (Tensor, optional) – Destination tensor
#當(dāng)輸入為三維時的計(jì)算過程:
out[i][j][k] = input[index[i][j][k]][j][k]  # dim=0
out[i][j][k] = input[i][index[i][j][k]][k]  # dim=1
out[i][j][k] = input[i][j][index[i][j][k]]  # dim=2
#樣例:
t = torch.Tensor([[1,2],[3,4]])
torch.gather(t, 1, torch.LongTensor([[0,0],[1,0]]))
#    1  1
#    4  3
#[torch.FloatTensor of size 2x2]

實(shí)驗(yàn)

用下面的代碼在二維上做測試,以便更好地理解

t = torch.Tensor([[1,2,3],[4,5,6]])
index_a = torch.LongTensor([[0,0],[0,1]])
index_b = torch.LongTensor([[0,1,1],[1,0,0]])
print(t)
print(torch.gather(t,dim=1,index=index_a))
print(torch.gather(t,dim=0,index=index_b))

輸出為:

>>tensor([[1., 2., 3.],
        [4., 5., 6.]])
>>tensor([[1., 1.],
        [4., 5.]])
>>tensor([[1., 5., 6.],
        [4., 2., 3.]])

由于官網(wǎng)給的計(jì)算過程不太直觀,下面給出較為直觀的解釋:

對于index_a,dim為1表示在第二個維度上進(jìn)行聚合,索引為列號,[[0,0],[0,1]]表示結(jié)果的第一行取原數(shù)組第一行列號為[0,0]的數(shù),也就是[1,1],結(jié)果的第二行取原數(shù)組第二行列號為[0,1]的數(shù),也就是[4,5],這樣就得到了輸出的結(jié)果[[1,1],[4,5]]。

對于index_b,dim為0表示在第一個維度上進(jìn)行聚合,索引為行號,[[0,1,1],[1,0,0]]表示結(jié)果的第一行第d(d=0,1,2)列取原數(shù)組第d列行號為[0,1,1]的數(shù),也就是[1,5,6],類似的,結(jié)果的第二行第d列取原數(shù)組第d列行號為[1,0,0]的數(shù),也就是[4,2,3],這樣就得到了輸出的結(jié)果[[1,5,6],[4,2,3]]

接下來以index_a為例直接用官網(wǎng)的式子計(jì)算一遍加深理解:

output[0,0] = input[0,index[0,0]]  #1 = input[0,0]
output[0,1] = input[0,index[0,1]]  #1 = input[0,0]
output[1,0] = input[1,index[1,0]]  #4 = input[1,0]
output[1,1] = input[1,index[1,1]]  #5 = input[1,1]

以下兩種寫法得到的結(jié)果是一樣的:

r1 = torch.gather(t,dim=1,index=index_a)

r2 = t.gather(1,index_a)

補(bǔ)充:Pytorch中的torch.gather函數(shù)的個人理解

最近在學(xué)習(xí)pytorch時遇到gather函數(shù),開始沒怎么理解,后來查閱網(wǎng)上相關(guān)資料后大概明白了原理。

gather()函數(shù)

在pytorch中,gather()函數(shù)的作用是將數(shù)據(jù)從input中按index提出,我們看gather函數(shù)的的官方文檔說明如下:

torch.gather(input, dim, index, out=None) → Tensor
    Gathers values along an axis specified by dim.
    For a 3-D tensor the output is specified by:

    out[i][j][k] = input[index[i][j][k]][j][k]  # dim=0
    out[i][j][k] = input[i][index[i][j][k]][k]  # dim=1
    out[i][j][k] = input[i][j][index[i][j][k]]  # dim=2

    Parameters: 

        input (Tensor) – The source tensor
        dim (int) – The axis along which to index
        index (LongTensor) – The indices of elements to gather
        out (Tensor, optional) – Destination tensor

    Example:

    >>> t = torch.Tensor([[1,2],[3,4]])
    >>> torch.gather(t, 1, torch.LongTensor([[0,0],[1,0]]))
     1  1
     4  3
    [torch.FloatTensor of size 2x2]

可以看出,在gather函數(shù)中我們用到的主要有三個參數(shù):

1)input:輸入

2)dim:維度,常用的為0和1

3)index:索引位置

貼一段代碼舉例說明:

a=t.arange(0,16).view(4,4)
print(a)

index_1=t.LongTensor([[3,2,1,0]])
b=a.gather(0,index_1)
print(b)

index_2=t.LongTensor([[0,1,2,3]]).t()#tensor轉(zhuǎn)置操作:(a)T=a.t()
c=a.gather(1,index_2)
print(c)

輸出如下:

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
       
tensor([[12,  9,  6,  3]])

tensor([[ 0],
        [ 5],
        [10],
        [15]])

在gather中,我們是通過index對input進(jìn)行索引把對應(yīng)的數(shù)據(jù)提取出來的,而dim決定了索引的方式。

在上面的例子中,a是一個4×4矩陣:

1)當(dāng)維度dim=0,索引index_1為[3,2,1,0]時,此時可將a看成1×4的矩陣,通過index_1對a每列進(jìn)行行索引:第一列第四行元素為12,第二列第三行元素為9,第三列第二行元素為6,第四列第一行元素為3,即b=[12,9,6,3];

2)當(dāng)維度dim=1,索引index_2為[0,1,2,3]T時,此時可將a看成4×1的矩陣,通過index_1對a每行進(jìn)行列索引:第一行第一列元素為0,第二行第二列元素為5,第三行第三列元素為10,第四行第四列元素為15,即c=[0,5,10,15]T;

總結(jié)

gather函數(shù)在提取數(shù)據(jù)時主要靠dim和index這兩個參數(shù),dim=1時將input看為n×1階矩陣,index看為k×1階矩陣,取index每行元素對input中每行進(jìn)行列索引(如:index某行為[1,3,0],對應(yīng)的input行元素為[9,8,7,6],提取后的結(jié)果為[8,6,9]);

同理,dim=0時將input看為1×n階矩陣,index看為1×k階矩陣,取index每列元素對input中每列進(jìn)行行索引。

gather函數(shù)提取后的矩陣階數(shù)和對應(yīng)的index階數(shù)相同。

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

相關(guān)文章

  • KMP算法精解及其Python版的代碼示例

    KMP算法精解及其Python版的代碼示例

    KMP算法基本上被人們用作字符串的匹配操作,這里我們就來介紹KMP算法精解及其Python版的代碼示例,需要的朋友可以參考下
    2016-06-06
  • Python?OpenCV實(shí)現(xiàn)人物動漫化效果

    Python?OpenCV實(shí)現(xiàn)人物動漫化效果

    這篇文章主要介紹了利用Python和OpenCV實(shí)現(xiàn)人物的動漫化特效,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python和OpenCV有一定的幫助,需要的可以了解一下
    2022-01-01
  • python提取視頻中的音頻的實(shí)現(xiàn)示例

    python提取視頻中的音頻的實(shí)現(xiàn)示例

    MoviePy是一個用于視頻編輯的庫,它可以提取視頻中的音頻并保存為音頻文件,本文主要介紹了python提取視頻中的音頻的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-03-03
  • 使用python?scrapy爬取天氣并導(dǎo)出csv文件

    使用python?scrapy爬取天氣并導(dǎo)出csv文件

    由于工作需要,將爬蟲的文件要保存為csv,以前只是保存為json,下面這篇文章主要給大家介紹了關(guān)于如何使用python?scrapy爬取天氣并導(dǎo)出csv文件的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 你真的了解Python的random模塊嗎?

    你真的了解Python的random模塊嗎?

    這篇文章主要介紹了Python的random模塊的相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • python使用phoenixdb操作hbase的方法示例

    python使用phoenixdb操作hbase的方法示例

    這篇文章主要介紹了python使用phoenixdb操作hbase的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Python如何把Spark數(shù)據(jù)寫入ElasticSearch

    Python如何把Spark數(shù)據(jù)寫入ElasticSearch

    這篇文章主要介紹了Python如何把Spark數(shù)據(jù)寫入ElasticSearch,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python全局變量與局部變量的區(qū)別及使用

    python全局變量與局部變量的區(qū)別及使用

    在python中定義和使用函數(shù)方法的時候,會遇到局部變量和全局變量,本文就來介紹一下python全局變量與局部變量的區(qū)別及使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • python排序方法實(shí)例分析

    python排序方法實(shí)例分析

    這篇文章主要介紹了python排序方法,實(shí)例分析了Python實(shí)現(xiàn)默認(rèn)排序、降序排序及按照key值排序的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-04-04
  • TensorFlow模型保存/載入的兩種方法

    TensorFlow模型保存/載入的兩種方法

    這篇文章主要為大家詳細(xì)介紹了TensorFlow 模型保存/載入的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論