在进行神经网络训练时,有时我们需要去保存一些有价值的信息,以便将来查看,或者进行接下来的实验,以前我的做法是写一个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