JLU-IPVR
听笙
做过训练的同学们都知道,我们很关注训练过程中loss和accuracy这两个参数值的变化,loss值不断减小,证明它正在趋于收敛,accuracy值不断增加,证明它的准确率在不断提升,这都是我们想看到的,实际上我们也希望能够直观的看到他们的变化趋势。这篇文章讲解的就是如何将loss和accuracy的变化曲线描绘出来。
在训练过程中我们会发现有这样一些东西:
这些东西就是训练日志,绘制loss和accuracy时需要使用的数据。但是会发现我们训练的时候这些数据并没有保存下来,那么我们就要对源码做一些修改。打开工程,进入libcaffe-src,找到common.cpp文件
1. 添加头文件
2. 添加一个生成日志的子函数
需要注意的是这个子函数一定要定义在void GlobalInit(int* pargc,char*** pargv)之前,因为Globallnit函数要调用initGlob()子函数。
3. 在void GlobalInit(int* pargc,char*** pargv)函数中调用2中定义的子函数
右键libcaffe->生成,右键caffe->生成。接下来训练过程的的日志就会被记录下来,放在指定的文件夹下。
将文件后缀名更改为log
绘图
根据之前的的操作,已经得到日志文件INFO2017-08-30T10-50-47.log,现在需要根据这个文件生成*****log.test,*****log.train两个文件。
找到\caffe-master\tools\extra文件夹下的plot_training_log.py对立面的内容进行修改如下。
1. 首先要多引进一个模块parse_log,在文件开始部分添加
Import parse_log,这个非常重要。
2. 修改子函数create_field_index()
主要修改的地方就是field_index,这要根据你前面生成的****.log.test和****.log.train两个文件中第一行的单词的顺序修改字典对应顺序。我此处的修改是根据我的文件,切记一定要和你的文件核对,否则生成的曲线是不对的。我已经测试过8种曲线都能正确画出。
3. 修改load_data()
之所以修改这个函数,因为原函数是从****.log.test和****.log.train的第一行读取数据,但是第一行是单词如法转换成浮点数,必须从第二行开始读取数据。
需要修改的部分已经基本完成,接下来就可以画图了=。=
Windows下的命令格式:
./plot_training_log.py chart_type[0-7]/where/to/save.png /path/to/first.log
其中0—7数字所代表的画图的种类为:
Supportedchart 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
得到如下图像: