最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談pytorch中stack和cat的及to_tensor的坑

 更新時(shí)間:2021年05月20日 10:19:04   作者:kellen_f  
這篇文章主要介紹了pytorch中stack和cat的及to_tensor的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

初入計(jì)算機(jī)視覺(jué)遇到的一些坑

1.pytorch中轉(zhuǎn)tensor

x=np.random.randint(10,100,(10,10,10))
x=TF.to_tensor(x)
print(x)

這個(gè)函數(shù)會(huì)對(duì)輸入數(shù)據(jù)進(jìn)行自動(dòng)歸一化,比如有時(shí)候我們需要將0-255的圖片轉(zhuǎn)為numpy類(lèi)型的數(shù)據(jù),則會(huì)自動(dòng)轉(zhuǎn)為0-1之間

2.stack和cat之間的差別

stack

x=torch.randn((1,2,3))
y=torch.randn((1,2,3))
z=torch.stack((x,y))#默認(rèn)dim=0
print(z.shape)
#torch.Size([2, 1, 2, 3])

所以stack的之后的數(shù)據(jù)也就很好理解了,z[0,...]的數(shù)據(jù)是x,z[1,...]的數(shù)據(jù)是y。

cat

z=torch.cat((x,y))
print(z.size())
#torch.Size([2, 2, 3])

cat之后的數(shù)據(jù) z[0,:,:]是x的值,z[1,:,:]是y的值。

其中最關(guān)鍵的是stack之后的數(shù)據(jù)的size會(huì)多出一個(gè)維度,而cat則不會(huì),有一個(gè)很簡(jiǎn)單的例子來(lái)說(shuō)明一下,比如要訓(xùn)練一個(gè)檢測(cè)模型,label是一些標(biāo)記點(diǎn),eg:[x1,y1,x2,y2]

送入網(wǎng)絡(luò)的加上batchsize則時(shí)Size:[batchsize,4],如果我已經(jīng)有了兩堆數(shù)據(jù),data1:Size[128,4],data2:Size[128,4],需要將這兩個(gè)數(shù)據(jù)合在一起的話(huà)目標(biāo)data:Size[256,4]。

顯然我們要做的是:torch.cat((data1,data2))

如果我們的數(shù)據(jù)是這樣:有100個(gè)label,每一個(gè)label被放進(jìn)一個(gè)list(data)中,[[x1,y1,x2,y2],[x1,y1,x2,y2],...]其中data是一個(gè)list長(zhǎng)度為100,而list中每一個(gè)元素是張圖片的標(biāo)簽,size為[4]我們需要將他們合一起成為一Size:[100,4]的的數(shù)據(jù)。

顯然我們要做的是torch.stack(data)。而且torch.stack的輸入?yún)?shù)為list類(lèi)型!

補(bǔ)充:pytorch中的cat、stack、tranpose、permute、unsqeeze

pytorch中提供了對(duì)tensor常用的變換操作。

cat 連接

對(duì)數(shù)據(jù)沿著某一維度進(jìn)行拼接。cat后數(shù)據(jù)的總維數(shù)不變。

比如下面代碼對(duì)兩個(gè)2維tensor(分別為2*3,1*3)進(jìn)行拼接,拼接完后變?yōu)?*3還是2維的tensor。

代碼如下:

import torch
torch.manual_seed(1)
x = torch.randn(2,3)
y = torch.randn(1,3)
print(x,y)

結(jié)果:

0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]

-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 1x3]

將兩個(gè)tensor拼在一起:

torch.cat((x,y),0)

結(jié)果:

0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 3x3]

更靈活的拼法:

torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
print(torch.cat((x,x),0))
print(torch.cat((x,x),1))

結(jié)果

// x
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]

// torch.cat((x,x),0)
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 4x3]

// torch.cat((x,x),1)
0.6614 0.2669 0.0617 0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661 0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x6]

stack,增加新的維度進(jìn)行堆疊

而stack則會(huì)增加新的維度。

如對(duì)兩個(gè)1*2維的tensor在第0個(gè)維度上stack,則會(huì)變?yōu)?*1*2的tensor;在第1個(gè)維度上stack,則會(huì)變?yōu)?*2*2的tensor。

見(jiàn)代碼:

a = torch.ones([1,2])
b = torch.ones([1,2])
c= torch.stack([a,b],0) // 第0個(gè)維度stack

輸出:

(0 ,.,.) =
1 1

(1 ,.,.) =
1 1
[torch.FloatTensor of size 2x1x2]

c= torch.stack([a,b],1) // 第1個(gè)維度stack

輸出:


(0 ,.,.) =

1 1

1 1

[torch.FloatTensor of size 1x2x2]

transpose ,兩個(gè)維度互換

代碼如下:

torch.manual_seed(1)
x = torch.randn(2,3)
print(x)

原來(lái)x的結(jié)果:

0.6614 0.2669 0.0617

0.6213 -0.4519 -0.1661

[torch.FloatTensor of size 2x3]

將x的維度互換

x.transpose(0,1)

結(jié)果

0.6614 0.6213

0.2669 -0.4519

0.0617 -0.1661

[torch.FloatTensor of size 3x2]

permute,多個(gè)維度互換,更靈活的transpose

permute是更靈活的transpose,可以靈活的對(duì)原數(shù)據(jù)的維度進(jìn)行調(diào)換,而數(shù)據(jù)本身不變。

代碼如下:

x = torch.randn(2,3,4)
print(x.size())
x_p = x.permute(1,0,2) # 將原來(lái)第1維變?yōu)?維,同理,0→1,2→2
print(x_p.size())

結(jié)果:

torch.Size([2, 3, 4])

torch.Size([3, 2, 4])

squeeze 和 unsqueeze

常用來(lái)增加或減少維度,如沒(méi)有batch維度時(shí),增加batch維度為1。

squeeze(dim_n)壓縮,減少dim_n維度 ,即去掉元素?cái)?shù)量為1的dim_n維度。

unsqueeze(dim_n),增加dim_n維度,元素?cái)?shù)量為1。

上代碼:

# 定義張量
import torch

b = torch.Tensor(2,1)
b.shape
Out[28]: torch.Size([2, 1])

# 不加參數(shù),去掉所有為元素個(gè)數(shù)為1的維度
b_ = b.squeeze()
b_.shape
Out[30]: torch.Size([2])

# 加上參數(shù),去掉第一維的元素為1,不起作用,因?yàn)榈谝痪S有2個(gè)元素
b_ = b.squeeze(0)
b_.shape 
Out[32]: torch.Size([2, 1])

# 這樣就可以了
b_ = b.squeeze(1)
b_.shape
Out[34]: torch.Size([2])

# 增加一個(gè)維度
b_ = b.unsqueeze(2)
b_.shape
Out[36]: torch.Size([2, 1, 1])

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

相關(guān)文章

  • Python寫(xiě)捕魚(yú)達(dá)人的游戲?qū)崿F(xiàn)

    Python寫(xiě)捕魚(yú)達(dá)人的游戲?qū)崿F(xiàn)

    這篇文章主要介紹了Python寫(xiě)捕魚(yú)達(dá)人的游戲?qū)崿F(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 解決pycharm無(wú)法識(shí)別本地site-packages的問(wèn)題

    解決pycharm無(wú)法識(shí)別本地site-packages的問(wèn)題

    今天小編就為大家分享一篇解決pycharm無(wú)法識(shí)別本地site-packages的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python os模塊中的isfile()和isdir()函數(shù)均返回false問(wèn)題解決方法

    Python os模塊中的isfile()和isdir()函數(shù)均返回false問(wèn)題解決方法

    這篇文章主要介紹了Python os模塊中的isfile()和isdir()函數(shù)均返回false問(wèn)題解決方法,返回false的原因是路徑使用了相對(duì)路徑,使用絕對(duì)路徑就可以解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2015-02-02
  • python enumerate函數(shù)的使用方法總結(jié)

    python enumerate函數(shù)的使用方法總結(jié)

    這篇文章主要介紹了python enumerate使用方法總結(jié),enumerate函數(shù)用于遍歷序列中的元素以及它們的下標(biāo),有興趣的可以了解一下
    2017-11-11
  • Flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)操作示例

    Flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)操作示例

    這篇文章主要介紹了Flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)的常見(jiàn)操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • Python運(yùn)維開(kāi)發(fā)之psutil庫(kù)的使用詳解

    Python運(yùn)維開(kāi)發(fā)之psutil庫(kù)的使用詳解

    這篇文章主要介紹了Python運(yùn)維開(kāi)發(fā)之psutil庫(kù)的使用,psutil能夠輕松實(shí)現(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python使用HTTP POST上傳WAV文件的方法

    Python使用HTTP POST上傳WAV文件的方法

    Python是一個(gè)非常流行的編程語(yǔ)言,可以用于開(kāi)發(fā)不同類(lèi)型的應(yīng)用程序。其中,上傳文件是一個(gè)非常常見(jiàn)的需求。具體而言,我們探討了使用HTTP POST請(qǐng)求上傳單個(gè)和多個(gè)WAV文件的方法。無(wú)論你是需要將音頻文件上傳到云存儲(chǔ)還是服務(wù)器,這些方法都能幫助你上傳文件。
    2023-06-06
  • Python代碼列表求并集,交集,差集

    Python代碼列表求并集,交集,差集

    這篇文章主要介紹了Python代碼列表求并集,交集,差集,下面文章講詳細(xì)的介紹如何利用python代碼實(shí)現(xiàn)并集,交集,差集的相關(guān)資料展開(kāi)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Python中bs4的soup.find()和soup.find_all()用法示例小結(jié)

    Python中bs4的soup.find()和soup.find_all()用法示例小結(jié)

    我們?cè)谑褂胮ython對(duì)網(wǎng)頁(yè)爬蟲(chóng)的時(shí)候,經(jīng)常會(huì)得到一些html數(shù)據(jù),因此我們就會(huì)利用soup.find()和soup.find_all()方法來(lái)篩選出想要的數(shù)據(jù),這篇文章主要介紹了Python中bs4的soup.find()和soup.find_all()用法,需要的朋友可以參考下
    2024-12-12
  • Python利用Selenium實(shí)現(xiàn)簡(jiǎn)單的中英互譯功能

    Python利用Selenium實(shí)現(xiàn)簡(jiǎn)單的中英互譯功能

    Selenium 是一個(gè)用于 Web 應(yīng)用程序測(cè)試的工具,最初是為網(wǎng)站自動(dòng)化測(cè)試而開(kāi)發(fā)的,可以直接運(yùn)行在瀏覽器上,是 Python 的一個(gè)第三方庫(kù),對(duì)外提供的接口能夠操作瀏覽器,從而讓瀏覽器完成自動(dòng)化的操作,本文介紹了如何利用Python中的Selenium實(shí)現(xiàn)簡(jiǎn)單的中英互譯
    2024-08-08

最新評(píng)論

新乐市| 肇源县| 个旧市| 商水县| 靖宇县| 武乡县| 凤城市| 上犹县| 吴川市| 长乐市| 龙游县| 阿鲁科尔沁旗| 德兴市| 资中县| 万源市| 丰都县| 东乡县| 德兴市| 浑源县| 吴堡县| 万盛区| 新巴尔虎右旗| 九台市| 开阳县| 东海县| 九龙县| 双鸭山市| 循化| 客服| 沧源| 荣成市| 河间市| 潢川县| 夹江县| 琼结县| 延安市| 榆树市| 安泽县| 芮城县| 怀仁县| 阿克陶县|