metric_logger小解

今天看见这个一个函数metric_logger,通过搜索资料发现他是utils中的一个MetricLogger类,可称它为度量记录器,因为这种都是自定义的,那我只说说我遇见的这个趴。

我们先来看看他初始化里有什么。

 def __init__(self, delimiter="\t"):
        self.meters = defaultdict(SmoothedValue)
        self.delimiter = delimiter

meters 是用于产生一个带有默认值的dict
delimiter此时还未被定义
接着往下看,

log_msg = self.delimiter.join([
                header,
                '[{0' + space_fmt + '}/{1}]',
                'eta: {eta}',
                '{meters}',
                'time: {time}',
                'data: {data}',
                'max mem: {memory:.0f}'
            ])

header可以不用管,这是一个头部,默认可以为空(加的话就是令其为header = 'Epoch: [{}]'.format(epoch)一般我是这样做的,好观察)
通过join函数连接起来,也就是所谓的各项指标,后续代码总结起来就是通过更新各项运算将结果打印。

def log_every(self, iterable, print_freq, header=None):
        i = 0
        if not header:
            header = ''
        start_time = time.time()
        end = time.time()
        iter_time = SmoothedValue(fmt='{avg:.4f}')
        data_time = SmoothedValue(fmt='{avg:.4f}')
        space_fmt = ':' + str(len(str(len(iterable)))) + 'd'
        if torch.cuda.is_available():#判断GPU可用
            log_msg = self.delimiter.join([
                header,
                '[{0' + space_fmt + '}/{1}]',
                'eta: {eta}',
                '{meters}',
                'time: {time}',
                'data: {data}',
                'max mem: {memory:.0f}'
            ])
        else:
            log_msg = self.delimiter.join([
                header,
                '[{0' + space_fmt + '}/{1}]',
                'eta: {eta}',
                '{meters}',
                'time: {time}',
                'data: {data}'
            ])
        MB = 1024.0 * 1024.0
        for obj in iterable:
            data_time.update(time.time() - end)
            yield obj
            iter_time.update(time.time() - end)
            if i % print_freq == 0 or i == len(iterable) - 1:
                eta_seconds = iter_time.global_avg * (len(iterable) - i)
                eta_string = str(datetime.timedelta(seconds=int(eta_seconds)))
                if torch.cuda.is_available():
                    print(log_msg.format(
                        i, len(iterable), eta=eta_string,
                        meters=str(self),
                        time=str(iter_time), data=str(data_time),
                        memory=torch.cuda.max_memory_allocated() / MB))
                else:
                    print(log_msg.format(
                        i, len(iterable), eta=eta_string,
                        meters=str(self),
                        time=str(iter_time), data=str(data_time)))
            i += 1
            end = time.time()
        total_time = time.time() - start_time
        total_time_str = str(datetime.timedelta(seconds=int(total_time)))
        print('{} Total time: {} ({:.4f} s / it)'.format(
            header, total_time_str, total_time / len(iterable)))

由此见得这个函数是为了统计各项数据,通过调用来使用或显示各项指标,通过具体项目自定义的函数。

(如果有什么错误麻烦各位大佬告知我,感谢各位大佬,仅为自己的一些理解(小白一枚))

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
### 回答1: metric_logger.log_every是一个函数,用于记录模型训练过程中的指标。它可以在每个epoch或batch结束时记录指定的指标,并将结果打印出来。这个函数通常用于监控模型的性能,并帮助调整模型的超参数。 ### 回答2: metric_logger.log_every方法是PyTorch中Tensorboard支持的一个日志方法,用于周期性地保存训练过程中的一些重要指标值,并将这些指标值视觉化展示在Tensorboard中。 具体来说,log_every方法可以通过设置log_freq参数来指定日志记录的间隔,比如log_freq=10表示每10步记录一次日志。在记录日志时,我们可以记录一些诸如训练误差、验证误差、准确率等指标值,这些指标值可以通过PyTorch中提供的Metric类来计算。log_every方法的核心流程如下: (1) 定义Metric类,通过forward方法来计算指标值 (2) 定义训练或验证的循环过程 (3) 在每个指定的log_freq步骤中,调用Metric的compute方法来计算指标值,然后使用metric_logger.add_scalars方法将指标值保存到tensorboard中 实际上,这个方法的应用非常广泛,无论是在深度学习中的训练过程中,还是机器学习领域的各种实验中都可以使用log_every来记录一些重要的指标值。这种间隔记录的方法是非常有用的,因为它可以防止过度记录日志,降低日志产生的存储量,同时也可以帮助我们更清晰地了解训练过程中的指标变化情况,甚至优化模型。 ### 回答3: metric_logger.log_every是一个PyTorch的函数。它被设计为在训练神经网络时收集指标(metrics),比如损失函数、准确率、学习率等等,并且按照指定的频率将它们记录下来,以便后续统计和分析。该函数实现了一种非常简单但非常实用的机制,使得研究者和工程师可以方便地监测神经网络模型的性能。 metric_logger.log_every函数接受以下几个参数: - *args:要记录的指标,比如损失函数、准确率等等。 - **kwargs:额外的、命名参数,比如学习率等等。 - interval:记录指标的间隔(单位是iteration)。 - header:记录日志的头部,用于说明记录日志的目的和内容。 - logger:记录日志的对象,可以是TensorBoard,也可以是Python自带的logging库。 当metric_logger.log_every被调用时,它会根据interval的值判断是否需要记录指标。如果当前iteration是interval的倍数,则记录指标。如: ```python for iteration in range(max_iters): ... if iteration % interval == 0: metric_logger.log_every("epoch {}/{}".format(epoch, num_epochs), {"loss": loss.item(), "accuracy": accuracy}, interval=interval, header="Training", logger=logger) ... ``` 上述代码段中,如果interval的值为10,则每隔10个iteration就会记录一次指标。记录的内容是当前训练时的epoch数、损失函数、准确率,以及记录日志的头部。 总的来说,metric_logger.log_every是一个非常实用的函数,能够方便地记录神经网络模型的指标,帮助研究者和工程师更好地监测模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love And Program

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值