目錄
1. Tensor 與 NumPy 數組的轉換
1.1 Tensor 轉換為 NumPy 數組
1.2 NumPy 數組轉換為 Tensor
1.3 獲取單個元素的值
2. Tensor 的基本運算
2.1 生成新 Tensor 的運算
2.2 覆蓋原 Tensor 的運算
2.3 阿達瑪積(逐元素乘法)
2.4 矩陣乘法
3. Tensor 的形狀變換
3.1?view()?方法
3.2?reshape()?方法
4. 維度變換
4.1?transpose()?方法
4.2?permute()?方法
5. 完整代碼示例
6. 總結
在深度學習中,PyTorch 的 Tensor 是核心數據結構,它類似于 NumPy 的數組,但可以在 GPU 上高效運行。除了創建 Tensor,PyTorch 還提供了豐富的操作方法,包括 Tensor 與 NumPy 數組的轉換、基本運算、維度變換等。今天,我們就通過一個簡單的代碼示例,學習這些基本操作。
1. Tensor 與 NumPy 數組的轉換
PyTorch 提供了非常方便的接口,用于在 Tensor 和 NumPy 數組之間進行轉換。這在實際應用中非常有用,因為 NumPy 是 Python 中處理數組的標準庫。
1.1 Tensor 轉換為 NumPy 數組
t1 = torch.tensor([1, 2, 3, 4, 5])
n1 = t1.numpy()
print(n1)
-
t1.numpy()
:將 Tensor 轉換為 NumPy 數組。注意,這種轉換是淺拷貝,即 NumPy 數組和 Tensor 共享內存。
1.2 NumPy 數組轉換為 Tensor
t2 = torch.tensor(n1)
print(t2)
-
torch.tensor(n1)
:將 NumPy 數組轉換為 Tensor。這種轉換是深拷貝,即生成一個新的 Tensor,不共享內存。
t3 = torch.from_numpy(n1)
print(t3)
-
torch.from_numpy(n1)
:將 NumPy 數組轉換為 Tensor。這種轉換是淺拷貝,即 Tensor 和 NumPy 數組共享內存。
1.3 獲取單個元素的值
t4 = torch.tensor([18])
print(t4.item())
-
t4.item()
:當 Tensor 只有一個元素時,可以使用item()
獲取該元素的值。
2. Tensor 的基本運算
PyTorch 提供了豐富的運算操作,包括加法、減法、乘法和除法。這些運算可以分為兩類:生成新 Tensor 的操作和覆蓋原 Tensor 的操作。
2.1 生成新 Tensor 的運算
t1 = torch.randint(1, 10, (3, 2))
print(t1.add(1))
-
t1.add(1)
:對t1
的每個元素加 1,結果生成一個新的 Tensor。
2.2 覆蓋原 Tensor 的運算
print(t1.add_(1))
-
t1.add_(1)
:對t1
的每個元素加 1,結果覆蓋原 Tensor。
2.3 阿達瑪積(逐元素乘法)
t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])
t3 = t1 * t2
print(t3)
-
t1 * t2
:逐元素乘法,即對應位置的元素相乘。
2.4 矩陣乘法
t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])
t3 = torch.matmul(t1, t2)
print(t3)
-
torch.matmul(t1, t2)
:矩陣乘法,符合矩陣乘法的規則。
3. Tensor 的形狀變換
在深度學習中,經常需要對 Tensor 的形狀進行變換,例如在卷積神經網絡中調整輸入數據的維度。PyTorch 提供了 view()
和 reshape()
方法來實現這一點。
3.1?view()
?方法
t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t2 = t1.view(3, 2)
print(t2)
-
t1.view(3, 2)
:將 Tensor 的形狀從(2, 3)
變為(3, 2)
。注意,view()
要求 Tensor 的內存是連續的。
3.2?reshape()
?方法
t1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
t3 = t1.reshape(3, 2)
print(t3)
-
t1.reshape(3, 2)
:與view()
類似,但reshape()
不要求內存是連續的。
4. 維度變換
在處理多維數據時,經常需要對 Tensor 的維度進行變換,例如在處理圖像數據時交換通道維度。
4.1?transpose()
?方法
t1 = torch.randint(1, 20, (3, 4, 5))
t2 = torch.transpose(t1, 0, 1)
print(t2)
-
torch.transpose(t1, 0, 1)
:交換 Tensor 的第 0 維和第 1 維。
4.2?permute()
?方法
t3 = t1.permute(1, 0, 2)
print(t3)
-
t1.permute(1, 0, 2)
:可以同時交換多個維度,非常靈活。
5. 完整代碼示例
import torchdef test01():t1 = torch.tensor([1,2,3,4,5])# numpy():將tensor轉換為numpy數組,淺拷貝:如果要深拷貝,需要使用copy()# tensor():將numpy數組轉換為tensor,深拷貝# from_numpy():將numpy數組轉換為tensor,淺拷貝n1 = t1.numpy()print(n1)t2 = torch.tensor(n1)print(t2)t3 = torch.from_numpy(n1)print(t3)# item():當tensor只有一個元素時,使用item()獲取該元素的值# t4 = torch.tensor(18)t4 = torch.tensor([18])print(t4)print(t4.item())# t5 = torch.tensor([18],device='cuda')# print(t5.item())def test02():torch.manual_seed(0)# tensor運算# add, sub , mul, div等,計算結果會生成新的tensor# add_, sub_, mul_, div_等,計算結果會覆蓋原來的tensort1 = torch.randint(1 , 10, (3, 2))print(t1)print(t1.add(1))print(t1)print(t1.add_(1))print(t1)'''
阿達碼積:兩個矩陣對應位置相乘,得到一個新的矩陣
Cij = Aij * Bij
運算符號: mul或者*
矩陣運算:(m,p) * (p,n) = (m,n)
'''
def test03():t1 = torch.tensor([1,2],[3,4])t2 = torch.tensor([5,6],[7,8])t3 = t1 * t2print(t3)'''
view():改變tensor的形狀,不改變tensor的數據,內存是連續的
reshape():改變tensor的形狀,不改變tensor的數據,內存不連續
'''def test04():t1 = torch.tensor([1,2,3],[4,5,6])print(t1.is_contiguous())t2 = t1.view(3, 2)print(t2.is_contiguous())t3 = t1.t()print(t3)print(t3.is_contiguous())t4 = t3.view(2, 3)print(t4.is_contiguous())'''
維度變換
transpose():轉置,交換張量的兩個維度, 只能交換兩個維度
permute(input,dims):維度變換,可以交換多個維度
'''
def test05():t1 = torch.randint(1, 20, (3, 4, 5))print(t1)t2 = torch.transpose(t1, 0, 1)print(t2)print(t2.is_contiguous())t3 = t1.permute(t1, (1, 0, 2))print(t3)print(t3.shape)if __name__ == '__main__':# test01()# test02()# test03()# test04()test05()
6. 總結
通過這篇文章,我們學習了 PyTorch 中 Tensor 的基本操作,包括:
-
如何在 Tensor 和 NumPy 數組之間進行轉換。
-
如何進行基本的數學運算。
-
如何改變 Tensor 的形狀。
-
如何對 Tensor 的維度進行變換。
這些操作是深度學習的基礎,希望這篇文章能幫助你更好地理解和使用 PyTorch!