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/表示生成日志文件所在位置。

其截图为:

机器学习loss图平滑_神经网络


注意:这个时把在控制台上的输出打印到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下的方法就是:
  1. 把生产的log文件放到这个小工具目录下;
  2. 把然后在cmd中使用下面的指令:
python plot_training_log.py 7 train.png xiaoxi.log

其中的7指的是第七种绘图方式,不过一般是使用0,跌到次数跟loss或者accuracy的关系。图如下:

机器学习loss图平滑_python_02


小工具

机器学习loss图平滑_caffe_03


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

执行此脚本,训练过程中命令窗口并不显示其日志,如下:

机器学习loss图平滑_机器学习loss图平滑_04


在该脚本目录下生成zzfl.log文件,如下:

机器学习loss图平滑_机器学习loss图平滑_05

二、画图

1、将"G:\caffe-master\tools\extra"文件夹下的 parse_log.py,extract_seconds.py ,plot_training_log.py(去掉example)三个文件复制 到新建的logW文件夹下。同时将训练好的zzfl.log文件也复制过来。

必须是以上三个文件,不要多拷贝。

如下:

机器学习loss图平滑_caffe_06


此图中如果 有parse_log.s文件一定要将其删除,否则会爆出以后的错误

2、修改 “plot_training_log.py” 文件,如下(两处修改):

  • 原文件1
  • 修改后的文件1
  • 原文件2

机器学习loss图平滑_caffe_07

  • 修改后的文件2

3、在此处打开命令窗口(shift + 右键),输入"python parse_log.py zzfl.log ./"在当前目录下生成 .test, .train 两个文件,如下:

机器学习loss图平滑_神经网络_08

机器学习loss图平滑_caffe_09

机器学习loss图平滑_深度学习_10


机器学习loss图平滑_caffe_11

4、接着在刚刚的命令窗口中再输入 “python plot_training_log.py 0 colaugAvI.png zzfl.log”,生成准确度与迭代次数的趋势图。

输入 “python plot_training_log.py 6 colaugLvI.png zzfl.log”,生成损失值与迭代次数的趋势图。

机器学习loss图平滑_神经网络_12

  • 具体参数如下:

报错

机器学习loss图平滑_神经网络_13


如何解决还在找。。。

终于找到原因了:

机器学习loss图平滑_机器学习loss图平滑_14

  • 第一次是改写代码时有几点要注意(在这出错了)
  1. train_key与test_key不能搞混;
  2. 数字代表*.train文件生成的顺序,0、1、2、3;
  3. learning rate与loss、accuracy前面有空格;

机器学习loss图平滑_深度学习_15


机器学习loss图平滑_caffe_16

  • 另一个是因为我在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文件就出错没有搞懂,但是删除是有用的。


  • 分享两个很有用的连接:
  1. Linux下训练日志重定向及画loss与accuracy曲线:,这篇博客中的做法更加简洁。
  2. caffe中如何关闭命令行log输出:,使用于工程。

一切搞定,赶紧去试试吧!