聊聊Pytorch torch.cat與torch.stack的區(qū)別
torch.cat()函數(shù)可以將多個(gè)張量拼接成一個(gè)張量。torch.cat()有兩個(gè)參數(shù),第一個(gè)是要拼接的張量的列表或是元組;第二個(gè)參數(shù)是拼接的維度。
torch.cat()的示例如下圖1所示
圖1 torch.cat()
torch.stack()函數(shù)同樣有張量列表和維度兩個(gè)參數(shù)。stack與cat的區(qū)別在于,torch.stack()函數(shù)要求輸入張量的大小完全相同,得到的張量的維度會比輸入的張量的大小多1,并且多出的那個(gè)維度就是拼接的維度,那個(gè)維度的大小就是輸入張量的個(gè)數(shù)。
torch.stack()的示例如下圖2所示:
圖2 torch.stack()
補(bǔ)充:torch.stack()的官方解釋,詳解以及例子
可以直接看最下面的【3.例子】,再回頭看前面的解釋
在pytorch中,常見的拼接函數(shù)主要是兩個(gè),分別是:
1、stack()
2、cat()
實(shí)際使用中,這兩個(gè)函數(shù)互相輔助:關(guān)于cat()參考torch.cat(),但是本文主要說stack()。
函數(shù)的意義:使用stack可以保留兩個(gè)信息:[1. 序列] 和 [2. 張量矩陣] 信息,屬于【擴(kuò)張?jiān)倨唇印康暮瘮?shù)。
形象的理解:假如數(shù)據(jù)都是二維矩陣(平面),它可以把這些一個(gè)個(gè)平面(矩陣)按第三維(例如:時(shí)間序列)壓成一個(gè)三維的立方體,而立方體的長度就是時(shí)間序列長度。
該函數(shù)常出現(xiàn)在自然語言處理(NLP)和圖像卷積神經(jīng)網(wǎng)絡(luò)(CV)中。
1. stack()
官方解釋:沿著一個(gè)新維度對輸入張量序列進(jìn)行連接。 序列中所有的張量都應(yīng)該為相同形狀。
淺顯說法:把多個(gè)2維的張量湊成一個(gè)3維的張量;多個(gè)3維的湊成一個(gè)4維的張量…以此類推,也就是在增加新的維度進(jìn)行堆疊。
outputs = torch.stack(inputs, dim=?) → Tensor
參數(shù)
inputs : 待連接的張量序列。
注:python的序列數(shù)據(jù)只有l(wèi)ist和tuple。
dim : 新的維度, 必須在0到len(outputs)之間。
注:len(outputs)是生成數(shù)據(jù)的維度大小,也就是outputs的維度值。
2. 重點(diǎn)
函數(shù)中的輸入inputs只允許是序列;且序列內(nèi)部的張量元素,必須shape相等
----舉例:[tensor_1, tensor_2,..]或者(tensor_1, tensor_2,..),且必須tensor_1.shape == tensor_2.shape
dim是選擇生成的維度,必須滿足0<=dim<len(outputs);len(outputs)是輸出后的tensor的維度大小
不懂的看例子,再回過頭看就懂了。
3. 例子
1.準(zhǔn)備2個(gè)tensor數(shù)據(jù),每個(gè)的shape都是[3,3]
# 假設(shè)是時(shí)間步T1的輸出 T1 = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 假設(shè)是時(shí)間步T2的輸出 T2 = torch.tensor([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
2.測試stack函數(shù)
print(torch.stack((T1,T2),dim=0).shape) print(torch.stack((T1,T2),dim=1).shape) print(torch.stack((T1,T2),dim=2).shape) print(torch.stack((T1,T2),dim=3).shape) # outputs: torch.Size([2, 3, 3]) torch.Size([3, 2, 3]) torch.Size([3, 3, 2]) '選擇的dim>len(outputs),所以報(bào)錯(cuò)' IndexError: Dimension out of range (expected to be in range of [-3, 2], but got 3)
可以復(fù)制代碼運(yùn)行試試:拼接后的tensor形狀,會根據(jù)不同的dim發(fā)生變化。
dim | shape |
---|---|
0 | [2, 3, 3] |
1 | [3, 2, 3] |
2 | [3, 3, 2] |
3 | 溢出報(bào)錯(cuò) |
4. 總結(jié)
1、函數(shù)作用:
函數(shù)stack()對序列數(shù)據(jù)內(nèi)部的張量進(jìn)行擴(kuò)維拼接,指定維度由程序員選擇、大小是生成后數(shù)據(jù)的維度區(qū)間。
2、存在意義:
在自然語言處理和卷及神經(jīng)網(wǎng)絡(luò)中, 通常為了保留–[序列(先后)信息] 和 [張量的矩陣信息] 才會使用stack。
函數(shù)存在意義?》》》
手寫過RNN的同學(xué),知道在循環(huán)神經(jīng)網(wǎng)絡(luò)中輸出數(shù)據(jù)是:一個(gè)list,該列表插入了seq_len個(gè)形狀是[batch_size, output_size]的tensor,不利于計(jì)算,需要使用stack進(jìn)行拼接,保留–[1.seq_len這個(gè)時(shí)間步]和–[2.張量屬性[batch_size, output_size]]。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用Selenium模擬瀏覽器自動(dòng)操作功能
這篇文章主要介紹了Python使用Selenium模擬瀏覽器自動(dòng)操作功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09將python flask項(xiàng)目打包成可以運(yùn)行的軟件的全過程(包含報(bào)錯(cuò)解決)
這篇文章主要給大家介紹了將python flask項(xiàng)目打包成可以用運(yùn)行的軟件(包含報(bào)錯(cuò)解決),文中通過代碼示例和圖文結(jié)合講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-02-02python 爬蟲百度地圖的信息界面的實(shí)現(xiàn)方法
這篇文章主要介紹了python 爬蟲百度地圖的界面的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10python引入requests報(bào)錯(cuò)could?not?be?resolved解決方案
這篇文章主要為大家介紹了python引入requests報(bào)錯(cuò)could?not?be?resolved解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Python中字符串,列表與字典的常用拼接方法總結(jié)
有時(shí)在數(shù)據(jù)處理時(shí),需要對數(shù)據(jù)進(jìn)行拼接處理,比如字符串的拼接、列表的拼接等,本文主要是介紹了字符串、列表、字典常用的拼接方法,希望對大家有所幫助2024-02-02