在ResNet中進行遷移學習通常涉及以下關鍵步驟:
選擇預訓練模型:選擇一個在大規模數據集(如ImageNet)上預訓練的ResNet模型。這些模型已經學習到了豐富的特征表示,適用于多種計算機視覺任務。
準備目標數據集:根據你的具體任務,準備相應的目標數據集。這可能涉及數據清洗、標注等步驟。
修改網絡結構:根據需要,修改預訓練模型的全連接層,以適應新的分類任務。例如,如果你有10個類別,你需要將全連接層的輸出大小修改為10。
凍結部分層:通常,我們會凍結預訓練模型的大部分層,只對最后幾層(通常是全連接層)進行微調。這樣可以加快訓練速度,同時利用預訓練模型的特征提取能力。
微調模型:使用目標數據集對模型進行微調。這包括定義損失函數、優化器,并編寫訓練循環。
評估模型:在驗證集上評估模型的性能,根據需要調整超參數。
以下是一個使用PyTorch在ResNet18上進行遷移學習的簡單示例代碼:
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.models as models
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 加載數據集
transform = transforms.Compose([transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)
# 定義模型,加載預訓練參數
model = models.resnet18(pretrained=True)
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10) # 修改全連接層以適應新的分類任務
# 定義損失函數和優化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# 訓練模型
def train(model, train_loader, criterion, optimizer):
model.train()
for inputs, labels in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 測試模型
def test(model, test_loader, criterion):
model.eval()
with torch.no_grad():
total_loss = 0.0
total_corrects = 0
for inputs, labels in test_loader:
outputs = model(inputs)
loss = criterion(outputs, labels)
_, preds = torch.max(outputs, 1)
total_loss += loss.item() * inputs.size(0)
total_corrects += torch.sum(preds == labels.data)
avg_loss = total_loss / len(test_loader.dataset)
accuracy = float(total_corrects) / len(test_loader.dataset)
return avg_loss, accuracy
# 訓練和測試模型
num_epochs = 10
for epoch in range(num_epochs):
print('Epoch {}/{}'.format(epoch + 1, num_epochs))
train(model, train_loader, criterion, optimizer)
test_loss, test_acc = test(model, test_loader, criterion)
print('Test loss: {:.4f}, Test acc: {:.4f}'.format(test_loss, test_acc))
這個示例展示了如何在ResNet18上進行遷移學習,包括數據加載、模型定義、損失函數和優化器的選擇、訓練和測試過程。通過這種方式,你可以利用預訓練的ResNet模型的強大特征提取能力,快速適應新的分類任務。