
本文共 3511 字,大约阅读时间需要 11 分钟。
模型的训练过程
步骤1:导入必要的库和工具包 在项目开始之前,需要先准备好所有需要的工具包和库。以下是常用的工具包和库:
import numpy as np import torch import torch.nn as nn from torch.utils.data import DataLoader import torchvision.transforms as transforms import torch.optim as optim from matplotlib import pyplot as plt from major_utils import set_seed from major_config import * from major_dataset import LoadDataset
步骤2:参数设置 参数设置是模型训练的关键一步,确保所有超参数都被正确配置。常用的参数包括: MAX_EPOCH = major_config.num_epoch BATCH_SIZE = major_config.batchsize LR = major_config.learning_rate LOG_INTERVAL = 10 VAL_INTERVAL = 1
步骤3:数据预处理 数据预处理是保证模型训练效果的重要环节。训练集和验证集需要经过标准化处理。代码如下:
_train_transform = transforms.Compose([ transforms.Resize((32, 32)), transforms.ToTensor(), transforms.Normalize(mean=major_config.norm_mean, std=major_config.norm_std) ])
_valid_transform = transforms.Compose([ transforms.Resize((32, 32)), transforms.ToTensor(), transforms.Normalize(mean=major_config.norm_mean, std=major_config.norm_std) ])
使用这些预处理器对训练数据集和验证数据集进行初始化,避免数据尺寸的不一致。
_train_data = LoadDataset(data_dir=major_config.train_image, transform=_train_transform) _train_loader = DataLoader(dataset=_train_data, batch_size=BATCH_SIZE, shuffle=True)
valid_data = LoadDataset(data_dir=major_config.val_image, transform=_valid_transform) valid_loader = DataLoader(dataset=valid_data, batch_size=BATCH_SIZE)
步骤4:模型定义 为实现目标,选择合适的模型结构。以下是选择SE-ResNet50模型并初始化:
net = major_config.model
如果需要自定义模型结构,可在此处定义
net = se_resnet50(num_classes=5, pretrained=True)
步骤5:损失函数和优化器 选择合适的损失函数和优化器。通常,交叉熵损失函数和随机梯度下降(SGD)组合效果较好。
criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=LR, momentum=0.9) scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
步骤6:模型训练 模型训练是核心环节,包含前向传播、后向传播和学习率调度。具体实现如下: 每个epoch分为两个阶段:训练阶段和验证阶段。
for epoch in range(MAX_EPOCH): net.train() running_loss = 0.0 correct = 0 total = 0 for i, data in enumerate(_train_loader): inputs, labels = data outputs = net(inputs) optimizer.zero_grad() loss = criterion(outputs, labels) loss.backward() optimizer.step() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() running_loss += loss.item() train_curve.append(running_loss) if (i+1) % LOG_INTERVAL == 0: avg_loss = running_loss / LOG_INTERVAL print(f"Training: Epoch[{epoch+1:03d}/{MAX_EPOCH:03d}] Iteration[{i+1:03d}/{len(_train_loader):03d}] Loss: {avg_loss:.4f} Acc: {correct/total:.2%}") # 如果需要可视化,可以在此处添加日志记录 scheduler.step()
if (epoch+1) % VAL_INTERVAL == 0: net.eval() val_loss = 0.0 val_correct = 0 with torch.no_grad(): for j, data in enumerate(valid_loader): inputs, labels = data outputs = net(inputs) loss = criterion(outputs, labels) _, predicted = torch.max(outputs.data, 1) val_loss += loss.item() val_correct += (predicted == labels).sum().item() avg_val_loss = val_loss / len(valid_loader) print(f"Valid: Epoch[{epoch+1:03d}/{MAX_EPOCH:03d}] Loss: {avg_val_loss:.4f} Acc: {val_correct/len(valid_data):.2%}") valid_curve.append(avg_val_loss)
步骤7:训练结果可视化 为了查看训练过程中的损失曲线和验证结果,可以将数据可视化:
train_x = range(len(train_curve)) train_y = train_curve train_iters = len(_train_loader)
valid_x = np.arange(1, len(valid_curve)+1) * train_iters / VAL_INTERVAL valid_y = valid_curve
plt.plot(train_x, train_y, label='Train') plt.plot(valid_x, valid_y, label='Valid') plt.legend(loc='upper right') plt.xlabel('Iteration') plt.ylabel('Loss Value') plt.show()
以上内容可以根据具体项目需求进行修改和调整,以实现更优的训练效果。
发表评论
最新留言
关于作者
