由于最近使用caffe训练一个网络,学习了如何使用训练过程中生成的log来绘制loss函数曲线,主要用于观察所训练的网络是否收敛。
前提:安装完caffe后已经对pycaffe和matcaffe编译过了。
接下来从训练过程如何生成训练状态的日志(log)说明,直到绘制出loss函数的曲线。
Step1.对网络训练的脚本文件train.sh进行修改,加上生成log的语句。
使用vim打开train.sh,在末尾加上 tee out.log。
$HOME/net/caffe/build/tools/caffe train -solver=solver.txt - snapshot=$HOME/raid/iter_107600.solverstate -gpu 2 2>&1 | tee out.log
开始训练网络后,则在当前目录下生成了训练日志文件out.log。
*需要注意:
①以上的2>&1是Linux下的信息流输出控制语法,实验证明若去掉则会导致训练的loss等信息不记录。
②out.log在生成之后需要使用caffe自带的python函数进行解析。
Step2.解析log文件,生成out.log.train和out.log.test文件。
这一步可以直接cd到caffe/tools/extra目录下调用parse_log.py函数进行解析,也可以把该目录下的parse_log.py,parse_log.sh, extract_seconds.py,plot_training_log.py.example这四个文件cp到当前目录之后进行解析。(去掉plot_training_log.py.example的.example)
解析语法:
python parse_log.py out.log ./
解析完成后会在./目录也就是当前目录生成两个文件,out.log.train和out.log.test。由于我cp了out.log并命名为trainlog.log,所以在上面的截图中看到的是trainlog.log.train和trainlog.log.test。
Step3.执行绘图脚本,生成loss曲线图(还可以生成accuracy)。
在执行脚本之前,需要根据训练设置修改脚本,用vim打开plot_training_log.py,对field_index进行修改,由于我的网络设置,将2与3调换了。
vim plot_training_log.py
对脚本进行修改,调换2和3后如下:
def create_field_index():
train_key = 'Train'
test_key = 'Test'
field_index = {train_key:{'Iters':0, 'Seconds':1, train_key + ' loss':3,
train_key + ' learning rate':2},
test_key:{'Iters':0, 'Seconds':1, test_key + ' accuracy':2,
test_key + ' loss':3}}
fields = set()
for data_file_type in field_index.keys():
fields = fields.union(set(field_index[data_file_type].keys()))
fields = list(fields)
fields.sort()
return field_index, fields
另外,由于生成的.train和.test的第一行为说明字符(如下图),需要进行处理。
可以在trainlog.log.train和trainlog.log.test中使用#注释掉第一行,或者对脚本进行以下修改(一劳永逸的方法)。
修改前后对比:
#修改前
#修改后
def load_data(data_file, field_idx0, field_idx1):
data = [[], []]
with open(data_file, 'r') as f:
fdata = [line.strip() for line in f]
for new_line in fdata[1:]:
if new_line[0] != '#':
fields = new_line.split(',')
data[0].append(float(fields[field_idx0].strip()))
data[1].append(float(fields[field_idx1].strip()))
return data
使用以下语句执行绘图:
python plot_training_log.py 6 trainloss.png trainlog.log
说明:6表示曲线类型(caffe还支持其他类型,如下所示),trainloss.png表示绘制的图片名称。
Notes:
1. Supporting multiple logs.
2. Log file name must end with the lower-cased ".log".
Supported chart types:
0: Test accuracy vs. Iters
1: Test accuracy vs. Seconds
2: Test loss vs. Iters
3: Test loss vs. Seconds
4: Train learning rate vs. Iters
5: Train learning rate vs. Seconds
6: Train loss vs. Iters
7: Train loss vs. Seconds
注:若使用putty连接工作站,则可以使用ftp服务(putty安装目录下的psftp.exe文件)进行上传下载生成的loss函数曲线图片。相关命令:cd改变远程目录、lcd改变本地目录、ls查看远程文件列表、put上传文件、get下载文件等命令。