在Ubuntu環境下進行PyTorch遷移學習的實踐涉及多個步驟,包括環境配置、數據加載、模型定義、訓練和測試等。以下是一個詳細的指南:
ubuntu-drivers devices命令查看推薦的驅動型號,并使用sudo ubuntu-drivers autoinstall進行安裝。torchvision.datasets加載CIFAR-10數據集或其他自定義數據集,并進行必要的預處理。torchvision.models加載預訓練模型(如ResNet18),并修改最后一層以適應新的任務需求。以下是一個簡單的PyTorch遷移學習示例代碼:
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))
請注意,為了獲得更好的性能,您可能需要調整超參數、使用數據增強技術或嘗試不同的模型架構。