Caffe-Windows下画loss与accuracy曲线

本文转自http://blog.csdn.net/sunshine_in_moon/article/details/53541573,并修改了其中一丁点儿问题。非常感谢博主的分享,跟着博主的攻略一步步做下来,完全实现,没有问题。

请注意如果.py文件中有中文,请在文件开头加上# -*- coding: utf-8 -*-,否则会报错yntaxError:Non-ASCII character '\xe6' in file,文章最后原博主给的下载代码中没有这句话,需要大家手动加上。

另外代码是Python2.7版本的,如果是Python3版本的,运行会出错,解决方案请参考http://blog.csdn.net/zyx19950825/article/details/61919038


本篇博客主要讲述怎样在Windows下利用Caffe提供的脚本程序和Caffe训练日志画loss曲线与accuracy曲线。如果你是在Linux下使用Caffe可以参考这篇博客:http://blog.csdn.net/fx409494616/article/details/53197209?ref=myread。

如果你还没有Caffe训练日志,请参考上一篇博客http://blog.csdn.net/fuwenyan/article/details/62418108,生成自己的训练日志。

好了废话少说,直接上干货!!!

1、修改tools/extra/plot_training_log.py,这里面需要修改的东西太多了,我们分步讲解,可能代码优点乱,大家不要介意。

1.1、生成*****log.test,*****log.train两个文件

方法一:利用tools/extra/parse_log.py文件

[python]  view plain  copy
 
  1. python parse_log.py ****.log save_path  
第一个参数:我们的训练日志,后缀名必须是".log",其实这也不是必须的,我们可以修改plot_training_log.py中子函数

[python]  view plain  copy
 
  1. def get_log_file_suffix():  
  2.     return '.log'#可以返回其他后缀名  
第二个参数:保存路径,执行上述命令后会生成两个文件****.log.test,****.log.train。

方法二:将生成这两个文件集成到plot_training_log.py中。我们首先看一下两个plot_training_log.py文件中的子函数

[python]  view plain  copy
 
  1. def get_log_parsing_script():  
  2.     dirname = os.path.dirname(os.path.abspath(inspect.getfile(  
  3.         inspect.currentframe())))  
  4.     return dirname + '/parse_log.sh'  
返回的是parse_log.sh脚本的路径,看来要调用这个脚本,但是我们知道在Windows下是无法使用shell脚本的。所以我们需要修改调用这个shell脚本的地方。就在下面这个子函数

[python]  view plain  copy
 
  1. def plot_chart(chart_type, path_to_png, path_to_log_list):  
  2.     for path_to_log in path_to_log_list:  
  3.         #os.system('%s %s' % (get_log_parsing_script(), path_to_log))  
  4.         ######################自己修改#############################  
  5.         train_dict_list, test_dict_list = parse_log.parse_log(path_to_log)  
  6.         parse_log.save_csv_files(path_to_log, './', train_dict_list,test_dict_list)  
  7.         #####################记得要在前面导入parse_log模块 import parse_log########  
  8.         data_file = get_data_file(chart_type, path_to_log)  
  9.         x_axis_field, y_axis_field = get_field_descriptions(chart_type)  
  10.         x, y = get_field_indices(x_axis_field, y_axis_field)  
  11.         data = load_data(data_file, x, y)  
  12.         ## TODO: more systematic color cycle for lines  
  13.         color = [random.random(), random.random(), random.random()]  
  14.         label = get_data_label(path_to_log)  
  15.         linewidth = 0.75  
  16.         ## If there too many datapoints, do not use marker.  
  17. ##        use_marker = False  
  18.         use_marker = True  
  19.         if not use_marker:  
  20.             plt.plot(data[0], data[1], label = label, color = color,  
  21.                      linewidth = linewidth)  
  22.         else:  
  23.             ok = False  
  24.             ## Some markers throw ValueError: Unrecognized marker style  
  25.             while not ok:  
  26.                 try:  
  27.                     marker = random_marker()  
  28.                     plt.plot(data[0], data[1], label = label, color = color,  
  29.                              marker = marker, linewidth = linewidth)  
  30.                     ok = True  
  31.                 except:  
  32.                     pass  
  33.     legend_loc = get_legend_loc(chart_type)  
  34.     plt.legend(loc = legend_loc, ncol = 1# ajust ncol to fit the space  
  35.     plt.title(get_chart_type_description(chart_type))  
  36.     plt.xlabel(x_axis_field)  
  37.     plt.ylabel(y_axis_field)  
  38.     plt.savefig(path_to_png)  
  39.     plt.show()  
看到了第一句就是调用shell脚本,我们将其注释掉,然后利用parse_log.py文件中的子函数来实现相同的功能。
2.2、Caffe提供的工具可以生成8种不同的曲线


1.3、修改子函数creat_field_index()

[python]  view plain  copy
 
  1. def create_field_index():  
  2.     train_key = 'Train'  
  3.     test_key = 'Test'  
  4.     field_index = {train_key:{'Iters':0'Seconds':1, train_key + ' learning rate':2,  
  5.                               train_key + ' loss':3},#根据自己的**.log.train文件修改了2和3的顺序,注意只是调换顺序,不要修改key字符  
  6.                    test_key:{'Iters':0'Seconds':1'learning rate':2,test_key + ' accuracy':3,  
  7.                              test_key + ' loss':4}}#自己增加test_key 中learning rate  
  8.     fields = set()  
  9.     for data_file_type in field_index.keys():  
  10.         fields = fields.union(set(field_index[data_file_type].keys()))  
  11.     fields = list(fields)  
  12.     fields.sort()  
  13.     return field_index, fields  
主要修改的地方就是field_index,这要根据你前面生成的****.log.test和****.log.train两个文件中第一行的单词的顺序修改字典对应顺序。我此处的修改是根据我的文件,切记一定要和你的文件核对,否则生成的曲线是不对的。我已经测试过8种曲线都能正确画出。

2.4、修改load_data()

[python]  view plain  copy
 
  1. def load_data(data_file, field_idx0, field_idx1):  
  2.     data = [[], []]  
  3.     fr = open(data_file,'r')  
  4.     lines = fr.readlines()  
  5.     for i in range(1,len(lines)):  
  6.         line = lines[i].strip()  
  7.         if line[0] != '#':  
  8.             fields = line.split(',')  
  9.             data[0].append(float(fields[field_idx0].strip()))  
  10.             data[1].append(float(fields[field_idx1].strip()))  
  11.     fr.close()  
  12.     return data  
之所以修改这个函数,因为原函数是从****.log.test和****.log.train的第一行读取数据,但是第一行是单词如法转换成浮点数,必须从第二行开始读取数据。

OK,到此为止,需要修改的地方基本上已经没有了。

需要注意两点:

1、保存的图片默认后缀名.png,如果你想保存成其他后缀名,可修改下面的代码

[python]  view plain  copy
 
  1. path_to_png = sys.argv[2]  
  2. if not path_to_png.endswith('.png'):#此处检查后缀名,可以改成你想要的后缀  
  3.       print 'Path must ends with png' % path_to_png  
2、Windows命令格式

[python]  view plain  copy
 
  1. python plot_training_log.py 7 train.png INFO2016-12-09T12-54-26.log  
结果如下:



是不是很酷!

修改后的完整代码请到此处下载:http://download.csdn.net/detail/sunshine_in_moon/9706954

下载积分为5分,毕竟辛辛苦苦改了很长时间,请多多支持。如果你的积分确实有限,可以给我留言并附上邮箱。


你可能感兴趣的:(Python,Caffe)