Pytorch中view()函數(shù)的實現(xiàn)示例
在PyTorch中,view
函數(shù)是一個極為重要的張量操作函數(shù),其主要功能是對張量的形狀進(jìn)行重塑,與此同時會盡力維持張量中元素的總數(shù)不變。
1. 基本功能與語法
view
函數(shù)的主要作用是改變張量的維度和大小,不過要保證重塑前后張量的元素總數(shù)相同。其語法格式如下:
tensor.view(*args)
這里的*args
代表的是新的形狀,它既可以是一個元組,也可以是多個用逗號分隔的整數(shù)。
2. 核心使用場景
2.1 降維操作
x = torch.randn(2, 3, 4) # 此時x的形狀為[2, 3, 4] y = x.view(2, 12) # y的形狀變?yōu)閇2, 12]
2.2 升維操作
x = torch.randn(6) # x的形狀是[6] y = x.view(2, 3) # y的形狀變?yōu)閇2, 3]
2.3 -1的特殊用途
當(dāng)在形狀參數(shù)里使用-1
時,PyTorch會依據(jù)張量元素的總數(shù)以及其他維度的大小,自動推算出-1
所對應(yīng)的維度值。
x = torch.randn(2, 3, 4) # x的形狀為[2, 3, 4] y = x.view(2, -1) # y的形狀是[2, 12] z = x.view(-1, 3, 2) # z的形狀為[4, 3, 2]
3. 內(nèi)存連續(xù)性要求
view
函數(shù)要求輸入的張量必須是內(nèi)存連續(xù)的。要是張量在內(nèi)存中不連續(xù),就需要先調(diào)用contiguous()
函數(shù)。
x = torch.randn(2, 3) y = x.t() # 對x進(jìn)行轉(zhuǎn)置操作,此時y在內(nèi)存中不再連續(xù) z = y.contiguous().view(3, 2) # 先調(diào)用contiguous(),再使用view
4. 與reshape函數(shù)的差異
view
函數(shù):必須在張量內(nèi)存連續(xù)的情況下才能使用,不過它能保證返回的是原張量的視圖,這意味著不會進(jìn)行數(shù)據(jù)拷貝,從而可以提升內(nèi)存使用效率。reshape
函數(shù):無論張量內(nèi)存是否連續(xù)都能使用,它可能會返回原張量的視圖,也可能會進(jìn)行數(shù)據(jù)拷貝。
5. 視圖機(jī)制
view
函數(shù)返回的是原張量的視圖,而非新的張量。這就表明對視圖進(jìn)行修改時,原張量也會隨之改變。
x = torch.tensor([1, 2, 3, 4]) y = x.view(2, 2) y[0, 0] = 100 print(x[0]) # 輸出結(jié)果為100
6. 復(fù)雜形狀變換示例
x = torch.randn(2, 2, 2, 2) # x的形狀為[2, 2, 2, 2] y = x.view(2, 8) # y的形狀變?yōu)閇2, 8] z = x.view(-1) # z是一個一維張量,形狀為[16]
7. 注意事項
- 運用
view
函數(shù)時,新形狀的元素總數(shù)必須和原張量的元素總數(shù)相等。 - 當(dāng)對張量進(jìn)行轉(zhuǎn)置、切片等操作后,張量在內(nèi)存中可能就不再連續(xù)了,這時就需要先調(diào)用
contiguous()
函數(shù)。 - 雖然
view
函數(shù)在大多數(shù)情況下比reshape
函數(shù)的性能要好,但在使用時需要更加謹(jǐn)慎。
8. 進(jìn)階應(yīng)用
在深度學(xué)習(xí)模型里,view
函數(shù)經(jīng)常被用于調(diào)整輸入或輸出的形狀,像在全連接層和卷積層之間進(jìn)行過渡時就會用到。
# 模擬一個CNN輸出 x = torch.randn(16, 3, 28, 28) # 批量大小為16,3個通道,28×28的圖像 y = x.view(16, -1) # 將特征圖展平為一維向量,形狀變?yōu)閇16, 2352]
view與reshape比較
在PyTorch中,view
和reshape
都用于改變張量的形狀,但它們在功能、內(nèi)存管理和使用場景上存在關(guān)鍵差異。以下是詳細(xì)比較:
1. 核心功能對比
特性 | view | reshape |
---|---|---|
內(nèi)存連續(xù)性要求 | 必須內(nèi)存連續(xù) (contiguous ) | 無要求,自動處理非連續(xù)張量 |
返回類型 | 始終返回原張量的視圖(不復(fù)制數(shù)據(jù)) | 可能返回視圖或副本(取決于是否需要復(fù)制數(shù)據(jù)) |
異常處理 | 若張量不連續(xù),拋出 RuntimeError | 自動調(diào)用 contiguous() 避免錯誤 |
2. 內(nèi)存連續(xù)性的影響
view 的嚴(yán)格要求
x = torch.randn(2, 3) y = x.t() # 轉(zhuǎn)置操作使 y 不連續(xù) z = y.view(6) # 報錯:RuntimeError z = y.contiguous().view(6) # 正確:先轉(zhuǎn)為連續(xù)張量
reshape 的靈活性
x = torch.randn(2, 3) y = x.t() z = y.reshape(6) # 等價于 y.contiguous().view(6),自動處理連續(xù)性
3. 視圖與副本的區(qū)別
view 的視圖特性
x = torch.tensor([1, 2, 3, 4]) y = x.view(2, 2) y[0, 0] = 100 print(x[0]) # 輸出: 100(原張量被修改)
reshape 的潛在拷貝
x = torch.tensor([1, 2, 3, 4]) y = x.t().reshape(2, 2) # 因轉(zhuǎn)置導(dǎo)致非連續(xù),reshape 可能拷貝數(shù)據(jù) y[0, 0] = 100 print(x[0]) # 輸出: 1(原張量未被修改,reshape 創(chuàng)建了副本)
4. 性能與效率
- view:零拷貝操作,內(nèi)存效率高,適合高性能計算。
- reshape:可能產(chǎn)生數(shù)據(jù)拷貝,開銷較大,但代碼更簡潔。
建議:若需確保性能且張量連續(xù),優(yōu)先使用 view
;若不確定連續(xù)性或追求代碼簡潔,使用 reshape
。
5. 使用場景
場景 | 推薦函數(shù) | 原因 |
---|---|---|
已知張量連續(xù)且需高效操作 | view | 避免不必要的拷貝 |
處理可能非連續(xù)的張量 | reshape | 自動處理連續(xù)性,避免錯誤 |
深度學(xué)習(xí)模型中的固定操作 | view | 如 CNN 到全連接層的張量展平 |
快速原型開發(fā)或代碼簡化 | reshape | 減少 contiguous() 調(diào)用 |
6. 特殊情況:-1 自動推斷維度
兩者均支持 -1
作為占位符,PyTorch 會自動計算該維度的大?。?/p>
x = torch.randn(2, 3, 4) y = x.view(2, -1) # y.shape: [2, 12] z = x.reshape(-1, 3, 2) # z.shape: [4, 3, 2]
總結(jié)對比表
功能 | view | reshape |
---|---|---|
內(nèi)存連續(xù)性要求 | 必須連續(xù) | 無要求 |
是否保證零拷貝 | 是 | 否(可能拷貝) |
處理非連續(xù)張量 | 需手動調(diào)用 contiguous() | 自動處理 |
代碼簡潔性 | 較低(需關(guān)注連續(xù)性) | 較高 |
性能 | 高 | 中等(可能有拷貝開銷) |
最佳實踐
- 優(yōu)先使用
view
:當(dāng)張量連續(xù)性已知且需確保性能時(如模型前向傳播)。 - 使用
reshape
:在數(shù)據(jù)處理或不確定張量連續(xù)性時,避免RuntimeError
。 - 調(diào)試提示:若遇到
view
報錯,檢查張量是否連續(xù)(使用tensor.is_contiguous()
)。
到此這篇關(guān)于Pytorch中view()函數(shù)的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Pytorch view()函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
安裝python3.7編譯器后如何正確安裝opnecv的方法詳解
這篇文章主要介紹了安裝python3.7編譯器后如何正確安裝opnecv,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Python的pdfplumber庫將pdf轉(zhuǎn)為圖片的實現(xiàn)
本文主要介紹了Python的pdfplumber庫將pdf轉(zhuǎn)為圖片的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06人工智能深度學(xué)習(xí)OpenAI?baselines的使用方法
這篇文章主要為大家介紹了人工智能深度學(xué)習(xí)OpenAI?baselines的使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Python Pyvis庫創(chuàng)建交互式網(wǎng)絡(luò)圖實例探究
這篇文章主要為大家介紹了Python Pyvis庫創(chuàng)建交互式網(wǎng)絡(luò)圖的實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12