x.view(x.size(0), -1)
首先,在pytorch中的view()函數(shù)就是用來改變tensor的形狀的,例如將2行3列的tensor變?yōu)?行6列,其中-1表示會自適應的調整剩余的維度
a = torch.Tensor(2,3) print(a) # tensor([[0.0000, 0.0000, 0.0000], # [0.0000, 0.0000, 0.0000]]) print(a.view(1,-1)) # tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000]])
在CNN中卷積或者池化之后需要連接全連接層,所以需要把多維度的tensor展平成一維,x.view(x.size(0), -1)就實現(xiàn)的這個功能
def forward(self,x): x=self.pre(x) x=self.layer1(x) x=self.layer2(x) x=self.layer3(x) x=self.layer4(x) x=F.avg_pool2d(x,7) x=x.view(x.size(0),-1) return self.fc(x)
卷積或者池化之后的tensor的維度為(batchsize,channels,x,y),其中x.size(0)指batchsize的值,最后通過x.view(x.size(0), -1)將tensor的結構轉換為了(batchsize, channels*x*y),即將(channels,x,y)拉直,然后就可以和fc層連接了
補充:pytorch中view的用法(重構張量)
view在pytorch中是用來改變張量的shape的,簡單又好用。
pytorch中view的用法通常是直接在張量名后用.view調用,然后放入自己想要的shape。如
tensor_name.view(shape)
Example:
>>> x = torch.randn(4, 4) >>> x.size() torch.Size([4, 4]) >>> y = x.view(16) >>> y.size() torch.Size([16])
>>> z = x.view(-1, 8) # the size -1 is inferred from other dimensions >>> z.size() torch.Size([2, 8])
(直接填-1表示拉直, 等價于tensor_name.flatten())
>>> y = x.view(-1) >>> y.size() torch.Size([16])
>>> a = torch.randn(1, 2, 3, 4) >>> a.size() torch.Size([1, 2, 3, 4]) >>> b = a.transpose(1, 2) # Swaps 2nd and 3rd dimension >>> b.size() torch.Size([1, 3, 2, 4]) >>> c = a.view(1, 3, 2, 4) # Does not change tensor layout in memory >>> c.size() torch.Size([1, 3, 2, 4]) >>> torch.equal(b, c) False
注意最后的False,在張量b和c是不等價的。從這里我們可以看得出來,view函數(shù)如其名,只改變“看起來”的樣子,不會改變張量在內存中的排列。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
標簽:隨州 昭通 淘寶好評回訪 信陽 濟源 阜新 合肥 興安盟
巨人網(wǎng)絡通訊聲明:本文標題《對pytorch中x = x.view(x.size(0), -1) 的理解說明》,本文關鍵詞 對,pytorch,中,x.view,x.size,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。