如何在window下绘制caffe的loss和accuracy曲线

时间:2021-08-08 08:10:28

如何在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  

其截图为:
如何在window下绘制caffe的loss和accuracy曲线
注意:这个时把在控制台上的输出打印到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的关系。图如下:
如何在window下绘制caffe的loss和accuracy曲线

[1]小工具
参考博客:Caffe-Windows下画loss与accuracy曲线