模型的训练
发布日期:2021-05-14 15:20:26 浏览次数:19 分类:精选文章

本文共 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()

以上内容可以根据具体项目需求进行修改和调整,以实现更优的训练效果。

上一篇:模型的预测
下一篇:读取图像和label,并转Tensor

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月07日 20时49分12秒