Task:
1.預訓練的概念
2.常見的分類預訓練模型
3.圖像預訓練模型的發展史
4.預訓練的策略
5.預訓練代碼實戰:resnet18
1. 預訓練的概念
預訓練(Pre-training)是指在大規模數據集上,先訓練模型以學習通用的特征表示,然后將其用于特定任務的微調。這種方法可以顯著提高模型在目標任務上的性能,減少訓練時間和所需數據量。
核心思想:
- 在大規模、通用的數據(如ImageNet)上訓練模型,學習豐富的特征表示。
- 將預訓練模型應用于任務特定的細調(fine-tuning),使模型適應目標任務。
優勢:
- 提升模型性能
- 縮短訓練時間
- 需要較少的標注數據
- 提供良好的特征初始化
2. 常見的分類預訓練模型
常見的分類預訓練模型主要包括:
模型名稱 | 提出年份 | 特色與應用 |
---|---|---|
AlexNet | 2012 | 標志深度學習重返計算機視覺的起點 |
VGG(VGG16/19) | 2014 | 簡潔結構,深層網絡,廣泛用于特征提取 |
ResNet(Residual Network) | 2015 | 引入殘差連接,解決深層網絡退化問題 |
Inception(GoogLeNet) | 2014 | 多尺度特征提取,復雜模塊設計 |
DenseNet | 2017 | 密集連接,加深網絡而不增加參數 |
MobileNet | 2017 | 輕量級模型,適合移動端應用 |
EfficientNet | 2019 | 根據模型寬度、深度和分辨率優化設計 |
這些模型在ImageNet等大規模數據集上預訓練,成為計算機視覺各種任務的基礎。
3. 圖像預訓練模型的發展史
-
AlexNet (2012)
首次使用深度卷積神經網絡大規模應用于ImageNet,顯著提升分類效果。 -
VGG系列 (2014)
簡單堆疊卷積和池化層,深度逐步增加,提高表現。 -
GoogLeNet/Inception (2014)
引入Inception模塊,進行多尺度特征提取,有效提升效率。 -
ResNet (2015)
通過殘差連接解決深層網絡的退化問題,使網絡深度大幅提升(如ResNet-50,ResNet-101等)。 -
DenseNet (2017)
特色是密集連接,增強特征傳播,改善梯度流。 -
MobileNet, EfficientNet (2017-2019)
追求輕量級和高效率,適應移動端和資源有限場景。
總的趨勢:
- 從淺層逐步向深層網絡發展
- 引入殘差、密集連接等結構解決深層網絡訓練難題
- 注重模型效率與性能平衡
4. 預訓練的策略
常用的預訓練策略包括:
1. 直接使用預訓練模型進行微調(Fine-tuning)
- 加載預訓練權重
- 替換最后的分類層以適應新任務(如類別數不同)
- 選擇性凍結部分層(如只訓練最后幾層)或全部訓練
2. 特征提取(Feature Extraction)
- 使用預訓練模型的固定特征提取器,從中提取特征
- 在這些特征基礎上訓練簡單的分類器(如SVM或線性層)
3. 逐層逐步微調(Layer-wise Fine-tuning)
- 先凍結底層特征層,只訓練高層
- 再逐步解凍低層,進行全層微調
4. 遷移學習(Transfer Learning)
- 利用預訓練模型遷移到相似領域任務中
- 通過微調適應不同數據分布和任務需求
5. 預訓練代碼實戰:ResNet18
以下是基于PyTorch框架的ResNet18預訓練模型加載和微調的示例代碼:
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader# 1. 加載預訓練ResNet18模型
model = models.resnet18(pretrained=True)# 2. 替換分類層以適應新任務(比如有10個類別)
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)# 3. 凍結前面層,只訓練最后的全連接層(可選)
for param in model.parameters():param.requires_grad = False # 凍結所有參數# 只訓練最后一層參數
for param in model.fc.parameters():param.requires_grad = True# 4. 定義數據變換
transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),
])# 5. 加載數據集
train_dataset = ImageFolder('path_to_train_data', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)val_dataset = ImageFolder('path_to_val_data', transform=transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)# 6. 設置優化器(只優化可訓練參數)
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)
criterion = nn.CrossEntropyLoss()# 7. 訓練環節
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)for epoch in range(10):model.train()total_loss = 0for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {total_loss/len(train_loader):.4f}")# 8. 評估
model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in val_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, predicted = torch.max(outputs, 1)correct += (predicted == labels).sum().item()total += labels.size(0)
print(f'Validation Accuracy: {100 * correct / total:.2f}%')
總結
- 預訓練是一種利用大規模數據學習通用特征,從而在目標任務中快速獲得優秀表現的技術。
- 常用的分類預訓練模型包括ResNet、VGG、Inception等,發展經歷了從淺層到深層、從視覺到效率的不斷演變。
- 預訓練策略多樣,適應不同場景,微調與特征提取是常用手段。
- 實戰中,可以利用PyTorch提供的模型接口快速加載預訓練模型,并進行微調以滿足具體需求。