這篇文章主要介紹“在Pytorch中如何使用contiguous”,在日常操作中,相信很多人在在Pytorch中如何使用contiguous問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”在Pytorch中如何使用contiguous”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
目前創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、壺關(guān)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。舉個(gè)栗子,在使用transpose()進(jìn)行轉(zhuǎn)置操作時(shí),pytorch并不會創(chuàng)建新的、轉(zhuǎn)置后的tensor,而是修改了tensor中的一些屬性(也就是元數(shù)據(jù)),使得此時(shí)的offset和stride是與轉(zhuǎn)置tensor相對應(yīng)的。
轉(zhuǎn)置的tensor和原tensor的內(nèi)存是共享的!
為了證明這一點(diǎn),我們來看下面的代碼:
x = torch.randn(3, 2) y = x.transpose(x, 0, 1) x[0, 0] = 233 print(y[0, 0]) # print 233
可以看到,改變了y的元素的值的同時(shí),x的元素的值也發(fā)生了變化。
也就是說,經(jīng)過上述操作后得到的tensor,它內(nèi)部數(shù)據(jù)的布局方式和從頭開始創(chuàng)建一個(gè)這樣的常規(guī)的tensor的布局方式是不一樣的!于是…這就有contiguous()的用武之地了。
在上面的例子中,x是contiguous的,但y不是(因?yàn)閮?nèi)部數(shù)據(jù)不是通常的布局方式)。
注意不要被contiguous的字面意思“連續(xù)的”誤解,tensor中數(shù)據(jù)還是在內(nèi)存中一塊區(qū)域里,只是布局的問題!
當(dāng)調(diào)用contiguous()時(shí),會強(qiáng)制拷貝一份tensor,讓它的布局和從頭創(chuàng)建的一毛一樣。
一般來說這一點(diǎn)不用太擔(dān)心,如果你沒在需要調(diào)用contiguous()的地方調(diào)用contiguous(),運(yùn)行時(shí)會提示你:
RuntimeError: input is not contiguous
只要看到這個(gè)錯誤提示,加上contiguous()就好啦~
補(bǔ)充:pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax
torch.gather(input,dim,index,out=None)。對指定維進(jìn)行索引。比如4*3的張量,對dim=1進(jìn)行索引,那么index的取值范圍就是0~2.
input是一個(gè)張量,index是索引張量。input和index的size要么全部維度都相同,要么指定的dim那一維度值不同。輸出為和index大小相同的張量。
import torch a=torch.tensor([[.1,.2,.3], [1.1,1.2,1.3], [2.1,2.2,2.3], [3.1,3.2,3.3]]) b=torch.LongTensor([[1,2,1], [2,2,2], [2,2,2], [1,1,0]]) b=b.view(4,3) print(a.gather(1,b)) print(a.gather(0,b)) c=torch.LongTensor([1,2,0,1]) c=c.view(4,1) print(a.gather(1,c))
輸出:
tensor([[ 0.2000, 0.3000, 0.2000], [ 1.3000, 1.3000, 1.3000], [ 2.3000, 2.3000, 2.3000], [ 3.2000, 3.2000, 3.1000]]) tensor([[ 1.1000, 2.2000, 1.3000], [ 2.1000, 2.2000, 2.3000], [ 2.1000, 2.2000, 2.3000], [ 1.1000, 1.2000, 0.3000]]) tensor([[ 0.2000], [ 1.3000], [ 2.1000], [ 3.2000]])
將維度為1的壓縮掉。如size為(3,1,1,2),壓縮之后為(3,2)
import torch a=torch.randn(2,1,1,3) print(a) print(a.squeeze())
輸出:
tensor([[[[-0.2320, 0.9513, 1.1613]]], [[[ 0.0901, 0.9613, -0.9344]]]]) tensor([[-0.2320, 0.9513, 1.1613], [ 0.0901, 0.9613, -0.9344]])
擴(kuò)展某個(gè)size為1的維度。如(2,2,1)擴(kuò)展為(2,2,3)
import torch x=torch.randn(2,2,1) print(x) y=x.expand(2,2,3) print(y)
輸出:
tensor([[[ 0.0608], [ 2.2106]], [[-1.9287], [ 0.8748]]]) tensor([[[ 0.0608, 0.0608, 0.0608], [ 2.2106, 2.2106, 2.2106]], [[-1.9287, -1.9287, -1.9287], [ 0.8748, 0.8748, 0.8748]]])
size為(m,n,d)的張量,dim=1時(shí),輸出為size為(m,d)的張量
import torch a=torch.tensor([[[1,2,3],[4,8,12]],[[1,2,3],[4,8,12]]]) print(a.sum()) print(a.sum(dim=1))
輸出:
tensor(60) tensor([[ 5, 10, 15], [ 5, 10, 15]])
返回一個(gè)內(nèi)存為連續(xù)的張量,如本身就是連續(xù)的,返回它自己。一般用在view()函數(shù)之前,因?yàn)関iew()要求調(diào)用張量是連續(xù)的。
可以通過is_contiguous查看張量內(nèi)存是否連續(xù)。
import torch a=torch.tensor([[[1,2,3],[4,8,12]],[[1,2,3],[4,8,12]]]) print(a.is_contiguous) print(a.contiguous().view(4,3))
輸出:
<built-in method is_contiguous of Tensor object at 0x7f4b5e35afa0> tensor([[ 1, 2, 3], [ 4, 8, 12], [ 1, 2, 3], [ 4, 8, 12]])
假設(shè)數(shù)組V有C個(gè)元素。對其進(jìn)行softmax等價(jià)于將V的每個(gè)元素的指數(shù)除以所有元素的指數(shù)之和。這會使值落在區(qū)間(0,1)上,并且和為1。
import torch import torch.nn.functional as F a=torch.tensor([[1.,1],[2,1],[3,1],[1,2],[1,3]]) b=F.softmax(a,dim=1) print(b)
輸出:
tensor([[ 0.5000, 0.5000], [ 0.7311, 0.2689], [ 0.8808, 0.1192], [ 0.2689, 0.7311], [ 0.1192, 0.8808]])
返回較大值,或指定維度的較大值以及index
import torch a=torch.tensor([[.1,.2,.3], [1.1,1.2,1.3], [2.1,2.2,2.3], [3.1,3.2,3.3]]) print(a.max(dim=1)) print(a.max())
輸出:
(tensor([ 0.3000, 1.3000, 2.3000, 3.3000]), tensor([ 2, 2, 2, 2])) tensor(3.3000)
返回較大值的index
import torch a=torch.tensor([[.1,.2,.3], [1.1,1.2,1.3], [2.1,2.2,2.3], [3.1,3.2,3.3]]) print(a.argmax(dim=1)) print(a.argmax())
輸出:
tensor([ 2, 2, 2, 2]) tensor(11)
到此,關(guān)于“在Pytorch中如何使用contiguous”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
網(wǎng)頁名稱:在Pytorch中如何使用contiguous-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://m.rwnh.cn/article30/ddchso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)站維護(hù)、網(wǎng)站收錄、移動網(wǎng)站建設(shè)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容