持续创作,加速成长!这是我参与「掘金日新计划 · 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