在网络训练中实时保存日志

背景

在进行神经网络训练时,有时我们需要去保存一些有价值的信息,以便将来查看,或者进行接下来的实验,以前我的做法是写一个txt文件。但是问题是我们不能在程序中频繁的打开和关闭文件,这样会严重的影响程序执行的速度,通常的做法是先存储在变量中,最后再进行写入操作。这样带来的问题是网络训练中,我们想查看一些值就办不到了。
接下来的这个程序就是解决这个问题的,这是我在github上resnet_cbam网络中看到的日志记录方法,它的好处就是使用特别方便,而且可以实时查看,并且写入日志的内容会实时显示输出出来。

代码

import os
import sys
import numpy as np
import matplotlib.pyplot as plt
import traceback

class Logger(object):
    '''Save training process to log file with simple plot function.'''
    def __init__(self, fpath,resume=False): 
        self.file = None
        self.resume = resume
        if os.path.isfile(fpath):
            if resume:
                self.file = open(fpath, 'a') 
            else:
                self.file = open(fpath, 'w')
        else:
            self.file = open(fpath, 'w')

    def append(self, target_str):
        if not isinstance(target_str, str):
            try:
                target_str = str(target_str)
            except:
                traceback.print_exc()
            else:
                print(target_str)
                self.file.write(target_str + '\n')
                self.file.flush()
        else:
            print(target_str)
            self.file.write(target_str + '\n')
            self.file.flush()

    def close(self):
        if self.file is not None:
            self.file.close()

使用说明

在程序中使用时只需要导入Logger类即可,只需要使用append添加自己想要保存的信息,就可以方便使用。

#导入类
from logger import Logger
# 使用
logger = Logger('./logs/'+'train.log')  # 创建新的log文件
logger = Logger('./logs/'+'train.log', True)  #在已有的log文件后追加信息
# 添加自己需要保存的信息,注意每次append的信息都会在屏幕上打印输出
logger.append(vars(args))  # 保存args中的所有参数
logger.append('lr: %f' % (self.optimizer.state_dict()['param_groups'][0]['lr']))  # 保存当前epoch的学习率

代码来源:
https://github.com/luuuyi/CBAM.PyTorch

你可能感兴趣的:(Python,神经网络,python)