【无标题】基于深度学习的图像分类模型的高级代码示例
这个示例展示了如何使用 PyTorch 实现一个完整的图像分类流程,包括数据加载、模型定义、训练、验证和模型保存。• 使用torchvision.transforms进行图像预处理,包括调整大小、随机水平翻转、随机旋转、张量转换和归一化。这个示例包含数据加载、模型定义、训练和评估的完整流程。• 定义了一个卷积神经网络(CNN),包含卷积层、ReLU 激活函数、最大池化层和全连接层。• 定义了tra
基于深度学习的图像分类模型的高级代码示例,使用 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 实现一个完整的图像分类流程,包括数据加载、模型定义、训练、验证和模型保存。您可以根据具体需求调整模型结构、超参数和数据预处理步骤。
更多推荐
所有评论(0)