如何在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
其截图为:
注意:这个时把在控制台上的输出打印到xinxi.log文件中,缺点:无法在控制台上看到实时的输出信息。接着就可以使用[小工具][1]进行画图了。
方法二:
使用修改源代码的方式。其使用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!
6、分享两个很有用的连接
Linux下训练日志重定向及画loss与accuracy曲线:http://blog.csdn.net/fx409494616/article/details/53197209?ref=myread,这篇博客中的做法更加简洁
caffe中如何关闭命令行log输出:http://blog.csdn.net/zhangla1220/article/details/50999072,使用于工程。
一切搞定,赶紧去试试吧!
再次训练网络时,你会在Build\x64\Release下发现多出一个log文件夹,我们所要的训练日志就保存在里面了。至于如何利用这些日志文件,画loss曲线和accuracy曲线,下一篇再详细讲解。
注意:这修改源代码的方式自己测试了下,并有成功,只能创建文件夹,但是没有日志生成。
成了日志文件后我们需要做的就是如何绘制loss和accuracy曲线了。
我们需要的就是博客后面的小工具,其就是tools/extra/下的工具,不过那些时在linux下的,在运行时会出错,所以在window下需要进行修改,小工具就是经过修改的,不过plot_training_log.py的开头还需要添加一行代码,其为:
# -*- coding: utf-8 -*-
否则会报:yntaxError:Non-ASCII character ‘\xe6’ in file等错误。
在window下的方法就是:
1、把生产的log文件放到这个小工具目录下;
2、把然后在cmd中使用下面的指令:
python plot_training_log.py 7 train.png xiaoxi.log
其中的7指的是第七种绘图方式,不过一般是使用0,跌到次数跟loss或者accuracy的关系。图如下:
[1]小工具
参考博客:Caffe-Windows下画loss与accuracy曲线