PyTorch是一個廣泛使用的深度學習框架,它提供了許多功能強大的工具和函數,用于構建和訓練神經網絡。以下是一些PyTorch的常用知識點和示例說明:
-
張量(Tensors)
-
創建張量:使用torch.tensor()?、torch.Tensor()?或特定創建函數如torch.zeros()?, torch.ones()?, torch.randn()?等創建不同類型的張量。
import torch x = torch.tensor([1., 2., 3.]) # 創建一個浮點型張量 zeros_tensor = torch.zeros((3, 4)) # 創建一個3x4的全零張量
-
張量操作:類似NumPy,支持各種數學運算和索引操作,如加減乘除、矩陣乘法、廣播機制、切片等。
y = torch.tensor([4., 5., 6.]) result = x + y # 張量加法
-
數據類型轉換:通過.to()?方法可以改變張量的數據類型或者設備(CPU/GPU)。
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') x_gpu = x.to(device) # 將張量移動到GPU上
-
-
自動微分(Autograd)
-
使用.requires_grad_()?標記張量以啟用梯度計算:
x.requires_grad_() y = x * 2 z = y.sum() z.backward() # 自動計算梯度 print(x.grad) # 輸出x的梯度
-
-
神經網絡模塊(nn.Module)
-
定義網絡結構:繼承自nn.Module?并實現__init__?和forward?方法。
import torch.nn as nnclass SimpleNet(nn.Module):def __init__(self):super(SimpleNet, self).__init__()self.linear = nn.Linear(784, 10) # 定義一個線性層def forward(self, x):out = self.linear(x)return out
-
構建與訓練模型:
model = SimpleNet() criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01)for epoch in range(num_epochs):# 前向傳播output = model(inputs)loss = criterion(output, targets)# 反向傳播及優化optimizer.zero_grad()loss.backward()optimizer.step()
-
-
數據加載器(DataLoader)
-
使用torch.utils.data.DataLoader?來加載和批處理數據。
from torch.utils.data import DataLoader, TensorDatasetdataset = TensorDataset(data_tensor, label_tensor) dataloader = DataLoader(dataset, batch_size=64, shuffle=True) for batch_data, batch_labels in dataloader:# 在每個迭代周期中,batch_data和batch_labels會是當前批次的張量數據pass
-
-
保存與加載模型
-
使用torch.save()?和torch.load()?保存和加載模型參數或整個模型。
torch.save(model.state_dict(), 'model.pth') # 保存模型參數 model.load_state_dict(torch.load('model.pth')) # 加載模型參數# 或者保存整個模型 torch.save(model, 'model_full.pth') # 保存整個模型(包括其結構和參數) loaded_model = torch.load('model_full.pth', map_location=device) # 加載整個模型
-
-
多GPU并行訓練
-
使用torch.nn.DataParallel?或torch.nn.parallel.DistributedDataParallel?進行多GPU訓練。
model = nn.DataParallel(SimpleNet()) # 如果有多塊GPU可用,則將模型分布到多個GPU上
-
-
控制流(autograd with control flow)
- PyTorch支持在動態圖模式下使用Python的控制流語句(如if-else、for循環),并且能正確跟蹤梯度。
動態計算圖、混合精度訓練、量化壓縮、可視化工具
動態計算圖(Dynamic Computation Graph)
在PyTorch中,計算圖是在運行時構建的,這意味著你可以根據程序運行的狀態實時改變網絡結構或執行不同的計算路徑。這是與靜態計算圖框架如TensorFlow的一個顯著區別。
示例:
# 動態改變模型結構
class DynamicModel(nn.Module):def __init__(self):super(DynamicModel, self).__init__()self.linear1 = nn.Linear(10, 5)self.linear2 = nn.Linear(5, 3)def forward(self, x, use_second_layer=True):out = F.relu(self.linear1(x))if use_second_layer:out = self.linear2(out) # 根據條件決定是否使用第二層return outmodel = DynamicModel()
混合精度訓練(Mixed Precision Training)
混合精度訓練利用了FP16和FP32數據類型的優勢,通過將部分計算轉移到半精度上以減少內存占用和加快計算速度,同時保持關鍵部分(如梯度更新)在全精度下進行,以維持數值穩定性。
使用torch.cuda.amp?模塊實現自動混合精度訓練:
import torch
from torch.cuda.amp import autocast, GradScalerscaler = GradScaler()for inputs, targets in dataloader:inputs = inputs.cuda()targets = targets.cuda()with autocast():outputs = model(inputs)loss = criterion(outputs, targets)scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()optimizer.zero_grad()
量化壓縮(Quantization)
量化是將模型的權重和激活從浮點數轉換為低比特整數的過程,從而減小模型大小并加速推理。PyTorch提供了量化API來實現這一過程。
簡化版量化示例:
import torch.quantization# 假設model是一個已經訓練好的模型
model_fp32 = ... # 初始化并訓練模型# 首先對模型進行偽量化(模擬量化)
prepared_model = torch.quantization.prepare(model_fp32)
# 進行量化校準(收集統計數據)
quantized_model = torch.quantization.convert(prepared_model)# 現在quantized_model是一個量化后的模型,可以用于推理
可視化工具
PyTorch支持通過torchviz?庫來進行計算圖可視化,或者配合其他工具(如TensorBoard)展示模型結構、訓練指標等。
對于簡單的計算圖可視化:
from torchviz import make_dotx = torch.randn(5, requires_grad=True)
y = x * 2
z = y ** 2
z.backward(torch.ones_like(z))dot_graph = make_dot(z)
dot_graph.view() # 在Jupyter Notebook中顯示圖形
對于模型結構可視化,通常結合torchsummary?或直接使用TensorBoard配合torch.utils.tensorboard?接口:
from torchsummary import summarysummary(model, input_size=(1, 28, 28)) # 對于卷積神經網絡,輸入維度為(通道, 高, 寬)# 或者在TensorBoard中展示模型結構
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter()
writer.add_graph(model, torch.rand((1, 28, 28))) # 輸入一個隨機張量獲取模型結構
writer.close()