caffe工具(2)
- 生产log文件基本有两种方法:
- 方法一:通过命令行来进行生成
- 方法二:使用修改源代码的方式
- 小工具
- 实例
- 一、训练
- 二、画图
- 报错
如何在window下绘制caffe的loss和accuracy曲线
其大概方法都是要先生成log文件,然后通过其来绘制这两条曲线。
生产log文件基本有两种方法:
方法一:通过命令行来进行生成
其使用bat文件时的配置为:
h:
cd H:\VCproject\dd
caffe.exe train --solver=H:/VCproject/dd/solver.prototxt --`在这里插入代码片`weights=H:/VCproject/dd/bvlc_reference_caffenet.caffemodel >Log/xinxi.log 2>&1
pause
增加了
>Log/xinxi.log 2>&1
其中Log/表示生成日志文件所在位置。
其截图为:
注意:这个时把在控制台上的输出打印到xinxi.log文件中,缺点:无法在控制台上看到实时的输出信息。接着就可以使用后面小工具进行画图了。
方法二:使用修改源代码的方式
使用VS2013打开Caffe。
到src/common.cpp文件,
- 1、如下代码:
#include <boost/date_time.hpp>
#include <process.h>
#include <direct.h>
- 2、日志的子函数
void initGlog() {
FLAGS_log_dir = ".\\log\\";//存放日志文件的文件夹路径,我们可以自己指定
_mkdir(FLAGS_log_dir.c_str());
std::string LOG_INFO_FILE;
std::string LOG_WARNING_FILE;
std::string LOG_ERROR_FILE;
std::string LOG_FATAL_FILE;
std::string now_time = boost::posix_time::to_iso_extended_string(boost::posix_time::second_clock::local_time());
now_time[13] = '-';
now_time[16] = '-';
LOG_INFO_FILE = FLAGS_log_dir + "INFO" + now_time + ".log"; //将txt改为log,因为caffe处理脚本处理的是log类型,
google::SetLogDestination(google::GLOG_INFO, LOG_INFO_FILE.c_str());
LOG_WARNING_FILE = FLAGS_log_dir + "WARNING" + now_time + ".txt";
google::SetLogDestination(google::GLOG_WARNING, LOG_WARNING_FILE.c_str());
LOG_ERROR_FILE = FLAGS_log_dir + "ERROR" + now_time + ".txt";
google::SetLogDestination(google::GLOG_ERROR, LOG_ERROR_FILE.c_str());
LOG_FATAL_FILE = FLAGS_log_dir + "FATAL" + now_time + ".txt";
google::SetLogDestination(google::GLOG_FATAL, LOG_FATAL_FILE.c_str());
}
需要注意的是这个子函数一定要定义在void GlobalInit(int* pargc, char*** pargv)之前,因为Globallnit函数要调用initGlob()子函数。
- 3、oid GlobalInit(int* pargc, char*** pargv)函数中调用2中定义的子函数
void GlobalInit(int* pargc, char*** pargv) {
// Google flags.
::gflags::ParseCommandLineFlags(pargc, pargv, true);
// Provide a backtrace on segfault.
//::google::InstallFailureSignalHandler();
// Google logging.
/*******添加到下面位置*********/
initGlog();
/**************************/
::google::InitGoogleLogging(*(pargv)[0]);
}
- 4、重新生成libcaffe 右击项目libcaffe->生成,等待就可以了。
- 5、重新生成caffe,这个很重要否则无法生效,我一开始就忘记这一步,所以没有成功。 右击项目caffe->生成,等待就OK!
再次训练网络时,你会在Build\x64\Release下发现多出一个log文件夹,我们所要的训练日志就保存在里面了。
注意:这修改源代码的方式自己测试了下,并有成功,只能创建文件夹,但是没有日志生成。
成了日志文件后我们需要做的就是如何绘制loss和accuracy曲线了。
我们需要的就是后面的小工具,其就是tools/extra/下的工具,不过那些时在linux下的,在运行时会出错,所以在window下需要进行修改,小工具就是经过修改的,不过plot_training_log.py的开头还需要添加一行代码,其为:
# -*- coding: utf-8 -*-
否则会报:yntaxError:Non-ASCII character ‘\xe6’ in file等错误。
- 在window下的方法就是:
- 把生产的log文件放到这个小工具目录下;
- 把然后在cmd中使用下面的指令:
python plot_training_log.py 7 train.png xiaoxi.log
其中的7指的是第七种绘图方式,不过一般是使用0,跌到次数跟loss或者accuracy的关系。图如下:
小工具
caffe中其实已经自带了这样的画图小工具 caffe-master/tools/extra/parse_log.sh caffe-master/tools/extra/extract_seconds.py和 caffe-master/tools/extra/plot_training_log.py.example ,使用方法如下:
- 1.windows记录训练日志:
在训练过程中的命令中加入一行参数 ,实现Log日志的记录,这里我使用的.bat。其实也可以直接copy输出的内容。
caffe train --solver=deepid/deepid2/deepid_solver.prototxt >log/XXXXX.log 2>&1
pause
这样训练结束之后,会在Log文件夹中生成每次训练的Log日志,但是生成的是这样的文件XXXXX.log. 如果没有生成,那你可以改成TXT后缀为log文件重命名。
- 2.解析训练日志
将最上面说的3个脚本文件拷贝到Log 文件夹下,生成XXXXX.log (这里记得不要使用python3,因为有些地方不兼容,如果只有python3,那你可以根据提示修改相应的代码 下同)python parse_log.py log/XXXXX.log .
后面的参数为log文件名,这样就会在当前文件夹下生成一个.train文件和一个.test文件 - 3.生成图片执行:
python plot_training_log.py 0 save.png XXXX.log
这里是需要png图片。需要修改plot_training_log.py。可以生成训练过程中的Test accuracy vs. Iters 曲线,其中0代表曲线类型, save.png 代表保存的图片名称caffe中支持很多种曲线绘制,通过指定不同的类型参数即可, - 具体参数如下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: Train learning rate vs. Iters
3: Train learning rate vs. Seconds
4: Test loss vs. Iters
5: Test loss vs. Seconds
6: Train learning rate vs. Iters
7: Train learning rate vs. Seconds
8: Train loss vs. Iters
9: Train loss vs. Seconds
最后,看一下效果
实例
一、训练
Caffe训练脚本(CNN_M_2048_train.bat):
.\Build\x64\Release\caffe.exe train --solver=.\zzfl\lenet_solver.prototxt 1>.\zzfl\zzfl.log 2>&1
Pause
执行此脚本,训练过程中命令窗口并不显示其日志,如下:
在该脚本目录下生成zzfl.log文件,如下:
二、画图
1、将"G:\caffe-master\tools\extra"文件夹下的 parse_log.py,extract_seconds.py ,plot_training_log.py(去掉example)三个文件复制 到新建的logW文件夹下。同时将训练好的zzfl.log文件也复制过来。
必须是以上三个文件,不要多拷贝。
如下:
此图中如果 有parse_log.s文件一定要将其删除,否则会爆出以后的错误
2、修改 “plot_training_log.py” 文件,如下(两处修改):
- 原文件1
- 修改后的文件1
- 原文件2
- 修改后的文件2
3、在此处打开命令窗口(shift + 右键),输入"python parse_log.py zzfl.log ./"在当前目录下生成 .test, .train 两个文件,如下:
4、接着在刚刚的命令窗口中再输入 “python plot_training_log.py 0 colaugAvI.png zzfl.log”,生成准确度与迭代次数的趋势图。
输入 “python plot_training_log.py 6 colaugLvI.png zzfl.log”,生成损失值与迭代次数的趋势图。
- 具体参数如下:
报错
如何解决还在找。。。
终于找到原因了:
- 第一次是改写代码时有几点要注意(在这出错了)
- train_key与test_key不能搞混;
- 数字代表*.train文件生成的顺序,0、1、2、3;
- learning rate与loss、accuracy前面有空格;
- 另一个是因为我在tools文件拷贝时,将parse_log.sh拷贝过来了,而plot_training_log.py会调用这个脚本文件,因此导致*.train文件内容全部清除,爆出错误
Traceback (most recent call last):
File "plot_training_log.py", line 191, in <module>
plot_chart(chart_type, path_to_png, path_to_logs)
File "plot_training_log.py", line 117, in plot_chart
data = load_data(data_file, x, y)
File "plot_training_log.py", line 87, in load_data
data[0].append(float(fields[field_idx0].strip()))
ValueError: could not convert string to float: #Iters Seconds TrainingLoss LearningRate
后面我将parse_log.sh移除出该文件夹,然后就正常运行。具体原因为什么调用了.sh文件就出错没有搞懂,但是删除是有用的。
- 分享两个很有用的连接:
- Linux下训练日志重定向及画loss与accuracy曲线:,这篇博客中的做法更加简洁。
- caffe中如何关闭命令行log输出:,使用于工程。
一切搞定,赶紧去试试吧!