PyTorch入門教程:手把手教你搭建第一個神經網絡模型¶
1. 引言¶
PyTorch是一個開源的Python機器學習庫,尤其在深度學習領域廣泛應用。它以其動態計算圖、直觀的語法和高效的性能著稱,是初學者入門深度學習的絕佳選擇。本文將通過一個完整的示例,帶你一步步搭建第一個神經網絡模型,從數據加載到模型訓練,讓你快速掌握PyTorch的核心操作。
2. 環境準備¶
在開始之前,請確保你已安裝PyTorch。如果還未安裝,可以通過以下命令安裝(根據你的系統選擇合適的版本):
# CPU版本
pip install torch torchvision
# GPU版本(需預先安裝CUDA)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118/torch_stable.html
3. 數據準備:加載MNIST數據集¶
MNIST是一個經典的手寫數字識別數據集,包含60000張訓練圖像和10000張測試圖像,每張圖像是28×28的灰度圖。我們將使用PyTorch的torchvision庫加載並預處理數據。
3.1 導入所需庫¶
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
3.2 定義數據變換和加載器¶
# 數據變換:將圖像轉爲張量並歸一化
transform = transforms.Compose([
transforms.ToTensor(), # 轉換爲張量,像素值從0-255變爲0-1
transforms.Normalize((0.1307,), (0.3081,)) # 標準化(減去均值,除以標準差)
])
# 加載訓練集和測試集
train_dataset = datasets.MNIST(
root='./data', train=True, download=True, transform=transform
)
test_dataset = datasets.MNIST(
root='./data', train=False, download=True, transform=transform
)
# 創建數據加載器(批量處理數據,打亂順序)
batch_size = 64 # 每次訓練的樣本數
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
4. 定義神經網絡模型¶
我們將構建一個簡單的全連接神經網絡(MLP),包含以下部分:
- 輸入層:784個神經元(28×28的圖像展平)
- 隱藏層:128個神經元(使用ReLU激活函數)
- 輸出層:10個神經元(對應0-9的數字,使用Softmax激活)
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
# 定義全連接層:輸入784,輸出128
self.fc1 = nn.Linear(28*28, 128)
# 定義全連接層:輸入128,輸出10
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
# 前向傳播:先展平圖像,再通過全連接層和激活函數
x = x.view(-1, 28*28) # 展平圖像,-1表示自動計算batch_size
x = torch.relu(self.fc1(x)) # ReLU激活函數
x = self.fc2(x) # 輸出層,無激活(CrossEntropyLoss會自動處理)
return x
# 實例化模型
model = SimpleNN()
5. 定義損失函數和優化器¶
- 損失函數:分類任務常用交叉熵損失(
nn.CrossEntropyLoss),它會自動處理Softmax。 - 優化器:使用隨機梯度下降(SGD),學習率設爲0.01。
criterion = nn.CrossEntropyLoss() # 交叉熵損失
optimizer = optim.SGD(model.parameters(), lr=0.01) # SGD優化器
6. 訓練模型¶
訓練過程分爲以下步驟:
1. 遍歷訓練數據集(多個epoch)
2. 對每個batch數據,前向傳播計算輸出
3. 計算損失,反向傳播計算梯度
4. 更新模型參數
epochs = 5 # 訓練輪數
for epoch in range(epochs):
model.train() # 模型設爲訓練模式(啓用Dropout/BatchNorm等)
running_loss = 0.0
for batch_idx, (data, target) in enumerate(train_loader):
# 清零梯度
optimizer.zero_grad()
# 前向傳播:計算模型輸出
outputs = model(data)
# 計算損失
loss = criterion(outputs, target)
# 反向傳播:計算梯度
loss.backward()
# 更新參數
optimizer.step()
# 累計損失
running_loss += loss.item()
# 每100個batch打印一次信息
if batch_idx % 100 == 99:
print(f'Epoch {epoch+1}, Batch {batch_idx+1}, Loss: {running_loss/100:.4f}')
running_loss = 0.0
7. 測試模型¶
在測試集上驗證模型性能,計算測試集準確率:
model.eval() # 模型設爲評估模式(禁用Dropout等)
correct = 0
total = 0
with torch.no_grad(): # 測試時不計算梯度,節省內存
for data, target in test_loader:
outputs = model(data)
_, predicted = torch.max(outputs.data, 1) # 獲取預測類別
total += target.size(0)
correct += (predicted == target).sum().item()
print(f'Test Accuracy: {100 * correct / total:.2f}%')
8. 總結與擴展¶
通過本文,你已經完成了第一個PyTorch神經網絡模型的搭建!主要步驟包括:
- 數據加載與預處理
- 模型定義(繼承nn.Module,定義層和前向傳播)
- 損失函數和優化器選擇
- 訓練循環(前向傳播→損失計算→反向傳播→參數更新)
- 測試驗證(評估準確率)
可以嘗試的擴展:¶
- 調整隱藏層大小或層數(如增加更多隱藏層)
- 更換優化器(如Adam、RMSprop)
- 使用更復雜的數據集(如Fashion-MNIST)
- 添加Dropout防止過擬合
- 可視化訓練過程中的損失和準確率變化
PyTorch的強大之處在於它的靈活性和易用性,通過不斷實踐,你將逐步掌握構建更復雜模型的能力!