😉如果您想用jupyter notebook跑我的筆記,可以在下面獲取ipynb版本
😊麻煩給個免費的star😘
??主包也更建議這種形式,上面的筆記也更加全面,每一步都有直觀的輸出
文章目錄
- 📚 PyTorch張量操作與自動微分全面指南
- 🛠 1. 準備工作
- 1.1 導入PyTorch并檢查環境
- 1.2 設置計算設備
- 📦 1.1 張量初始化
- 1.1.1 從Python數據類型創建
- 1.1.2 數據類型處理
- 1.1.3 從NumPy數組創建
- 1.1.4 特殊張量創建
- 1.1.5 張量屬性查看
- 1.1.6 張量設備轉移
- ? 1.2 張量運算
- 1.2.1 基本運算
- 1.2.2 張量轉換
- 1.2.3 形狀操作
- 🔁 1.3 張量自動微分
- 1.3.1 梯度計算核心概念
- 1.3.2 梯度計算實戰
- 1.3.3 梯度控制技巧
- 💎 核心要點總結
📚 PyTorch張量操作與自動微分全面指南
PyTorch作為深度學習領域的主流框架,掌握其核心數據結構張量(Tensor)的操作至關重要。本文將全面解析PyTorch張量的創建、運算和自動微分機制,助你快速上手PyTorch開發!🚀
🛠 1. 準備工作
1.1 導入PyTorch并檢查環境
# 導入torch庫
import torch# 查看torch版本
print(torch.__version__) # 輸出: 2.6.0+cu124# 檢查CUDA是否可用
torch.cuda.is_available() # 輸出: True
1.2 設置計算設備
device = "cuda" if torch.cuda.is_available() else "cpu"
print(device) # 輸出: cuda
📦 1.1 張量初始化
1.1.1 從Python數據類型創建
data = [[1,2],[3,4]]
x = torch.tensor(data)
print(x)
# 輸出:
# tensor([[1, 2],
# [3, 4]])
1.1.2 數據類型處理
# 查看數據類型
print(x.dtype) # 輸出: torch.int64# 指定數據類型創建
x1 = torch.FloatTensor([[1,2],[3,4]]) # 等價于 torch.tensor(..., dtype=torch.float32)
x2 = torch.LongTensor([[1,2],[3,4]])# 強制類型轉換
x1 = x1.type(torch.long) # 轉換為int64
x1 = x1.float() # 轉換為float32
💡 關鍵提示:
torch.float32
和torch.int64
是最重要的數據類型!模型輸入通常是float32,分類標簽通常是int64
1.1.3 從NumPy數組創建
import numpy as np
data = np.array([[1,2],[4,3]])
x3 = torch.from_numpy(data)
print(x3)
# 輸出:
# tensor([[1, 2],
# [4, 3]])
1.1.4 特殊張量創建
# 創建隨機張量
rand_tensor = torch.rand(2,3) # 0~1均勻分布
randn_tensor = torch.randn(2,3) # 標準正態分布# 創建全1/全0張量
ones_tensor = torch.ones(2,3)
zeros_tensor = torch.zeros(2,3)# 繼承形狀創建
y1 = torch.rand_like(x.float())
1.1.5 張量屬性查看
t = x
print(t.shape) # 形狀: torch.Size([2, 2])
print(t.size()) # 大小: torch.Size([2, 2])
print(t.dtype) # 數據類型: torch.int64
print(t.device) # 存儲設備: cpu
1.1.6 張量設備轉移
x_gpu = x.to(device) # 轉移到GPU
print(x_gpu.device) # 輸出: cuda:0
? 1.2 張量運算
1.2.1 基本運算
# 就地加法 (會改變原張量)
t1 = torch.randn(2,3)
t2 = torch.ones(2,3)
t2.add_(t1)# 矩陣乘法
result1 = t1 @ t2.T
result2 = t1.matmul(t2.T)
1.2.2 張量轉換
# 單元素張量轉標量
t3 = t1.sum()
scalar = t3.item() # 輸出: 2.1050655841827393# 張量轉NumPy數組
numpy_array = t1.numpy()
1.2.3 形狀操作
t = torch.randn(4,6)# 重塑形狀
t1 = t.view(3,8) # 顯式指定形狀
t2 = t.view(-1,1) # 自動推斷維度
t3 = t.view(1,4,6) # 增加維度# 維度壓縮與擴展
t4 = torch.ones(1,4,6)
t5 = torch.squeeze(t4) # 移除大小為1的維度
t6 = torch.unsqueeze(t5,0) # 在指定位置添加維度
🔁 1.3 張量自動微分
1.3.1 梯度計算核心概念
PyTorch的自動微分系統基于以下三個關鍵屬性:
requires_grad
:是否跟蹤梯度(默認為False)grad
:存儲計算得到的梯度grad_fn
:指向生成此張量的運算方法
1.3.2 梯度計算實戰
# 創建需要跟蹤梯度的張量
t = torch.ones(2,2, requires_grad=True)
print(t.requires_grad) # 輸出: True# 構建計算圖
y = t + 5
x = y * 2
out = x.mean()# 反向傳播計算梯度
out.backward()# 查看梯度
print(t.grad)
# 輸出:
# tensor([[0.5000, 0.5000],
# [0.5000, 0.5000]])
1.3.3 梯度控制技巧
# 臨時禁用梯度跟蹤
with torch.no_grad():print((t + 2).requires_grad) # 輸出: False# 獲取不跟蹤梯度的張量副本
detached_t = t.detach()
print(detached_t.requires_grad) # 輸出: False# 永久關閉梯度跟蹤
t.requires_grad_(False)
print(t.requires_grad) # 輸出: False
💎 核心要點總結
-
張量創建:
- 使用
torch.tensor()
從Python數據創建 - 使用
torch.from_numpy()
從NumPy數組轉換 - 掌握
torch.rand()
,torch.randn()
,torch.ones()
,torch.zeros()
等創建方法
- 使用
-
數據類型管理:
- 重點掌握
float32
(模型輸入)和int64
(分類標簽) - 使用
.float()
和.long()
快速轉換類型
- 重點掌握
-
設備轉移:
- 使用
.to(device)
在CPU/GPU間移動張量 - 始終檢查
tensor.device
確保張量位置正確
- 使用
-
自動微分:
- 設置
requires_grad=True
啟用梯度跟蹤 - 使用
.backward()
自動計算梯度 - 使用
with torch.no_grad():
上下文管理器禁用梯度計算
- 設置
-
性能優化:
- 盡量使用就地操作(如
add_()
)減少內存開銷 - 合理使用
view()
進行形狀重塑 - 及時使用
detach()
分離不需要的計算圖
- 盡量使用就地操作(如
掌握這些PyTorch張量核心操作,你已為深度學習模型開發打下堅實基礎!🎯 下一步可以探索神經網絡模塊和優化器的使用,開啟模型訓練之旅!