關(guān)于torch.flatten()函數(shù)及x=x.view()函數(shù)的理解
一、x = x.view()
x = x.view(x.size(0), -1)
在PyTorch中,x.view(x.size(0), -1)是一種常用的操作,用于改變張量(Tensor)的形狀而不改變其數(shù)據(jù)。
這里的x是一個(gè)多維張量,而.view()函數(shù)是用來(lái)重新塑形這個(gè)張量的,同時(shí)保持其元素的總數(shù)不變。
具體來(lái)說(shuō),x.view(x.size(0), -1)的含義是:
x.size(0):這部分獲取了張量x的第一個(gè)維度的大小(即,如果x是一個(gè)形狀為(a, b, c)的張量,那么x.size(0)就等于a)。在大多數(shù)情況下,這代表了批處理中的樣本數(shù)或者是序列的長(zhǎng)度,取決于上下文。-1:在.view()函數(shù)中,-1是一個(gè)特殊的值,表示該維度的大小會(huì)自動(dòng)計(jì)算,以便保持總元素?cái)?shù)不變。換句話(huà)說(shuō),PyTorch會(huì)根據(jù)其他維度的大小和總元素?cái)?shù)來(lái)推斷出-1應(yīng)該代表的具體數(shù)值。
因此,x.view(x.size(0), -1)的作用是將張量x重新塑形為一個(gè)二維張量,其中第一維的大小保持不變(即原始張量的第一個(gè)維度的大?。?,而第二維的大小則自動(dòng)調(diào)整,以包含所有剩余的元素。
這種操作在需要將多維數(shù)據(jù)“展平”為二維數(shù)據(jù)以進(jìn)行某些操作(如全連接層)時(shí)非常有用。
例如,如果x是一個(gè)形狀為(64, 3, 28, 28)的張量(通常表示一個(gè)包含64個(gè)圖像,每個(gè)圖像有3個(gè)顏色通道,每個(gè)通道的大小為28x28像素的數(shù)據(jù)集),那么x.view(x.size(0), -1)將會(huì)把x重新塑形為一個(gè)形狀為(64, 3*28*28)的張量,其中每個(gè)樣本都被展平成了一個(gè)長(zhǎng)向量。
二、torch.flatten()函數(shù)
x = torch.flatten(x, start_dim=0, end_dim=2)
x = torch.flatten(x, 0)
當(dāng)你使用 x = torch.flatten(x, 0) 時(shí),這里的 0 是 start_dim 參數(shù)的值,而 end_dim 參數(shù)仍然默認(rèn)為 -1。這意呀著展平操作將從張量 x 的第一個(gè)維度(索引為0的維度)開(kāi)始,并且一直進(jìn)行到張量的最后一個(gè)維度。
然而,由于 start_dim 被設(shè)置為0,并且 end_dim 默認(rèn)為 -1,實(shí)際上這會(huì)將整個(gè)張量 x 完全展平為一個(gè)一維張量。換句話(huà)說(shuō),無(wú)論原始張量 x 的形狀如何,調(diào)用 torch.flatten(x, 0) 后,x 將變成一個(gè)一維張量,其長(zhǎng)度等于原始張量中所有元素的總數(shù)。
例如,如果原始張量 x 的形狀是 (a, b, c, d),那么調(diào)用 x = torch.flatten(x, 0) 后,x 的新形狀將是 (a*b*c*d,),即一個(gè)包含 a*b*c*d 個(gè)元素的一維張量。
這種完全展平的操作在需要將多維數(shù)據(jù)轉(zhuǎn)換為適合某些特定操作(如完全連接層的前饋傳播)的一維形式時(shí)非常有用。然而,它也意味著你丟失了原始數(shù)據(jù)的形狀信息,除非你在其他地方記錄了這些信息或者你的操作不需要保留這些形狀信息。
x = torch.flatten(x, 1)
在PyTorch中,torch.flatten(x, start_dim=0, end_dim=-1)函數(shù)用于將張量x在指定的維度范圍內(nèi)展平(或扁平化),而不改變其數(shù)據(jù)。這里的start_dim是開(kāi)始展平的維度(包含該維度),end_dim是結(jié)束展平的維度(不包含該維度),默認(rèn)情況下end_dim為-1,即最后一個(gè)維度。
當(dāng)你使用x = torch.flatten(x, 1)時(shí),你告訴PyTorch從第二個(gè)維度(索引為1,因?yàn)樗饕菑?開(kāi)始的)開(kāi)始,一直到最后一個(gè)維度,將所有的這些維度都展平成一個(gè)維度。這意味著,如果x是一個(gè)多維張量,那么除了第一個(gè)維度之外的所有維度都將被合并成一個(gè)維度。
例如,如果x的形狀是(64, 3, 28, 28)(代表64個(gè)圖像,每個(gè)圖像有3個(gè)顏色通道,每個(gè)通道的大小為28x28像素),那么x = torch.flatten(x, 1)將會(huì)把x展平成一個(gè)形狀為(64, 3*28*28)的張量。這里,第一個(gè)維度(樣本數(shù)64)保持不變,而剩下的三個(gè)維度(3, 28, 28)被合并成了一個(gè)維度。
這種操作在處理圖像數(shù)據(jù)時(shí)特別有用,尤其是在需要將圖像數(shù)據(jù)傳遞給全連接層之前,因?yàn)槿B接層通常期望輸入是二維的(盡管在實(shí)踐中,通常會(huì)先通過(guò)一個(gè)或多個(gè)卷積層來(lái)處理圖像數(shù)據(jù))。通過(guò)展平操作,你可以將多維的圖像數(shù)據(jù)轉(zhuǎn)換成二維的形式,以便進(jìn)行后續(xù)處理。
x = torch.flatten(x, 2)
在PyTorch中,torch.flatten(input, start_dim=0, end_dim=-1) 函數(shù)用于將多維張量(tensor)展平(flatten)為一維張量,但你可以通過(guò)指定start_dim和end_dim參數(shù)來(lái)控制從哪一維度開(kāi)始展平,以及在哪一維度結(jié)束(不包括該維度)。這意味著你可以保留張量的某些維度不變,而將其他維度展平。
對(duì)于你的代碼 x = torch.flatten(x, 2),這里:
x是你想要展平的原始張量。2是start_dim參數(shù)的值,而end_dim參數(shù)默認(rèn)為-1,表示展平操作會(huì)一直進(jìn)行到張量的最后一個(gè)維度。
因此,torch.flatten(x, 2) 的意思是從張量x的第3維(因?yàn)樗饕龔?開(kāi)始)開(kāi)始,將之后的所有維度都展平成一個(gè)維度。如果x的形狀是例如 (a, b, c, d, e),那么torch.flatten(x, 2)之后,x的形狀將變?yōu)?(a, b, c*d*e)。這里,a和b維度保持不變,而c、d和e三個(gè)維度被合并成了一個(gè)新的維度。
這種操作在處理多維數(shù)據(jù)時(shí)非常有用,特別是當(dāng)你需要將一部分?jǐn)?shù)據(jù)的維度保持不變,而將其他部分?jǐn)?shù)據(jù)“展平”以便于后續(xù)處理(如全連接層處理)時(shí)。
三、示例
import torch A = torch.tensor([[[1,2,3,4],[5,6,7,8],[9,10,11,12]],[[13,14,15,16],[17,18,19,20],[21,22,23,24]]]) # print(A.size) print(A.shape) B = torch.flatten(A,1) print(B.shape) # print(B) C = torch.flatten(A,0,1) print(C.shape) # print(C) D = torch.flatten(A,2) print(D.shape) # print(D) E = torch.flatten(A,0) print(E.shape) # print(E) F = A.view(A.size(0), -1) print(F.shape) # print(F) G = A.view(A.size(0), -1, 1) print(G.shape)
輸出:
torch.Size([2, 3, 4])
torch.Size([2, 12])
torch.Size([6, 4])
torch.Size([2, 3, 4])
torch.Size([24])
torch.Size([2, 12])
torch.Size([2, 12, 1])
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?Flask-Login構(gòu)建強(qiáng)大的用戶(hù)認(rèn)證系統(tǒng)實(shí)例探究
這篇文章主要為大家介紹了Python?Flask-Login構(gòu)建強(qiáng)大的用戶(hù)認(rèn)證系統(tǒng)示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
python數(shù)據(jù)分析近年比特幣價(jià)格漲幅趨勢(shì)分布
這篇文章主要為大家介紹了python分析近年來(lái)比特幣價(jià)格漲幅趨勢(shì)的數(shù)據(jù)分布,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
Python使用GitPython操作Git版本庫(kù)的方法
這篇文章主要介紹了Python使用GitPython操作Git版本庫(kù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Appium+python自動(dòng)化之連接模擬器并啟動(dòng)淘寶APP(超詳解)
這篇文章主要介紹了Appium+python自動(dòng)化之 連接模擬器并啟動(dòng)淘寶APP(超詳解)本文以淘寶app為例,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-06-06
使用Pytorch構(gòu)建第一個(gè)神經(jīng)網(wǎng)絡(luò)模型?附案例實(shí)戰(zhàn)
這篇文章主要介紹了用Pytorch構(gòu)建第一個(gè)神經(jīng)網(wǎng)絡(luò)模型(附案例實(shí)戰(zhàn)),本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
自學(xué)python求已知DNA模板的互補(bǔ)DNA序列
這篇文章主要為大家介紹了自學(xué)python求已知DNA模板的互補(bǔ)DNA序列的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python中列表(List) 的三種遍歷(序號(hào)和值)方法小結(jié)
這篇文章主要介紹了Python中列表(List) 的三種遍歷(序號(hào)和值)方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
對(duì)python中Json與object轉(zhuǎn)化的方法詳解
今天小編就為大家分享一篇對(duì)python中Json與object轉(zhuǎn)化的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

