Caffe-Miscoroft无训练日志解决方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Sunshine_in_Moon/article/details/53529028

Caffe的训练日志就是我们在命令窗口中看到的训练时打印出来的信息,我们可以利用这些信息画训练时loss

accruacy图,至于怎么利用这些信息画出这两个图是下一篇将要讲述的问题。我们先来看看这些保存在什么地方。如果你是使用的Caffe-Windows版本是happynear大神编译的老版本,那你应该会在bin文件下发现一个log文件夹,里面保存的就是我们需要的训练文件,文件名上有时间,可以很方便的找到我们想要的日志。

然而,很不幸的Caffe官方提供的Windows版本,即https://github.com/BVLC/caffe/tree/windows,找不到这个文件夹了(我找了很久都没有找到)。今天偶然间看了一篇大神的博客,发现他也遇到了和我同样的问题,大神博客地址如下,里面还有Ubuntu下的解决方案(http://blog.csdn.net/lishanlu136/article/details/51491301)。这篇博客给了我很大的灵感,我比较了新旧版本的Caffe,原来问题都出来src文件下的commom.cpp文件,新版本Caffe-Windows不知出于何种目的,将生成日志文件的函数去掉了,因此我们也就找不到日志文件了。既然问题的根源找到了,下面就说说解决方法,其实很简单,照葫芦画瓢。

使用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 + ".txt";
  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、在void 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曲线,下一篇再详细讲解。




展开阅读全文

没有更多推荐了,返回首页