解决BUG:RuntimeError: median cannot be called with empty tensor

在DETR目标检测模型的训练过程中,使用metic_logger.log_every()记录日志时遇到错误,原因是未正确使用metric_logger.update()更新添加的度量。解决方案是确保在log_every()后更新所有添加的超参数,或避免使用add_meter()。示例代码展示了如何更新class_error,lr和grad_norm等参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间:2023年1月9日

一.问题描述

在做目标检测时,以DETR模型为例,在加载数据集时会用到metic_logger.log_every() 函数,来记录训练时间、损失大小等日志信息,代码段如图所示:

 # 节选自deformable_detr/engine.py/train_one_epoch()
 for _ in metric_logger.log_every(range(len(data_loader)), print_freq, header):
        outputs = model(samples)
        loss_dict = criterion(outputs, targets)

自己重构代码时,出现了一个关于metic_logger的BUG:

Traceback (most recent call last):
  File "", line 199, in <module>
    for _ in metric_logger.log_every(range(len(data_loader_train)), print_freq, header):
  File "/Deformable_DETR/util/misc.py", line 272, in log_every
    meters=str(self),
  File "/Deformable_DETR/util/misc.py", line 222, in __str__
    "{}: {}".format(name, str(meter))
  File "/Deformable_DETR/util/misc.py", line 121, in __str__
    median=self.median,
  File "/Deformable_DETR/util/misc.py", line 96, in median
    return d.median().item()
RuntimeError: median cannot be called with empty tensor

Process finished with exit code 1

二、原因及解决方法

解决方法:
如果在metic_logger.log_every() 函数前面调用了metric_logger.add_meter()函数,那么就要在metic_logger.log_every() 函数后面用metric_logger.update()及时更新add_meter()中声明的超参数,每一个超参数都要更新。
或者直接不用metric_logger.add_meter()。
伪代码示例说明:

metric_logger = utils.MetricLogger(delimiter="  ")
metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value:.6f}'))
metric_logger.add_meter('class_error', utils.SmoothedValue(window_size=1, fmt='{value:.2f}'))
metric_logger.add_meter('grad_norm', utils.SmoothedValue(window_size=1, fmt='{value:.2f}'))
for _ in metric_logger.log_every(range(len(data_loader)), print_freq, header):
	metric_logger.update(class_error=loss_dict_reduced['class_error'])
    metric_logger.update(lr=optimizer.param_groups[0]["lr"])
    metric_logger.update(grad_norm=grad_total_norm)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值