使用caffe自带的工具绘制loss函数曲线

由于最近使用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下载文件等命令。


这里写图片描述

发布了24 篇原创文章 · 获赞 26 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/TracelessLe/article/details/71244374