阿偶~ 2023-04-22 19:46 采纳率: 11.1%
浏览 42
已结题

mmdetection评价结果可视化

在用swin transformer目标检测官方代码训练完了,想看可视化损失函数曲线但是官方代码中的可视化工具损失函数的横坐标时是iter,这可能和他日志里面的信息有关,想询问一下有什么办法可以将横轴变成epoch吗:
1、下面是json日志文件:

img

2、官方代码可视化的损失曲线:

img


3、最后请问可以将验证集上的loss 进行可视化吗?

img

  • 写回答

2条回答 默认 最新

  • 极客智能体-在线 2023-04-22 23:41
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    可以使用一些简单的数学计算将横坐标从iter转换为epoch。首先,需要知道每个epoch包含多少个iteration。对于mmdetection ,可以在训练时记录每个epoch中的iteration数量。然后,可以计算每个iteration所在的epoch,将其作为新的横坐标来可视化损失函数曲线。

    具体的实现方法如下:

    1.在训练时记录每个epoch中的iteration数量:

    total_iters = len(data_loader) # 数据集总的迭代次数
    iter_per_epoch = total_iters // num_epochs # 每个epoch的迭代次数
    
    # 在each_iter函数中记录当前iteration的loss并更新损失函数
    def each_iter(self, runner):
        # ...
        # 计算当前iteration在当前epoch中的位置
        iter_in_epoch = self.get_iter_in_epoch(runner)
        runner.log_buffer.output['iter_in_epoch'] = iter_in_epoch
        # ...
    
    # 计算当前iteration在当前epoch中的位置
    def get_iter_in_epoch(self, runner):
        cur_iter = runner.iter
        cur_epoch = runner.epoch
        iter_per_epoch = self.train_loader.dataset.__len__() // self.cfg.runner.max_epochs
        iter_in_epoch = cur_iter % iter_per_epoch
        return iter_in_epoch
    

    2.使用新的横坐标epoch可视化损失函数曲线。具体来说,可以将记录的每个iteration的loss按照epoch进行平均并画出新的损失函数曲线。

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 读取json日志文件
    with open('log.json', 'r') as f:
        logs = json.load(f)
    
    # 获取每个iteration在当前epoch中的位置
    iters_in_epoch = [l['iter_in_epoch'] for l in logs]
    
    # 使用新的epoch作为横坐标
    epochs_list = []
    for i in range(num_epochs):
        epochs_list += [i] * iter_per_epoch
    
    # 将记录的每个iteration的loss按照epoch进行平均并画出新的损失函数曲线
    losses = np.array([l['loss'] for l in logs])
    losses_by_epoch = np.zeros(num_epochs)
    iter_num = np.zeros(num_epochs)
    for i in range(num_epochs):
        start_idx = i*iter_per_epoch
        end_idx = start_idx + iter_per_epoch
        epoch_losses = losses[start_idx:end_idx]
        losses_by_epoch[i] = np.mean(epoch_losses)
        iter_num[i] = i*iter_per_epoch
    plt.plot(iter_num, losses_by_epoch, label='Training loss')
    plt.xlabel('Epoch')
    plt.ylabel('Loss')
    plt.legend()
    plt.show()
    

    3.可视化验证集上的损失函数曲线也可以采用类似的方法,需要在验证时记录每个epoch中的validation间隔并计算每个iteration所在的epoch,将其作为新的横坐标来可视化损失函数曲线。

    # 在验证时记录每个epoch中的validation间隔
    def epoch_end(self, runner):
        #...
        self.exec_validation(runner)
        self.timer.reset()
    
        # 记录每个epoch的validation间隔
        self.interval.append(runner.log_buffer.output['time'] / self.cfg.data.test.interval)
    
    # 计算当前iteration在当前epoch中的位置
    def get_iter_in_epoch(self, runner):
        cur_iter = runner.iter
        cur_epoch = runner.epoch
        iter_per_epoch = self.train_loader.dataset.__len__() // self.cfg.runner.max_epochs
        iter_in_epoch = cur_iter % iter_per_epoch
        return iter_in_epoch
    
    # 在验证时使用新的epoch作为横坐标
    with open('log.json', 'r') as f:
        logs = json.load(f)
    
    # 获取每个iteration在当前epoch中的位置
    iters_in_epoch = [l['iter_in_epoch'] for l in logs]
    
    # 获取每个iteration在验证集上的loss
    val_losses = [l['val_loss'] for l in logs if 'val_loss' in l]
    
    # 使用新的epoch作为横坐标
    val_epochs = []
    for i, inter in enumerate(trainer.custom_hooks[1].interval):
        val_epochs += [int(np.sum(trainer.custom_hooks[1].interval[:i+1]))] * inter
    
    # 画出新的损失函数曲线
    plt.plot(val_epochs, val_losses, label='Validation loss')
    plt.xlabel('Epoch')
    plt.ylabel('Loss')
    plt.legend()
    plt.show()
    

    如果我的回答解决了您的问题,请采纳!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月24日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 stnodeeditor自定义控件
  • ¥15 SDO如何更改STM32的波特率
  • ¥15 elasticsearch
  • ¥15 uniapp的uni-datetime-picker组件在ios端不适配
  • ¥15 前端 uniapp App端在离线状态如何使用modbus 连接手机蓝牙进行读写操控机器?
  • ¥15 SQL语句根据字段自动生成行
  • ¥500 “掌声响起来”软件(不确定性人工智能)
  • ¥500 我要找大模型一体机产品手册和应用案例
  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)