第33集:PyTorch 入門-動態計算圖的優勢
摘要
PyTorch 是一個靈活且強大的深度學習框架,其核心特性是動態計算圖機制。本集將帶您探索 PyTorch 的張量操作、自動求導系統以及動態計算圖的特點與優勢,并通過實戰案例演示如何使用 PyTorch 實現線性回歸和構建簡單的圖像分類模型。我們將重點突出 PyTorch 在研究與開發中的靈活性及其在 AI 大模型訓練中的應用。
核心概念和知識點
1. 張量操作與自動求導
- 張量(Tensor):類似于 NumPy 數組,但支持 GPU 加速。
- 自動求導(Autograd):PyTorch 提供了自動微分功能,能夠高效計算梯度,用于優化模型參數。
2. 動態計算圖的特點與優勢
- 動態計算圖:PyTorch 的計算圖是在運行時動態構建的,支持即時調試和修改。
- 靈活性:適合實驗性研究,便于實現復雜的模型架構。
- 直觀性:代碼執行過程清晰可見,易于理解。
3. 自定義模型與訓練循環
- 模型定義:通過繼承
torch.nn.Module
自定義模型結構。 - 訓練循環:手動實現前向傳播、損失計算和反向傳播,提供更細粒度的控制。
4. AI 大模型相關性分析
PyTorch 是目前主流的 AI 大模型框架之一,廣泛應用于 GPT、BERT 等模型的訓練:
- 分布式訓練支持:通過
torch.distributed
模塊實現多 GPU 和多節點訓練。 - 生態系統豐富:結合 Hugging Face Transformers 等庫,可快速搭建和訓練大模型。
實戰案例
案例 1:使用 PyTorch 實現線性回歸
背景
線性回歸是最基礎的機器學習任務之一,我們使用 PyTorch 實現一個簡單的線性回歸模型。
代碼實現
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt# 數據生成
torch.manual_seed(42)
x = torch.linspace(-1, 1, 100).reshape(-1, 1) # 輸入特征
y = 3 * x + 2 + 0.2 * torch.randn(x.size()) # 帶噪聲的目標值# 定義模型
class LinearRegressionModel(nn.Module):def __init__(self):super().__init__()self.linear = nn.Linear(1, 1) # 單輸入單輸出的線性層def forward(self, x):return self.linear(x)model = LinearRegressionModel()# 定義損失函數和優化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 訓練模型
epochs = 100
for epoch in range(epochs):# 前向傳播y_pred = model(x)loss = criterion(y_pred, y)# 反向傳播與優化optimizer.zero_grad()loss.backward()optimizer.step()if (epoch + 1) % 10 == 0:print(f"Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}")# 可視化結果
predicted = model(x).detach().numpy()
plt.scatter(x.numpy(), y.numpy(), label="Original Data", alpha=0.6)
plt.plot(x.numpy(), predicted, 'r', label="Fitted Line")
plt.legend()
plt.title("Linear Regression with PyTorch")
plt.show()
輸出結果
Epoch 10/100, Loss: 0.0431
...
Epoch 100/100, Loss: 0.0012
可視化
案例 2:構建一個簡單的圖像分類模型
背景
我們使用 CIFAR-10 數據集,構建一個簡單的卷積神經網絡(CNN)進行圖像分類。
代碼實現
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms# 數據加載與預處理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False)# 定義 CNN 模型
class SimpleCNN(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(3, 16, 3, padding=1)self.pool = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(16 * 16 * 16, 10)def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))x = x.view(-1, 16 * 16 * 16)x = self.fc1(x)return xmodel = SimpleCNN()# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 訓練模型
for epoch in range(5): # 僅訓練 5 個 epochrunning_loss = 0.0for i, data in enumerate(trainloader):inputs, labels = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99: # 每 100 個 batch 打印一次損失print(f"[{epoch+1}, {i+1}] Loss: {running_loss / 100:.3f}")running_loss = 0.0print("Finished Training")# 測試模型
correct = 0
total = 0
with torch.no_grad():for data in testloader:images, labels = dataoutputs = model(images)_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Accuracy on Test Set: {100 * correct / total:.2f}%")
輸出結果
[1, 100] Loss: 2.123
...
Accuracy on Test Set: 55.25%
總結
PyTorch 的動態計算圖機制使其成為深度學習研究與開發的理想工具。通過本集的學習,我們掌握了如何使用 PyTorch 實現線性回歸和構建簡單的圖像分類模型,并了解了其在靈活性和實驗性方面的優勢。
擴展思考
1. PyTorch 在 AI 大模型訓練中的應用
PyTorch 是訓練 GPT、BERT 等大模型的核心工具之一。其動態計算圖機制使得研究人員能夠快速迭代模型架構,而分布式訓練支持則確保了大模型的高效訓練。
2. PyTorch Lightning 的簡化功能
PyTorch Lightning 是一個高級接口,旨在簡化 PyTorch 的使用。它隱藏了訓練循環的復雜性,同時保留了底層靈活性,特別適合大規模實驗和生產環境。
專欄鏈接:Python實戰進階
下期預告:No34 - 使用 Pandas 高效處理時間序列數據