第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從壓縮表示轉(zhuǎn)換張量的最佳方法

從壓縮表示轉(zhuǎn)換張量的最佳方法

青春有我 2023-03-16 16:13:36
我有一個代表稀疏 3-D 矩陣的壓縮格式的張量。我需要將它轉(zhuǎn)換為普通矩陣(它實際代表的矩陣)。因此,在我的例子中,矩陣的任何二維切片的每一行只能包含一個非零元素。作為數(shù)據(jù),我有這些行中的每一行、值和它出現(xiàn)的索引。例如,張量inp = torch.tensor([[ 1,  2], [ 3,  4], [-1,  0], [45,  1]])表示一個 4x5 矩陣(第一維來自張量的第一維,第二維來自元數(shù)據(jù))A,其中A[0][2] = 1, A[1][4] = 3, A[2][0] = -1, A[3][1] = 45.這只是我的 Matrix 的一個二維切片,我有可變數(shù)量的切片。我能夠使用 sparse_coo_tensor 通過以下方式對二維切片執(zhí)行此操作,如上所述:>>> torch.sparse_coo_tensor(torch.stack([torch.arange(0, 4), inp.t()[1]]), inp.t()[0], [4,5]).to_dense()tensor([[ 0,  0,  1,  0,  0],        [ 0,  0,  0,  0,  3],        [-1,  0,  0,  0,  0],        [ 0, 45,  0,  0,  0]])這是實現(xiàn)此目標的最佳方法嗎?有沒有更簡單、更易讀的替代方案?如何在不循環(huán)的情況下將其擴展到 3-D 矩陣?對于 3-D 矩陣,您可以想象輸入類似于inp_list = torch.stack([inp, inp, inp, inp])并且所需的輸出將是上述輸出堆疊 4 次。我覺得如果我正確地創(chuàng)建一個索引數(shù)組我應該能夠做一些事情,但是我想不出一種不使用某種循環(huán)的方法來做到這一點。
查看完整描述

2 回答

?
慕后森

TA貢獻1802條經(jīng)驗 獲得超5個贊

好的,在對不同類型的索引進行了大量實驗之后,我讓它工作了。事實證明,答案就在 Advanced Indexing 中。不幸的是,PyTorch 文檔沒有詳細介紹高級索引。這是 Numpy 文檔中的鏈接。


對于上述問題,此命令起到了作用:


>>> k_lst = torch.zeros([4,4,5])

>>> k_lst[torch.arange(4).unsqueeze(1), torch.arange(4), inp_list[:,:,1]] = inp_list[:,:,0].float()

>>> k_lst

tensor([[[ 0.,  0.,  1.,  0.,  0.],

     [ 0.,  0.,  0.,  0.,  3.],

     [-1.,  0.,  0.,  0.,  0.],

     [ 0., 45.,  0.,  0.,  0.]],

    [[ 0.,  0.,  1.,  0.,  0.],

     [ 0.,  0.,  0.,  0.,  3.],

     [-1.,  0.,  0.,  0.,  0.],

     [ 0., 45.,  0.,  0.,  0.]],

    [[ 0.,  0.,  1.,  0.,  0.],

     [ 0.,  0.,  0.,  0.,  3.],

     [-1.,  0.,  0.,  0.,  0.],

     [ 0., 45.,  0.,  0.,  0.]],

    [[ 0.,  0.,  1.,  0.,  0.],

     [ 0.,  0.,  0.,  0.,  3.],

     [-1.,  0.,  0.,  0.,  0.],

     [ 0., 45.,  0.,  0.,  0.]]])

這正是我想要的。


我在搜索這個時學到了很多東西,我想與任何偶然發(fā)現(xiàn)這個問題的人分享這個。那么,為什么會這樣呢?答案在于廣播的工作方式。如果您查看所涉及的不同索引張量的形狀,您會發(fā)現(xiàn)它們(必然)是可廣播的。


>>> torch.arange(4).unsqueeze(1).shape, torch.arange(4).shape, inp_list[:,:,1].shape

(torch.Size([4, 1]), torch.Size([4]), torch.Size([4, 4]))

顯然,要訪問此處的 k_lst 等 3-D 張量的元素,我們需要 3 個索引 - 每個維度一個。如果你給算子3個相同形狀的張量[],它可以通過從3個張量中匹配對應的元素得到一堆合法的索引。


如果這 3 個張量具有不同的形狀,但可以廣播(就像這里的情況),它會復制缺少張量的相關(guān)行/列所需的次數(shù)以獲得具有相同形狀的張量。


最終,就我而言,如果我們研究如何分配不同的值,這相當于做


k_lst[0,0,inp_list[0,0,1]] = inp_list[0,0,0].float()

k_lst[0,1,inp_list[0,1,1]] = inp_list[0,1,0].float()

k_lst[0,2,inp_list[0,2,1]] = inp_list[0,2,0].float()

k_lst[0,3,inp_list[0,3,1]] = inp_list[0,3,0].float()

k_lst[1,0,inp_list[1,0,1]] = inp_list[1,0,0].float()

k_lst[1,1,inp_list[1,1,1]] = inp_list[1,1,0].float()

.

.

.

k_lst[3,3,inp_list[3,3,1]] = inp_list[3,3,0].float()

這個格式讓我想起了torch.Tensor.scatter(),但是如果能用它來解決這個問題,我還沒想好怎么辦。


查看完整回答
反對 回復 2023-03-16
?
www說

TA貢獻1775條經(jīng)驗 獲得超8個贊

我相信你所說的是你有一個稀疏張量并且想要轉(zhuǎn)換它。從tf.sparse.to_dense開始,然后是tensorflow.Tensor.eval()


查看完整回答
反對 回復 2023-03-16
  • 2 回答
  • 0 關(guān)注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號