????????PyTorch中的Tensor? 是核心數據結構,類似于 NumPy 的多維數組,但具備 GPU 加速和自動求導等深度學習特性。
一、基本概念
-
?核心數據結構?
- Tensor 是存儲和操作數據的基礎單元,支持標量(0D)、向量(1D)、矩陣(2D)及更高維數組?。
- 與 NumPy 的?
ndarray
?類似,但支持動態計算圖和自動梯度計算?。
-
?關鍵特性?
- ?GPU 加速?:可存儲在 CPU 或 GPU 中,GPU 計算顯著提升性能?。
- ?自動求導?:通過?
requires_grad=True
?啟用梯度計算,支持反向傳播?。
二、創建方式
-
?直接創建?
- 從 Python 列表或元組初始化:
a = torch.tensor([1, 2, 3]) # 1D Tensor(向量) b = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) # 2D Tensor(矩陣)?
- 指定數據類型(如?
dtype=torch.float32
)和設備(如?device='cuda'
)?。
- 從 Python 列表或元組初始化:
-
?初始化方法?
- 全零/全一張量:
zeros_tensor = torch.zeros((2, 3)) # 2x3 全零張量 ones_tensor = torch.ones((2, 3)) # 2x3 全一張量?
- 隨機張量:
rand_tensor = torch.rand((2, 3)) # 值在 [0,1) 的均勻分布?
- 全零/全一張量:
-
?從其他數據結構轉換?
- 從 NumPy 數組轉換:
?使用?
torch.from_numpy()
,Tensor 與 NumPy 數組共享內存(修改一方會影響另一方)numpy_arr = np.array([1, 2, 3]) tensor = torch.from_numpy(numpy_arr) # 共享內存?
使用?
torch.tensor()
?復制數據,生成獨立 Tensor:tensor = torch.tensor(numpy_arr) # 不共享內存?
- 從圖片轉換:
使用 torchvision.transforms
將 NumPy 格式的圖片(HWC 格式,值域 [0, 255])轉換為 Tensor(CHW 格式,值域 [0.0, 1.0]):from PIL import Image from torchvision import transformsimg = Image.open("image.jpg") # PIL.Image 對象 (H,W,C) tensor_trans = transforms.ToTensor() tensor_img = tensor_trans(img) # 轉為 Tensor (C, H, W)
- 從 NumPy 數組轉換:
三、維度與形狀
-
?常見維度類型?
- ?0D 張量?:標量(如?
torch.tensor(5)
)?。 - ?1D 張量?:向量(如時間序列數據)?。
- ?2D 張量?:矩陣(如表格數據)?。
- ?3D 張量?:多通道圖像(形狀?
(C, H, W)
)?。 - ?4D 張量?:批量圖像(形狀?
(N, C, H, W)
,N
?為批量大小)?。 - ?5D 張量?:視頻或體積數據(如醫療圖像)?。
- ?0D 張量?:標量(如?
-
?形狀操作?
- 調整形狀:
reshape()
?或?view()
(需保證元素總數不變)?。 - 轉置:
tensor.T
?或?transpose()
?。
- 調整形狀:
四、運算與操作
-
?數學運算?
- 逐元素運算(如?
+
,?*
,?torch.sin()
)?。 - 矩陣乘法:
torch.matmul()
?或?@
?運算符?。
- 逐元素運算(如?
-
?索引與切片?
- 類似 NumPy 的索引方式:
tensor = torch.rand(3, 4) row = tensor[0, :] # 第一行 column = tensor[:, 1] # 第二列?
- 類似 NumPy 的索引方式:
-
?自動求導?
- 啟用梯度跟蹤:
x = torch.tensor(2.0, requires_grad=True) y = x**2 y.backward() # 計算梯度 print(x.grad) # 輸出 4.0?
- 啟用梯度跟蹤:
五、其他特性
-
?數據類型?
- 支持多種類型(如?
torch.float32
、torch.int64
),可通過?dtype
?參數指定?。 - 通過 .float()、.int() 等方法改變 Tensor 的數據類型。
tensor = torch.tensor([1, 2]).float() # 轉為 float32?
- 支持多種類型(如?
-
?設備切換?
- 使用?
.to('cuda')
?或?.cpu()
?在 CPU 和 GPU 間移動張量?。tensor_cpu = torch.tensor([1, 2]) tensor_gpu = tensor_cpu.to("cuda") # 轉為 GPU Tensor?
- 使用?