深度学习训练时加入日志记录

367 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天

在深度学习训练时,有时需要记录一些日志信息,方便自己观察训练状态或者单纯的进行记录。比如一些关键的指标,或者训练的信息。

最近我在训练时也用到了。这里做一个分享。

import logging
from tensorboardX import SummaryWriter
from visualdl import LogWriter
import os

class mylog():
    def __init__(self,filename="WDNet",path="../checkpoints",logname="train_logs.txt"):
        logger = logging.getLogger(filename)
        logger.setLevel(logging.INFO)
        formatter = logging.Formatter()
        run_log = logging.FileHandler("{}/{}".format(path,logname),"a",encoding="utf-8")
        run_log.setLevel(logging.INFO)
        run_log.setFormatter(formatter)
        logger.addHandler(run_log)
        self.logger = logger

class logWriter(object):
    def __init__(self,mode="torch",logdir="checkpoints/logs"):
        """Tensorboard日志记录
        :param mode: 选择保存的是paddle形式还是其他形式 mode="torch"/"paddle"
        :param logdir: 日志保存文件夹
        """
        super().__init__()
        if not os.path.exists(logdir):
            os.makedirs(logdir)
        if mode == "torch":
            self.writer = SummaryWriter(logdir)
        elif mode == "paddle":
            self.writer = LogWriter(logdir)

    def record(self, loss_item: dict, step: int):
        """
        :param loss_item: 损失包装的字典
        :param step: 训练的步数
        """
        for key,value in loss_item.items():
            self.writer.add_scalar(key,value,step)

logWriter可以创建2种log,一种是tensorboard,一种是visualdl,当你使用paddle框架训练时,可以将mode设置为paddle,个人认为visualdl的界面更好看,当然也可以使用默认的tensorboard。

mylog是可以创建一个logs.txt形式的文件。

进行log.txt记录使用示例

self.train_log = mylog("WDNet_train", args.train_log_dir, "train_log.txt")  # 记录训练txt日志
...

if (i + 1) % self.args.print_freq == 0:
    f = "Epoch: [{}/{}] |\tBatch: [{:}/{:} (batchsize {})] |\tG_loss:{:.4f} |\tD_loss:{:.4f}  |\tTime:".format(
        epoch + 1, self.args.epochs, (i + 1) * self.args.train_batch, length_trainloader,
        self.args.train_batch, G_loss.item(), D_loss.item()
    )
    print(f, datetime.now().strftime("%Y-%m-%d-%H-%M-%S"))
    self.train_log.logger.info(f)# 记录打印信息

进行tensorboard或者visualdl进行记录使用示例

Tensorboarddir = os.path.join(self.args.log_dir,
                              datetime.now().strftime("%Y_%m_%d_%H_%M_%S"))  # Tensorboard
self.writer = logWriter(mode="paddle", logdir=Tensorboarddir)#设置paddle或者torch均可
=======================================================================
省略n行
=======================================================================
if (i + 1) % self.args.record_freq == 0:
    self.global_step += 1
    self.writer.record(
        loss_item={
            "train/G-Loss": G_loss.item(),
            "train/D-Loss": D_loss.item(),
            "train/Watermark-Loss": w_loss.item(),
            "train/Alpha-Loss": alpha_loss.item(),
            "train/Mask-Loss": mask_loss.item(),
            "train/I-watermark-Loss-Stage1": I_watermark_loss.item(),
            "train/I-watermark-Loss-Stage2": I_watermark2_loss.item(),
            "train/Vgg-Loss": vgg_loss.item()
        }, step=self.global_step