基于深度学习的图像分类模型的高级代码示例,使用 PyTorch 框架实现。这个示例包含数据加载、模型定义、训练和评估的完整流程。

【python】
 import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torch.optim.lr_scheduler import StepLR

# 定义数据预处理
transform = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(10),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 加载数据集
train_dataset = torchvision.datasets.ImageFolder(
    root='path/to/train/dataset',
    transform=transform
)
val_dataset = torchvision.datasets.ImageFolder(
    root='path/to/val/dataset',
    transform=transform
)

train_loader = DataLoader(
    train_dataset,
    batch_size=32,
    shuffle=True,
    num_workers=4
)
val_loader = DataLoader(
    val_dataset,
    batch_size=32,
    shuffle=False,
    num_workers=4
)

# 定义模型
class CNNModel(nn.Module):
    def __init__(self, num_classes):
        super(CNNModel, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(64, 192, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 32 * 32, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes)
        )

    def forward(self, x):
        x = self.features(x)
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

model = CNNModel(num_classes=10)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = model.to(device)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = StepLR(optimizer, step_size=7, gamma=0.1)

# 训练函数
def train(model, device, train_loader, optimizer, criterion, epoch):
    model.train()
    train_loss = 0
    correct = 0
    total = 0
    for batch_idx, (inputs, targets) in enumerate(train_loader):
        inputs, targets = inputs.to(device), targets.to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

        train_loss += loss.item()
        _, predicted = outputs.max(1)
        total += targets.size(0)
        correct += predicted.eq(targets).sum().item()

    print(f'Epoch: {epoch} | Train Loss: {train_loss / len(train_loader):.3f} | Acc: {100. * correct / total:.3f}%')

# 验证函数
def validate(model, device, val_loader, criterion):
    model.eval()
    val_loss = 0
    correct = 0
    total = 0
    with torch.no_grad():
        for batch_idx, (inputs, targets) in enumerate(val_loader):
            inputs, targets = inputs.to(device), targets.to(device)
            outputs = model(inputs)
            loss = criterion(outputs, targets)

            val_loss += loss.item()
            _, predicted = outputs.max(1)
            total += targets.size(0)
            correct += predicted.eq(targets).sum().item()

    print(f'Validation Loss: {val_loss / len(val_loader):.3f} | Acc: {100. * correct / total:.3f}%')

# 训练和验证
for epoch in range(1, 26):
    train(model, device, train_loader, optimizer, criterion, epoch)
    validate(model, device, val_loader, criterion)
    scheduler.step()

# 保存模型
torch.save(model.state_dict(), 'model.pth')

代码说明:

1. 数据预处理和加载:

    • 使用torchvision.transforms进行图像预处理,包括调整大小、随机水平翻转、随机旋转、张量转换和归一化。

    • 使用ImageFolder加载数据集,并创建DataLoader进行批量加载。

2. 模型定义:

    • 定义了一个卷积神经网络(CNN),包含卷积层、ReLU 激活函数、最大池化层和全连接层。

    • 使用Dropout防止过拟合。

3. 训练和验证:

    • 使用交叉熵损失函数和 Adam 优化器。

    • 使用学习率调度器StepLR动态调整学习率。

    • 定义了train和validate函数分别进行训练和验证,并打印损失和准确率。

4. 模型保存:

    • 训练完成后,将模型的状态字典保存到文件中。

这个示例展示了如何使用 PyTorch 实现一个完整的图像分类流程,包括数据加载、模型定义、训练、验证和模型保存。您可以根据具体需求调整模型结构、超参数和数据预处理步骤。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐