从训练打印的log中获取loss等参数绘制曲线

该代码段展示了如何从训练日志文件中读取数据,特别是关注每个epoch的loss、平均loss和学习率。它使用matplotlib库来绘制这些值随训练进程的变化,包括训练loss、学习率以及对象损失、类别损失和边界框损失的曲线图。
摘要由CSDN通过智能技术生成

在训练中加入log,记录每轮epoch的loss值。

# 打印训练log
log_file.write("Epoch %d/%d | training loss = %.3f, avg_loss = %.3f, lr= %f\n" %
                       (epoch, opts.epoch, loss.item(), losssum / num_train,
                        optimizer.state_dict()['param_groups'][0]['lr']))
log_file.write("TrainLoss:obj loss = %.2f, cls loss = %.2f, bbox loss = %.2f\n" %
                       (conf_loss.item(), cls_loss.item(), bbox_loss.item()))
# 打印的示例如下:
2023-03-17 11:42:04
======================training epoch 1======================
Epoch 1/300 | training loss = 4.946, avg_loss = 0.118, lr= 0.000100
TrainLoss:obj loss = 175.42, cls loss = 1121.56, bbox loss = 345.44
Training consumes 467.38 second

导入训练的打印的log,通过逐行读取并筛选出epoch与loss。

import matplotlib.pyplot as plt
import numpy as np


class curve():
    def __init__(self, path='./log.txt'):
        self.train_losses = []
        self.avg_losses = []
        self.obj_losses = []
        self.cls_losses = []
        self.bbox_losses = []
        self.lrs = []
        self.filename = path
        self.epoch = 0

    def dataload(self):
        with open(self.filename, 'r') as f:
            lines = f.readlines()
            for line in lines:
                if line[0] == 'E':
                    a = line.split('/')[0]
                    epoch = ''.join([x for x in a if x.isdigit()])  # 判断是否为数字
                    self.epoch = int(epoch)
                    train_loss = line.split('=')[1].split(',')[0]
                    train_loss = float(train_loss)
                    self.train_losses.append(train_loss)
                    avg_loss = line.split('=')[2].split(',')[0]
                    self.avg_losses.append(avg_loss)
                    lr = line.split('=')[3]
                    lr = float(lr)
                    self.lrs.append(lr)
                    a = line[0:9]
                elif line[0:9] == 'TrainLoss':
                    objloss = line.split('=')[1].split(',')[0]
                    self.obj_losses.append(objloss)
                    classloss = line.split('=')[2].split(',')[0]
                    self.cls_losses.append(classloss)
                    bboxloss = float(line.split('=')[3].split(',')[0])
                    self.bbox_losses.append(bboxloss)

    def plot(self, title, data, ylim, color):
        epoch = self.epoch
        plt.xlim(1, epoch)
        if ylim:
            plt.ylim(ylim)
        plt.plot(np.arange(epoch), data, color=color)
        plt.xlabel('epoches')
        plt.title(title)
        plt.show()

    def show(self, tl, lr, obj, cls, bbox):
        if tl:
            title = 'train loss'
            self.plot(title, data=self.train_losses, ylim=None, color='red')
        if lr:
            title = 'learning rate'
            self.plot(title, data=self.lrs, ylim=(0.0001, 0.01), color='blue')
        if obj:
            title = 'object loss'
            self.plot(title, data=self.obj_losses, ylim=None, color='red')
        if cls:
            title = 'class loss'
            self.plot(title, data=self.cls_losses, ylim=None, color='red')
        if bbox:
            title = 'boundbox loss'
            self.plot(title,data=self.bbox_losses, ylim=None, color='red')


c = curve()
c.dataload()
c.show(tl=True, lr=True, obj=False, cls=False, bbox=True)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch训练模型时,可以使用TensorBoard或Matplotlib来绘制损失曲线和准确率曲线。 ## 使用TensorBoard绘制曲线 TensorBoard是一个用于可视化机器学习实验结果的工具,可以用来展示训练过程的损失曲线和准确率曲线。以下是一个简单的示例代码,展示如何在PyTorch使用TensorBoard来记录和可视化训练过程的损失和准确率: ```python from torch.utils.tensorboard import SummaryWriter # 创建一个SummaryWriter对象,参数log_dir指定TensorBoard日志的存储路径 writer = SummaryWriter(log_dir='logs') for epoch in range(num_epochs): # ... # 记录训练损失和准确率 writer.add_scalar('Train/Loss', train_loss, global_step=epoch) writer.add_scalar('Train/Accuracy', train_acc, global_step=epoch) # 记录验证损失和准确率 writer.add_scalar('Val/Loss', val_loss, global_step=epoch) writer.add_scalar('Val/Accuracy', val_acc, global_step=epoch) # 关闭SummaryWriter对象 writer.close() ``` 在上面的示例代码,首先需要创建一个`SummaryWriter`对象,并指定TensorBoard日志的存储路径。然后在每个epoch结束时,使用`add_scalar`方法记录训练损失、训练准确率、验证损失和验证准确率。最后,在训练过程结束时,需要调用`close`方法关闭`SummaryWriter`对象。 ## 使用Matplotlib绘制曲线 除了使用TensorBoard,还可以使用Matplotlib来绘制损失曲线和准确率曲线。以下是一个简单的示例代码,展示如何在PyTorch使用Matplotlib来绘制损失曲线和准确率曲线: ```python import matplotlib.pyplot as plt train_losses = [] train_accs = [] val_losses = [] val_accs = [] for epoch in range(num_epochs): # ... # 记录训练损失和准确率 train_losses.append(train_loss) train_accs.append(train_acc) # 记录验证损失和准确率 val_losses.append(val_loss) val_accs.append(val_acc) # 绘制训练和验证损失曲线 plt.plot(train_losses, label='Train Loss') plt.plot(val_losses, label='Val Loss') plt.legend() plt.xlabel('Epoch') plt.ylabel('Loss') plt.show() # 绘制训练和验证准确率曲线 plt.plot(train_accs, label='Train Acc') plt.plot(val_accs, label='Val Acc') plt.legend() plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.show() ``` 在上面的示例代码,首先定义了四个空列表来存储训练和验证过程的损失和准确率。在每个epoch结束时,将训练和验证的损失和准确率记录到对应的列表。最后,使用Matplotlib库绘制训练和验证损失曲线训练和验证准确率曲线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值