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

在Python中通过tensorboard_logger实现模型的损失函数变化曲线可视化

发布时间:2024-01-09 09:33:06

在Python中,我们可以使用tensorboard_logger库来实现模型的损失函数变化曲线可视化。Tensorboard是一个非常强大的网络模型的可视化工具,能够帮助我们更好地理解和分析我们的模型。

首先,我们需要安装tensorboard_logger库。可以使用以下命令来安装:

pip install tensorboard_logger

接下来,我们可以使用以下示例代码来实现模型的损失函数变化曲线可视化:

import tensorboard_logger as tb_logger
import torch
from torch import nn, optim
from torch.utils.data import DataLoader
from torchvision import datasets, models, transforms

# 设置tensorboard的日志目录
log_dir = './logs'

# 定义训练数据的预处理操作,比如图像的大小变换、归一化等
data_transforms = {
    'train': transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

# 加载训练数据集和验证数据集
image_datasets = {x: datasets.ImageFolder('./data/' + x, data_transforms[x])
                  for x in ['train', 'val']}
dataloaders = {x: DataLoader(image_datasets[x], batch_size=4, shuffle=True)
               for x in ['train', 'val']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
class_names = image_datasets['train'].classes

# 定义模型
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 2)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001)

# 定义学习率衰减策略
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)

# 设置tensorboard的logger
logger = tb_logger.Logger(logdir=log_dir, flush_secs=2)

# 训练模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
best_model_wts = model.state_dict()
best_acc = 0.0

for epoch in range(10):
    for phase in ['train', 'val']:
        if phase == 'train':
            model.train()
        else:
            model.eval()
            
        running_loss = 0.0
        running_corrects = 0

        for inputs, labels in dataloaders[phase]:
            inputs = inputs.to(device)
            labels = labels.to(device)

            optimizer.zero_grad()

            with torch.set_grad_enabled(phase == 'train'):
                outputs = model(inputs)
                _, preds = torch.max(outputs, 1)
                loss = criterion(outputs, labels)

                if phase == 'train':
                    loss.backward()
                    optimizer.step()

            running_loss += loss.item() * inputs.size(0)
            running_corrects += torch.sum(preds == labels.data)

        if phase == 'train':
            scheduler.step()

        epoch_loss = running_loss / dataset_sizes[phase]
        epoch_acc = running_corrects.double() / dataset_sizes[phase]

        logger.log_value(phase + '.loss', epoch_loss, epoch)
        logger.log_value(phase + '.accuracy', epoch_acc, epoch)

        if phase == 'val' and epoch_acc > best_acc:
            best_acc = epoch_acc
            best_model_wts = model.state_dict()

# 保存      模型的参数
torch.save(best_model_wts, './best_model.pt')

以上代码中,我们首先导入了需要的库,并设置tensorboard的日志目录。然后定义了数据预处理操作,加载训练和验证数据集。

接着定义了模型,并将损失函数和优化器实例化。我们还使用了学习率衰减策略。

然后我们设置了tensorboard的logger,指定了日志目录。

在训练模型时,我们首先将模型和数据加载到设备上,并将模型设置为训练模式或评估模式。然后使用for循环遍历数据集,计算模型的输出并计算损失函数。最后根据训练阶段和验证阶段计算损失和准确率,并将它们记录在tensorboard的日志中。

在每个epoch结束后,我们会检查验证阶段的准确率是否达到了新的 值,并保存 模型的参数。

通过以上代码,我们就可以使用tensorboard_logger来实现模型的损失函数变化曲线可视化了。可以通过tensorboard来查看损失函数和准确率的变化,以及其他有关模型的统计信息。