使用PyTorch框架,以及使用数据增强、迁移学习、过拟合分析等技术完成图像分类任务并生成分类好的图像的完整代码
时间: 2025-06-15 14:19:14 浏览: 11
在PyTorch中,我们通常会按照以下步骤来完成一个基于图像的分类任务,包括数据增强、迁移学习和过拟合分析:
首先,安装必要的库:
```bash
pip install torch torchvision numpy pandas
```
1. 导入所需的模块:
```python
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset
from torchvision import transforms, datasets, models
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
```
2. 数据预处理(包括数据增强):
```python
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
}
# 加载数据集
dataset = datasets.ImageFolder(root='path/to/dataset', transform=data_transforms['train'])
train_loader = DataLoader(dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(dataset, batch_size=32, shuffle=False)
```
3. 迁移学习(例如使用VGG16预训练模型):
```python
model = models.vgg16(pretrained=True)
num_features = model.classifier[6].in_features
model.classifier[6] = nn.Linear(num_features, num_classes) # 根据你的类别数替换num_classes
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
```
4. 训练模型并检查过拟合:
```python
def train_model(model, epochs, device):
for epoch in range(epochs):
running_loss = 0.0
for inputs, labels in train_loader:
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item() * inputs.size(0)
epoch_loss = running_loss / len(train_dataset)
print(f"Epoch {epoch+1}/{epochs}, Loss: {epoch_loss}")
# 过拟合分析可以使用验证集上的损失趋势,如果随着训练轮数增加,验证集损失持续上升,则可能存在过拟合
val_loss = validate(model, val_loader, criterion, device)
return model, epoch_loss, val_loss
model, _, _ = train_model(model, 10, device)
```
5. 保存模型并生成预测结果:
```python
torch.save(model.state_dict(), 'model.pth')
# 预测新图片
def predict_image(image_path, model, device):
image = Image.open(image_path).convert('RGB')
preprocess = data_transforms['val']
img_tensor = preprocess(image).unsqueeze(0)
img_tensor = img_tensor.to(device)
with torch.no_grad():
output = model(img_tensor)
predicted_class = output.argmax(dim=1).item()
probabilities = torch.softmax(output, dim=1)[0]
return predicted_class, probabilities.tolist()
predicted_class, probabilities = predict_image('path/to/test/image.jpg', model, device)
```
阅读全文