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的強大之處在於它的靈活性和易用性,通過不斷實踐,你將逐步掌握構建更復雜模型的能力!

小夜