在用swin transformer目标检测官方代码训练完了,想看可视化损失函数曲线但是官方代码中的可视化工具损失函数的横坐标时是iter,这可能和他日志里面的信息有关,想询问一下有什么办法可以将横轴变成epoch吗:
1、下面是json日志文件:
2、官方代码可视化的损失曲线:
3、最后请问可以将验证集上的loss 进行可视化吗?
在用swin transformer目标检测官方代码训练完了,想看可视化损失函数曲线但是官方代码中的可视化工具损失函数的横坐标时是iter,这可能和他日志里面的信息有关,想询问一下有什么办法可以将横轴变成epoch吗:
1、下面是json日志文件:
2、官方代码可视化的损失曲线:
以下答案由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()
如果我的回答解决了您的问题,请采纳!