在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来查看损失函数和准确率的变化,以及其他有关模型的统计信息。
