中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

pytorch中stack和cat的及to_tensor的示例分析

發布時間:2021-05-20 12:39:21 來源:億速云 閱讀:222 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關pytorch中stack和cat的及to_tensor的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

初入計算機視覺遇到的一些坑

1.pytorch中轉tensor

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

這個函數會對輸入數據進行自動歸一化,比如有時候我們需要將0-255的圖片轉為numpy類型的數據,則會自動轉為0-1之間

2.stack和cat之間的差別

stack

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

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

cat

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

cat之后的數據 z[0,:,:]是x的值,z[1,:,:]是y的值。

其中最關鍵的是stack之后的數據的size會多出一個維度,而cat則不會,有一個很簡單的例子來說明一下,比如要訓練一個檢測模型,label是一些標記點,eg:[x1,y1,x2,y2]

送入網絡的加上batchsize則時Size:[batchsize,4],如果我已經有了兩堆數據,data1:Size[128,4],data2:Size[128,4],需要將這兩個數據合在一起的話目標data:Size[256,4]。

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

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

顯然我們要做的是torch.stack(data)。而且torch.stack的輸入參數為list類型!

補充:pytorch中的cat、stack、tranpose、permute、unsqeeze

pytorch中提供了對tensor常用的變換操作。

cat 連接

對數據沿著某一維度進行拼接。cat后數據的總維數不變。

比如下面代碼對兩個2維tensor(分別為2*3,1*3)進行拼接,拼接完后變為3*3還是2維的tensor。

代碼如下:

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

結果:

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]

將兩個tensor拼在一起:

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

結果:

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))

結果

// 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,增加新的維度進行堆疊

而stack則會增加新的維度。

如對兩個1*2維的tensor在第0個維度上stack,則會變為2*1*2的tensor;在第1個維度上stack,則會變為1*2*2的tensor。

見代碼:

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

輸出:

(0 ,.,.) =
1 1

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

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

輸出:


(0 ,.,.) =

1 1

1 1

[torch.FloatTensor of size 1x2x2]

transpose ,兩個維度互換

代碼如下:

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

原來x的結果:

0.6614 0.2669 0.0617

0.6213 -0.4519 -0.1661

[torch.FloatTensor of size 2x3]

將x的維度互換

x.transpose(0,1)

結果

0.6614 0.6213

0.2669 -0.4519

0.0617 -0.1661

[torch.FloatTensor of size 3x2]

permute,多個維度互換,更靈活的transpose

permute是更靈活的transpose,可以靈活的對原數據的維度進行調換,而數據本身不變。

代碼如下:

x = torch.randn(2,3,4)
print(x.size())
x_p = x.permute(1,0,2) # 將原來第1維變為0維,同理,0→1,2→2
print(x_p.size())

結果:

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

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

squeeze 和 unsqueeze

常用來增加或減少維度,如沒有batch維度時,增加batch維度為1。

squeeze(dim_n)壓縮,減少dim_n維度 ,即去掉元素數量為1的dim_n維度。

unsqueeze(dim_n),增加dim_n維度,元素數量為1。

上代碼:

# 定義張量
import torch

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

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

# 加上參數,去掉第一維的元素為1,不起作用,因為第一維有2個元素
b_ = b.squeeze(0)
b_.shape 
Out[32]: torch.Size([2, 1])

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

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

pytorch的優點

1.PyTorch是相當簡潔且高效快速的框架;2.設計追求最少的封裝;3.設計符合人類思維,它讓用戶盡可能地專注于實現自己的想法;4.與google的Tensorflow類似,FAIR的支持足以確保PyTorch獲得持續的開發更新;5.PyTorch作者親自維護的論壇 供用戶交流和求教問題6.入門簡單

感謝各位的閱讀!關于“pytorch中stack和cat的及to_tensor的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆元县| 康马县| 泾源县| 无棣县| 武鸣县| 吴川市| 淳安县| 德惠市| 吉安市| 日喀则市| 景泰县| 静宁县| 通海县| 阜南县| 满城县| 弋阳县| 米林县| 探索| 汶上县| 乐山市| 阳谷县| 龙里县| 图们市| 乐至县| 阿克陶县| 宁都县| 荥经县| 大厂| 鄂托克前旗| 洛宁县| 彭泽县| 吉水县| 虹口区| 龙江县| 曲麻莱县| 顺义区| 扎兰屯市| 嘉定区| 东乡族自治县| 米脂县| 濮阳市|