最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch中view和reshape的區(qū)別

 更新時(shí)間:2026年04月09日 15:03:06   作者:斷眉的派大星  
本文主要介紹了PyTorch中view和reshape在處理張量形狀變化時(shí)的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 PyTorch 中,view 和 reshape 都能用來改變張量(Tensor)的形狀,但它們在處理內(nèi)存連續(xù)性時(shí)有著本質(zhì)的區(qū)別。

簡單來說,你可以把 reshape 看作是 view 的一個(gè)更“智能”、更“穩(wěn)健”的版本。

?? 核心區(qū)別:內(nèi)存連續(xù)性 (Contiguous)

這是兩者最根本的不同點(diǎn)。

  • view:要求操作的張量在內(nèi)存中必須是連續(xù)的 (contiguous)。
  • reshape:不要求張量必須是連續(xù)的。它會(huì)自動(dòng)處理非連續(xù)的情況。

什么是“內(nèi)存連續(xù)性”?

一個(gè)張量在內(nèi)存中是連續(xù)的,意味著它的數(shù)據(jù)在物理內(nèi)存中是按順序緊密排列的。大多數(shù)創(chuàng)建張量的操作(如 torch.randn)默認(rèn)都會(huì)產(chǎn)生連續(xù)的張量。

但是,某些操作(如 transpose、permute)只會(huì)改變張量的“視圖”(即邏輯上的形狀和訪問方式),而不會(huì)改變底層數(shù)據(jù)的物理存儲(chǔ)順序。經(jīng)過這些操作后,張量就可能變得不連續(xù)。

?? 行為差異與代碼示例

當(dāng)你對一個(gè)連續(xù)的張量進(jìn)行操作時(shí),view 和 reshape 的行為幾乎完全一樣。

import torch

x = torch.randn(2, 3, 4) # 創(chuàng)建一個(gè)連續(xù)的張量
print(x.is_contiguous()) # 輸出: True

# 兩者都能正常工作
y_view = x.view(6, 4)
y_reshape = x.reshape(6, 4)

關(guān)鍵區(qū)別在于處理非連續(xù)張量時(shí):

# 1. 創(chuàng)建一個(gè)張量并進(jìn)行轉(zhuǎn)置,使其變?yōu)榉沁B續(xù)
x = torch.randn(2, 3, 4)
x_transposed = x.transpose(0, 1) # 交換第0和第1個(gè)維度
print(x_transposed.is_contiguous()) # 輸出: False

# 2. 嘗試使用 view (會(huì)報(bào)錯(cuò)!)
try:
    y_view = x_transposed.view(6, 4)
except RuntimeError as e:
    print(f"view 報(bào)錯(cuò): {e}")
    # 輸出: view 報(bào)錯(cuò): view size is not compatible with input tensor's size and stride...

# 3. 使用 reshape (正常工作)
y_reshape = x_transposed.reshape(6, 4) # 成功!

?? 底層機(jī)制與內(nèi)存共享

  • view 的機(jī)制:它直接返回原張量的一個(gè)“視圖”。這意味著新張量和原張量共享同一塊內(nèi)存。修改其中一個(gè),另一個(gè)也會(huì)隨之改變。因?yàn)樗粡?fù)制數(shù)據(jù),所以效率極高。但前提必須是內(nèi)存連續(xù),否則無法正確映射。

  • reshape 的機(jī)制:它更智能。

    1. 如果原張量是連續(xù)的,它的行為就和 view 一樣(共享內(nèi)存)。
    2. 如果原張量不連續(xù),它會(huì)在內(nèi)部先調(diào)用 .contiguous() 方法,這會(huì)復(fù)制一份數(shù)據(jù)到新的連續(xù)內(nèi)存中,然后再進(jìn)行形狀變換。因此,reshape 可能會(huì)涉及數(shù)據(jù)拷貝,性能開銷稍大,但保證了操作的成功。

?? 總結(jié)對比

特性view()reshape()
內(nèi)存連續(xù)性要求必須連續(xù),否則會(huì)報(bào)錯(cuò)。不要求,會(huì)自動(dòng)處理。
內(nèi)存共享總是與原張量共享內(nèi)存。連續(xù)時(shí)共享,不連續(xù)時(shí)不共享(會(huì)復(fù)制)。
性能更高(零拷貝)。稍低(不連續(xù)時(shí)會(huì)拷貝)。
安全性較低,需要開發(fā)者確保連續(xù)性。更高,更穩(wěn)健,不易出錯(cuò)。

?? 實(shí)踐建議

  • 日常開發(fā)首選 reshape:在絕大多數(shù)情況下,使用 reshape 是更安全、更省心的選擇。它能幫你避免很多由張量不連續(xù)導(dǎo)致的潛在錯(cuò)誤,尤其是在復(fù)雜的數(shù)據(jù)處理流程中。
  • 性能敏感時(shí)用 view:如果你在編寫對性能要求極高的代碼(例如模型的核心循環(huán)),并且你百分之百確定張量是連續(xù)的,那么使用 view 可以獲得微小的性能優(yōu)勢。
  • 組合操作:如果你需要使用 view,但又不確定張量是否連續(xù),一個(gè)常見的做法是先調(diào)用 .contiguous(),例如 x.transpose(0, 1).contiguous().view(...)。

1. 為什么就不連續(xù)了呢?不是不會(huì)改變數(shù)據(jù)的物理存儲(chǔ)順序嗎?

不會(huì)改變數(shù)據(jù)的物理存儲(chǔ)順序”是完全正確的。問題的關(guān)鍵在于,“連續(xù)性”的定義并非指數(shù)據(jù)在物理內(nèi)存中是否斷斷續(xù)續(xù),而是指數(shù)據(jù)的邏輯訪問順序是否與物理存儲(chǔ)順序保持一致。

當(dāng)這兩個(gè)順序不一致時(shí),我們就說這個(gè)張量是“不連續(xù)”的。

用一個(gè)簡單的例子來解釋:

?? 什么是“連續(xù)性”?

想象一個(gè) 2x3 的張量 x:

x = [[1, 2, 3],
     [4, 5, 6]]

PyTorch在內(nèi)存中默認(rèn)以“行優(yōu)先”的方式存儲(chǔ)數(shù)據(jù)。所以,x 在物理內(nèi)存中的存儲(chǔ)順序是:
1 → 2 → 3 → 4 → 5 → 6

當(dāng)你按邏輯順序(從左到右,從上到下)遍歷 x 時(shí),你訪問元素的順序也是 1, 2, 3, 4, 5, 6。

邏輯訪問順序 與 物理存儲(chǔ)順序 完全一致。所以,x 是連續(xù)的。

??transpose做了什么?

現(xiàn)在,我們對 x 進(jìn)行轉(zhuǎn)置操作 y = x.t(),得到一個(gè) 3x2 的張量 y:

y = [[1, 4],
     [2, 5],
     [3, 6]]

正如你所說,transpose 操作非常高效,它不會(huì)去移動(dòng)內(nèi)存中的數(shù)據(jù)。物理內(nèi)存里的順序依然是:
1 → 2 → 3 → 4 → 5 → 6

但是,transpose 會(huì)通過修改張量的元數(shù)據(jù)(主要是步長 stride)來改變我們訪問數(shù)據(jù)的方式。

現(xiàn)在,當(dāng)你按 y 的邏輯順序(從左到右,從上到下)遍歷時(shí),你期望的訪問順序是:
1, 4, 2, 5, 3, 6

?? 矛盾出現(xiàn)了!

  • 你的邏輯期望:1, 4, 2, 5, 3, 6
  • 內(nèi)存的物理現(xiàn)實(shí):1, 2, 3, 4, 5, 6

看到了嗎?為了拿到邏輯上的第二個(gè)元素 4,程序必須在物理內(nèi)存中“跳過” 2 和 3。這種訪問模式是“跳躍式”的,而不是連續(xù)的。

因此,盡管數(shù)據(jù)本身在內(nèi)存里是連續(xù)存放的,但張量 y 的邏輯訪問順序與物理存儲(chǔ)順序不再匹配。這就是為什么 y 被稱為“不連續(xù)”的張量。

??? 如何解決?

當(dāng)你需要對一個(gè)不連續(xù)的張量(如 y)使用 view 時(shí),就需要先調(diào)用 .contiguous() 方法。

y.contiguous() 會(huì)做一件 transpose 沒做的事:真正地復(fù)制并重新排列數(shù)據(jù)。它會(huì)創(chuàng)建一個(gè)新的內(nèi)存塊,并按照 y 當(dāng)前的邏輯順序(1, 4, 2, 5, 3, 6)將數(shù)據(jù)填充進(jìn)去。

這樣一來,新張量的邏輯訪問順序和新的物理存儲(chǔ)順序就又一致了,它就變回了連續(xù)張量,可以安全地使用 view 了。

總結(jié)一下:

  • 連續(xù):按邏輯順序訪問元素時(shí),在內(nèi)存中也是挨個(gè)讀取的。
  • 不連續(xù):按邏輯順序訪問元素時(shí),在內(nèi)存中需要“跳著”讀取。
  • transpose/permute 等操作通過改變“跳躍規(guī)則”(步長)來創(chuàng)造新視圖,但破壞了連續(xù)性。
  • .contiguous() 通過物理復(fù)制和重排數(shù)據(jù)來修復(fù)連續(xù)性。

.contiguous() 是 PyTorch 中一個(gè)用于確保張量(Tensor)在內(nèi)存中連續(xù)存儲(chǔ)的方法。

簡單來說,它的作用就是整理內(nèi)存。當(dāng)你調(diào)用它時(shí),它會(huì)返回一個(gè)新的張量,這個(gè)新張量的數(shù)據(jù)在物理內(nèi)存中是緊密、連續(xù)排列的,就像把一堆散亂的書重新整齊地碼放到書架上一樣。

2.?? 為什么需要.contiguous()?

正如我們之前討論的,transpose、permute 等操作會(huì)讓張量變得“不連續(xù)”,即邏輯訪問順序和物理存儲(chǔ)順序不一致。

而 PyTorch 中的一些操作,比如 view(),要求輸入的張量必須是連續(xù)的。如果你對一個(gè)不連續(xù)的張量直接使用 view(),就會(huì)報(bào)錯(cuò)。

這時(shí),.contiguous() 就派上用場了。它會(huì)創(chuàng)建一個(gè)數(shù)據(jù)連續(xù)的新副本,讓你可以順利地進(jìn)行后續(xù)操作。

??? 如何使用?

最常見的用法就是在 transpose 或 permute 之后,view 之前調(diào)用它。

import torch

# 1. 創(chuàng)建一個(gè)張量并轉(zhuǎn)置,使其不連續(xù)
x = torch.randn(2, 3, 4)
x_transposed = x.transpose(0, 1) # 此時(shí) x_transposed 是不連續(xù)的

# 2. 直接使用 view() 會(huì)報(bào)錯(cuò)
# y = x_transposed.view(6, 4) # RuntimeError!

# 3. 先調(diào)用 .contiguous() 整理內(nèi)存,再使用 view()
y = x_transposed.contiguous().view(6, 4) # 成功!

?? 關(guān)于x.is_contiguous()

你提到的 x.is_contiguous() 是一個(gè)非常有用的檢查方法。

  • 作用:它會(huì)返回一個(gè)布爾值(True 或 False),告訴你張量 x 當(dāng)前在內(nèi)存中是否是連續(xù)的。
  • 用法:在調(diào)試時(shí),如果你懷疑某個(gè)操作導(dǎo)致了張量不連續(xù),就可以用它來驗(yàn)證。
x = torch.randn(2, 3)
print(x.is_contiguous())      # 輸出: True (默認(rèn)是連續(xù)的)

y = x.transpose(0, 1)
print(y.is_contiguous())      # 輸出: False (轉(zhuǎn)置后不連續(xù))

z = y.contiguous()
print(z.is_contiguous())      # 輸出: True (整理后又變連續(xù)了)

??.contiguous()vs.clone()

兩者都會(huì)返回一個(gè)新的張量,但有區(qū)別:

  • .contiguous():是“智能”的。只有當(dāng)張量不連續(xù)時(shí),它才會(huì)復(fù)制數(shù)據(jù);如果張量已經(jīng)是連續(xù)的,它會(huì)直接返回自身,不做任何操作,效率更高。
  • .clone():是“無條件”的。無論張量是否連續(xù),它總是會(huì)復(fù)制一份完整的數(shù)據(jù),創(chuàng)建一個(gè)新的張量。

?? 最佳實(shí)踐

雖然 view() 在特定情況下性能稍好,但在日常開發(fā)中,更推薦使用 reshape()。因?yàn)?reshape() 內(nèi)部已經(jīng)自動(dòng)處理了連續(xù)性問題(必要時(shí)會(huì)自動(dòng)調(diào)用 .contiguous()),使用起來更安全、更省心,可以避免很多潛在的 RuntimeError。

到此這篇關(guān)于pytorch中view和reshape的區(qū)別的文章就介紹到這了,更多相關(guān)pytorch view reshape內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pytorch之深度神經(jīng)網(wǎng)絡(luò)概念全面整理

    pytorch之深度神經(jīng)網(wǎng)絡(luò)概念全面整理

    這篇文章主要介紹了pytorch之深度神經(jīng)網(wǎng)絡(luò)概念,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python腳本實(shí)現(xiàn)自動(dòng)化處理Excel選擇題

    Python腳本實(shí)現(xiàn)自動(dòng)化處理Excel選擇題

    本文介紹了一個(gè)自動(dòng)整理選擇題的Python腳本,可以將秒鐘自動(dòng)將雜亂的試題題題庫整理成Excel表格格式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-05-05
  • Python 中打印字典中的所有鍵值對的示例詳解

    Python 中打印字典中的所有鍵值對的示例詳解

    這篇文章主要介紹了Python輸出字典的鍵和值,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 解決Python在導(dǎo)入文件時(shí)的FileNotFoundError問題

    解決Python在導(dǎo)入文件時(shí)的FileNotFoundError問題

    這篇文章主要介紹了解決Python在導(dǎo)入文件時(shí)的FileNotFoundError問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 在python中實(shí)現(xiàn)調(diào)用可執(zhí)行文件.exe的3種方法

    在python中實(shí)現(xiàn)調(diào)用可執(zhí)行文件.exe的3種方法

    今天小編就為大家分享一篇在python中實(shí)現(xiàn)調(diào)用可執(zhí)行文件.exe的3種方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python中實(shí)現(xiàn)高效的列表過濾多種方法示例

    Python中實(shí)現(xiàn)高效的列表過濾多種方法示例

    這篇文章主要給大家介紹了關(guān)于Python中實(shí)現(xiàn)高效的列表過濾的多種方法,包括基礎(chǔ)的for循環(huán)、列表推導(dǎo)式、filter函數(shù)、itertools模塊,以及高級(jí)的pandas和numpy庫,我們還討論了生成器的使用,以及在實(shí)際場景中的應(yīng)用,需要的朋友可以參考下
    2024-12-12
  • wxpython布局的實(shí)現(xiàn)方法

    wxpython布局的實(shí)現(xiàn)方法

    這篇文章主要介紹了wxpython布局的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 使用Python計(jì)算隱含波動(dòng)率

    使用Python計(jì)算隱含波動(dòng)率

    隱含波動(dòng)率(Implied?Volatility)在金融領(lǐng)域是一個(gè)核心概念,用于描述市場對于未來資產(chǎn)價(jià)格波動(dòng)的預(yù)期程度,本文將詳細(xì)介紹如何使用Python計(jì)算隱含波動(dòng)率,需要的可以了解下
    2024-11-11
  • pygame+opencv實(shí)現(xiàn)讀取視頻幀的方法示例

    pygame+opencv實(shí)現(xiàn)讀取視頻幀的方法示例

    由于pygame.movie.Movie.play()只支持MPEG格式的視頻,所以決定使用與opencv讀取視頻幀的畫面,本文就詳細(xì)的介紹了pygame+opencv實(shí)現(xiàn)讀取視頻幀,感興趣的可以了解一下
    2021-12-12
  • Python中利用Virtualenv解決不同項(xiàng)目的包沖突

    Python中利用Virtualenv解決不同項(xiàng)目的包沖突

    本文主要介紹了Python中利用Virtualenv解決不同項(xiàng)目的包沖突,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04

最新評(píng)論

洛扎县| 馆陶县| 邵阳县| 海盐县| 靖安县| 虎林市| 宁强县| 梁平县| 遵化市| 比如县| 桦川县| 阆中市| 故城县| 彭阳县| 湘阴县| 八宿县| 裕民县| 韶山市| 高陵县| 同心县| 朝阳市| 美姑县| 青海省| 大方县| 楚雄市| 姚安县| 商洛市| 荃湾区| 西乡县| 治县。| 达日县| 金溪县| 延边| 永靖县| 泰顺县| 德清县| 射阳县| 汕尾市| 云龙县| 饶河县| 岑溪市|