本文將通過代碼實戰,詳細講解如何使用?PyTorch?和?VGG11?模型在?Fashion-MNIST?數據集上進行圖像分類任務。代碼包含數據預處理、模型定義、訓練與評估全流程,并附上訓練結果的可視化圖表。所有代碼可直接復現,適合深度學習初學者和進階開發者參考。
1. 環境準備
確保已安裝以下庫:
pip install torch torchvision d2l
2. 代碼實現
2.1 導入依賴庫
from d2l import torch as d2l
from torchvision import models, transforms
import torch
2.2 數據預處理
由于VGG11默認接受RGB三通道輸入,需將Fashion-MNIST的灰度圖轉換為3通道:
# 定義數據預處理流程
transform = transforms.Compose([transforms.Resize(224), # 調整圖像尺寸為224x224transforms.Grayscale(num_output_channels=3), # 單通道轉三通道transforms.ToTensor() # 轉為Tensor格式
])
2.3 加載數據集
# 加載Fashion-MNIST數據集并應用預處理
batch_size = 64 * 3 # 增大批大小以利用GPU并行計算
train_data, test_data = d2l.load_data_fashion_mnist(batch_size, resize=224)# 替換原始數據集的數據增強方法
train_data.dataset.transform = transform
test_data.dataset.transform = transform
2.4 定義模型
使用PyTorch內置的VGG11模型(從頭訓練,不使用預訓練權重):
# 初始化VGG11模型(輸入通道為3,輸出類別為10)
net = models.vgg11(pretrained=False, num_classes=10)
2.5 模型訓練
調用D2L庫的封裝函數進行訓練(支持GPU加速):
# 設置超參數并啟動訓練
num_epochs = 10
lr = 0.01
device = d2l.try_gpu() # 自動檢測GPU# 開始訓練
d2l.train_ch6(net, train_data, test_data, num_epochs, lr, device)
3. 訓練結果分析
下圖為訓練過程中的損失和準確率變化曲線:
關鍵指標
Epoch | Train Loss | Train Acc | Test Acc | Speed (examples/sec) |
---|---|---|---|---|
1 | 0.85 | 70.2% | 78.5% | 112.3 |
3 | 0.312 | 88.6% | 88.1% | 117.7 |
5 | 0.32 | 87.6% | 84.3% | 118.5 |
10 | 0.21 | 91.8% | 85.7% | 119.0 |
-
訓練損失(Train Loss):隨著訓練輪次增加,損失快速下降并趨于穩定。例如,第3輪時損失降至?0.312,表明模型快速收斂。
-
訓練準確率(Train Acc):第3輪時達到?88.6%,說明模型對訓練數據的學習效果顯著。
-
測試準確率(Test Acc):第3輪測試準確率?88.1%,與訓練準確率接近,表明模型泛化能力優秀,未出現明顯過擬合。
-
訓練速度:在?
cuda:0
?設備上達到?117.7 examples/sec,充分利用GPU加速,適合大規模數據訓練。
4. 完整代碼?
from d2l import torch as d2l
from torchvision import models, transforms
import torch# 數據預處理
transform = transforms.Compose([transforms.Resize(224),transforms.Grayscale(num_output_channels=3),transforms.ToTensor()
])# 加載數據集
batch_size = 64 * 3
train_data, test_data = d2l.load_data_fashion_mnist(batch_size, resize=224)
train_data.dataset.transform = transform
test_data.dataset.transform = transform# 定義模型
net = models.vgg11(pretrained=False, num_classes=10)# 訓練配置
num_epochs = 10
lr = 0.01
device = d2l.try_gpu()# 啟動訓練
d2l.train_ch6(net, train_data, test_data, num_epochs, lr, device)
5. 常見問題
Q1:為什么將灰度圖轉為三通道?
VGG系列模型設計時默認接受RGB輸入(3通道)。盡管Fashion-MNIST為單通道,需通過復制通道數適配模型。
Q2:如何進一步提升準確率?
-
增加訓練輪次(如?
num_epochs=20
)。 -
使用更復雜模型(如VGG16、ResNet)。
-
添加數據增強(隨機旋轉、亮度調整)。
Q3:訓練時顯存不足怎么辦?
-
減小?
batch_size
(如設為64)。 -
啟用混合精度訓練(添加?
torch.cuda.amp
)。
6. 總結
本文使用PyTorch實現了VGG11模型在Fashion-MNIST數據集上的分類任務,最終測試準確率達?85.7%,并在第3輪即達到?88.1%?的測試準確率,訓練速度高達?117.7 examples/sec,展現了優秀的性能與效率。通過代碼解析與結果分析,讀者可快速掌握從數據預處理到模型訓練的完整流程,并根據實際需求調整模型或超參數進一步優化性能。