一、reshape基礎概念
torch reshape是PyTorch提供的一種基本操作,用於更改PyTorch張量的形狀(形狀包括張量的尺寸和維度)。當我們需要對張量進行扁平化,展平或還原操作時,就可以使用reshape函數。
實際上,reshape函數不改變原始張量數據的大小和順序,而是將原始數據重組為新的張量,以符合新的形狀。例如,我們可以將一個形狀為3×3的張量轉換為形狀為9×1的向量或形狀為1×9的向量,同時保持原始數據不變。
下面是一個展示reshape函數的基礎用法的示例代碼:
import torch # 創建一個形狀為(2,4)的張量 x = torch.Tensor([[0, 1, 2, 3], [4, 5, 6, 7]]) # 將張量重新reshape為形狀為(8,1) x = x.reshape((8, 1)) # 輸出重組後的張量 print(x)
二、reshape高級應用
1. 張量擴展
張量擴展是一種通過增加維度來擴展張量的方法。PyTorch使用reshape函數實現張量擴展。例如,我們可以將形狀為(4,)的向量擴展為形狀為(1,4)的張量,再擴展為形狀為(3,1,4)的張量。下面是一個示例代碼:
import torch # 創建一個形狀為(4,)的向量 x = torch.Tensor([0, 1, 2, 3]) # 張量擴展:將向量擴展為形狀為(1,4)的張量 x = x.reshape((1, 4)) # 張量擴展:將向量擴展為形狀為(3,1,4)的張量 x = x.reshape((3, 1, 4)) # 輸出橫跨三個維度的張量 print(x)
2. 將多維張量展平
我們可以使用PyTorch的reshape函數來將多維張量展平為一維向量。在將多維張量reshape為一維向量之前,通常需要先確認多維張量的元素數量是否符合預期,以確保不會丟失任何信息。以下是一個示例代碼:
import torch # 創建一個形狀為(2,3)的張量 x = torch.Tensor([[0, 1, 2], [3, 4, 5]]) # 展平張量 x = x.reshape((-1,)) # 輸出展平後的張量 print(x)
3. 重新排列張量中的維度
我們可以使用PyTorch的reshape函數來重新排列張量中的維度。在重新排列張量中的維度之前,需要確認多個張量的元素數量是否匹配。以下是一個示例代碼:
import torch # 創建一個形狀為(2,3,4)的張量 x = torch.randn(2, 3, 4) # 重新排列張量中的維度 x = x.permute(1, 0, 2) # 輸出重新排列後的張量 print(x)
三、reshape注意事項
1. 元素總數必須相同
當使用reshape函數重新排列張量維度時,必須確保所有張量元素的總數相同,否則會拋出異常。例如,不能將一個形狀為(3,3)的張量reshape為(2,3)的張量,因為元素總數不一樣。同樣的理由,不能將形狀為(3,3)的張量reshape為形狀為(1,8)的張量,原因也是元素總數不一樣。
2. 某些操作可能需要變量的形狀
在PyTorch中,有些操作可能需要符合特定形狀的變量。例如,當我們需要在兩個張量上執行矩陣相乘時,這兩個張量的形狀必須符合矩陣相乘的規則。在這種情況下,我們可以使用reshape函數將一個形狀不正確的張量轉換為新的形狀,以符合操作的需要。
3. reshape() 返回的是視圖,而不是副本
PyTorch的reshape函數返回的是原始張量的新視圖,而不是副本,因此原始張量和新形狀的張量共享相同的數據。如果更改其中一個張量,則其他張量可能會收到影響。這也意味着,如果我們修改了使用reshape函數返回的張量,原始張量的形狀也將會被改變。如果需要避免這種情況,可以使用clone函數創建一個新的張量。
4. 零維張量不能被展平
零維張量是一種特殊情況,它們不具有任何形狀,也不包含元素。在大多數情況下,我們會避免創建零維張量或使用零維張量上的reshape函數,因為它們會導致程序異常。例如,試圖展平零維張量時將引發:只有具有非零元素的張量才能通過展平函數進行展平的異常。下面是一個異常代碼示例:
import torch # 創建一個Form為()的零維張量 x = torch.Tensor(3) # 試圖展平零維張量時將引發異常 x = x.reshape((-1,)) # 異常信息:只有具有非零元素的張量才能通過展平函數進行展平 print(x)
5. 名稱維都可以被修改
PyTorch的張量可以在名稱維中指定張量的名稱。當我們使用reshape函數更改張量形狀時,名稱維也會自動更改。以下是一個示例代碼:
import torch # 創建一個形狀為(2,3)的張量 x = torch.randn(2, 3) x = x.name_("x") # 將張量reshape為形狀為(3,2) y = x.reshape(3, 2) # 輸出張量名稱和形狀 print(y.name, y.shape)
四、總結
PyTorch的reshape函數支持多種不同的操作,包括重新排列張量維度、張量擴展和多維張量展平等。在使用reshape函數時,注意元素總數必須相同,某些操作需要變量的形狀,並且在修改使用reshape函數返回的張量時,原始張量的形狀也將會被改變。最後,不要忘記名稱維可以在使用reshape函數時進行修改。
原創文章,作者:PGPIO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/369253.html