欢迎访问宙启技术站
智能推送

使用Trainer()提升Python中的模型训练效果

发布时间:2023-12-25 01:18:52

在Python中,可以使用Trainer来提升模型的训练效果。Trainer是一个用于模型训练的高级接口,它封装了训练过程中的各种配置和功能,并提供了可视化和性能评估等功能。下面我们来了解一下如何使用Trainer提升模型的训练效果。

首先,我们需要导入相关的库和模块。在这个例子中,我们将使用torchvision中的CIFAR10数据集和ResNet模型。

import torchvision
import torchvision.transforms as transforms
import torch
import torch.nn as nn
import torch.optim as optim
from torchsummary import summary
from torchvision.models import resnet18
from torch.utils.tensorboard import SummaryWriter
from ignite.engine import Events
from ignite.metrics import Accuracy, Loss
from ignite.contrib.handlers import ProgressBar
from ignite.handlers import ModelCheckpoint
from ignite.engine.engine import Engine
from ignite.utils import convert_tensor

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

然后,我们需要定义数据的预处理方式和加载数据集。

transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomCrop(32, padding=4),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=100,
                                         shuffle=False, num_workers=2)

接下来,我们需要定义模型、损失函数和优化器。

net = resnet18(num_classes=10)
net.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)

然后,我们需要定义训练和测试的函数。

def train_step(engine, batch):
    net.train()
    optimizer.zero_grad()
    inputs, targets = convert_tensor(batch, device=device)
    outputs = net(inputs)
    loss = criterion(outputs, targets)
    loss.backward()
    optimizer.step()
    return loss.item()

def test_step(engine, batch):
    net.eval()
    with torch.no_grad():
        inputs, targets = convert_tensor(batch, device=device)
        outputs = net(inputs)
        return outputs, targets

trainer = Engine(train_step)
evaluator = Engine(test_step)

接下来,我们可以利用Trainer的功能进行模型训练,包括可视化、性能评估和模型保存等。

writer = SummaryWriter(log_dir='logs')

@trainer.on(Events.STARTED)
def initialize(engine):
    summary(net, (3, 32, 32))
    pbar = ProgressBar()
    pbar.attach(engine, ['loss'])

@trainer.on(Events.EPOCH_COMPLETED)
def log_training_results(engine):
    evaluator.run(trainloader)
    train_accuracy = Accuracy().compute(evaluator.state.output[0], evaluator.state.output[1])
    train_loss = Loss(criterion).compute(evaluator.state.output[0], evaluator.state.output[1])
    evaluator.run(testloader)
    test_accuracy = Accuracy().compute(evaluator.state.output[0], evaluator.state.output[1])
    test_loss = Loss(criterion).compute(evaluator.state.output[0], evaluator.state.output[1])
    writer.add_scalar('accuracy/train', train_accuracy, engine.state.epoch)
    writer.add_scalar('accuracy/test', test_accuracy, engine.state.epoch)
    writer.add_scalar('loss/train', train_loss, engine.state.epoch)
    writer.add_scalar('loss/test', test_loss, engine.state.epoch)
    print(f"Epoch {engine.state.epoch} - Train Loss: {train_loss:.4f} - Train Accuracy: {train_accuracy:.4f} - Test Loss: {test_loss:.4f} - Test Accuracy: {test_accuracy:.4f}")

trainer.run(trainloader, max_epochs=10)

model_filename = 'resnet18_cifar10.pth'
checkpoint = ModelCheckpoint(model_filename, 'accuracy', n_saved=1, require_empty=False)
trainer.add_event_handler(Events.EPOCH_COMPLETED, checkpoint, {'model': net})

在训练过程中,Trainer会自动计算损失和准确率,并将结果记录在SummaryWriter中,我们可以在TensorBoard中查看。

tensorboard --logdir=logs

此外,Trainer还可以自动保存模型,并根据训练的指标选择 的模型。

通过使用Trainer,我们可以简化模型训练流程,并提供了一系列有用的功能来提升模型的训练效果。

以上是使用Trainer()提升Python中的模型训练效果的示例代码,希望对你有帮助!