本系列文章由 @yhl_leo 出品,转载请注明出处。

文章链接: http://blog.csdn.net/yhl_leo/article/details/51774966


当我们设计好网络结构后,在神经网络训练的过程中,迭代输出的log信息中,一般包括,迭代次数,训练损失代价,测试损失代价,测试精度等。本文提供一段示例,简单讲述如何绘制训练曲线(training curve)。

首先看一段训练的log输出,网络结构参数的那段忽略,直接跳到训练迭代阶段:

I0627 21:30:06.004370 15558 solver.cpp:242] Iteration 0, loss = 21.6953
I0627 21:30:06.004420 15558 solver.cpp:258] Train net output #0: loss = 21.6953 (* 1 = 21.6953 loss)
I0627 21:30:06.004426 15558 solver.cpp:571] Iteration 0, lr = 0.01
I0627 21:30:28.592690 15558 solver.cpp:242] Iteration 100, loss = 13.6593
I0627 21:30:28.592730 15558 solver.cpp:258] Train net output #0: loss = 13.6593 (* 1 = 13.6593 loss)
I0627 21:30:28.592733 15558 solver.cpp:571] Iteration 100, lr = 0.01 ... I0627 21:37:47.926597 15558 solver.cpp:346] Iteration 2000, Testing net (#0)
I0627 21:37:48.588079 15558 blocking_queue.cpp:50] Data layer prefetch queue empty
I0627 21:40:40.575474 15558 solver.cpp:414] Test net output #0: loss = 13.07728 (* 1 = 13.07728 loss)
I0627 21:40:40.575477 15558 solver.cpp:414] Test net output #1: loss/top-1 = 0.00226
I0627 21:40:40.575487 15558 solver.cpp:414] Test net output #2: loss/top-5 = 0.01204
I0627 21:40:40.708261 15558 solver.cpp:242] Iteration 2000, loss = 13.1739
I0627 21:40:40.708302 15558 solver.cpp:258] Train net output #0: loss = 13.1739 (* 1 = 13.1739 loss)
I0627 21:40:40.708307 15558 solver.cpp:571] Iteration 2000, lr = 0.01 ... I0628 01:28:47.426129 15558 solver.cpp:242] Iteration 49900, loss = 0.960628
I0628 01:28:47.426177 15558 solver.cpp:258] Train net output #0: loss = 0.960628 (* 1 = 0.960628 loss)
I0628 01:28:47.426182 15558 solver.cpp:571] Iteration 49900, lr = 0.01
I0628 01:29:10.084050 15558 solver.cpp:449] Snapshotting to binary proto file train_net/net_iter_50000.caffemodel
I0628 01:29:10.563587 15558 solver.cpp:734] Snapshotting solver state to binary proto filetrain_net/net_iter_50000.solverstate
I0628 01:29:10.692239 15558 solver.cpp:346] Iteration 50000, Testing net (#0)
I0628 01:29:13.192075 15558 blocking_queue.cpp:50] Data layer prefetch queue empty
I0628 01:31:00.595120 15558 solver.cpp:414] Test net output #0: loss = 0.6404232 (* 1 = 0.6404232 loss)
I0628 01:31:00.595124 15558 solver.cpp:414] Test net output #1: loss/top-1 = 0.953861
I0628 01:31:00.595127 15558 solver.cpp:414] Test net output #2: loss/top-5 = 0.998659
I0628 01:31:00.727577 15558 solver.cpp:242] Iteration 50000, loss = 0.680951
I0628 01:31:00.727618 15558 solver.cpp:258] Train net output #0: loss = 0.680951 (* 1 = 0.680951 loss)
I0628 01:31:00.727623 15558 solver.cpp:571] Iteration 50000, lr = 0.0096

这是一个普通的网络训练输出,含有1个loss,可以看出solver.prototxt的部分参数为:

test_interval: 2000
base_lr: 0.01
lr_policy: "step" # or "multistep"
gamma: 0.96
display: 100
stepsize: 50000 # if is "multistep", the first stepvalue is set as 50000
snapshot_prefix: "train_net/net"

当然,上面的分析,即便不理会,对下面的代码也没什么影响,绘制训练曲线本质就是文件操作,从上面的log文件中,我们可以看出:

  • 对于每个出现字段] Iterationloss =的文本行,含有训练的迭代次数以及损失代价;
  • 对于每个含有字段] IterationTesting net (#0)的文本行,含有测试的对应的训练迭代次数;
  • 对于每个含有字段#2:loss/top-5的文本行,含有测试top-5的精度。

根据这些分析,就可以对文本进行如下处理:

import os
import sys
import numpy as np
import matplotlib.pyplot as plt
import math
import re
import pylab
from pylab import figure, show, legend
from mpl_toolkits.axes_grid1 import host_subplot # read the log file
fp = open('log.txt', 'r') train_iterations = []
train_loss = []
test_iterations = []
test_accuracy = [] for ln in fp:
# get train_iterations and train_loss
if '] Iteration ' in ln and 'loss = ' in ln:
arr = re.findall(r'ion \b\d+\b,',ln)
train_iterations.append(int(arr[0].strip(',')[4:]))
train_loss.append(float(ln.strip().split(' = ')[-1]))
# get test_iteraitions
if '] Iteration' in ln and 'Testing net (#0)' in ln:
arr = re.findall(r'ion \b\d+\b,',ln)
test_iterations.append(int(arr[0].strip(',')[4:]))
# get test_accuracy
if '#2:' in ln and 'loss/top-5' in ln:
test_accuracy.append(float(ln.strip().split(' = ')[-1])) fp.close() host = host_subplot(111)
plt.subplots_adjust(right=0.8) # ajust the right boundary of the plot window
par1 = host.twinx()
# set labels
host.set_xlabel("iterations")
host.set_ylabel("log loss")
par1.set_ylabel("validation accuracy") # plot curves
p1, = host.plot(train_iterations, train_loss, label="training log loss")
p2, = par1.plot(test_iterations, test_accuracy, label="validation accuracy") # set location of the legend,
# 1->rightup corner, 2->leftup corner, 3->leftdown corner
# 4->rightdown corner, 5->rightmid ...
host.legend(loc=5) # set label color
host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
# set the range of x axis of host and y axis of par1
host.set_xlim([-1500, 160000])
par1.set_ylim([0., 1.05]) plt.draw()
plt.show()

示例代码中,添加了简单的注释,如果网络训练的log输出与本中所列出的不同,只需要略微修改其中的一些参数设置,就能绘制出训练曲线图。

最后附上绘制出的训练曲线图:

如何绘制caffe网络训练曲线的更多相关文章

  1. caffe的python接口学习(7):绘制loss和accuracy曲线

    使用python接口来运行caffe程序,主要的原因是python非常容易可视化.所以不推荐大家在命令行下面运行python程序.如果非要在命令行下面运行,还不如直接用 c++算了. 推荐使用jupy ...

  2. Caffe---Pycaffe 绘制loss和accuracy曲线

    Caffe---Pycaffe 绘制loss和accuracy曲线 <Caffe自带工具包---绘制loss和accuracy曲线>:可以看出使用caffe自带的工具包绘制loss曲线和a ...

  3. Caffe---自带工具 绘制loss和accuracy曲线

    Caffe自带工具包---绘制loss和accuracy曲线 为什么要绘制loss和accuracy曲线?在训练过程中画出accuracy 和loss曲线能够更直观的观察网络训练的状态,以便更好的优化 ...

  4. 基于pycaffe的网络训练和结果分析(mnist数据集)

    该工作的主要目的是为了练习运用pycaffe来进行神经网络一站式训练,并从多个角度来分析对应的结果. 目标: python的运用训练 pycaffe的接口熟悉 卷积网络(CNN)和全连接网络(DNN) ...

  5. 图像分割实验:FCN数据集制作,网络模型定义,网络训练(提供数据集和模型文件,以供参考)

    论文:<Fully Convolutional Networks for Semantic Segmentation> 代码:FCN的Caffe 实现 数据集:PascalVOC 一 数据 ...

  6. MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...

  7. Windows平台上Caffe的训练与学习方法(以数据库CIFAR-10为例)

    Windows平台上Caffe的训练与学习方法(以数据库CIFAR-10为例) 在完成winodws平台上的caffe环境的搭建之后,亟待掌握的就是如何在caffe中进行训练与学习,下面将进行简单的介 ...

  8. python绘制caffe中网络模型

    caffe-master/python/draw_net.py 实现绘制caffe中定义的网络模型功能,将.prototxt文件可视化. 需要先安装pydot和protobuf工具 通过Anacond ...

  9. ubuntu 绘制lenet网络结构图遇到的问题汇总

    Couldn't import dot_parser, loading of dot files will not be possible的问题 1 .sudo pip uninstall pypar ...

随机推荐

  1. vue中父组件传数据给子组件

    父组件: <template> <parent> <child :list="list"></child> //在这里绑定list对 ...

  2. Akka源码分析-Akka-Streams-GraphStage

    上一篇博客中我们介绍了ActorMaterializer的一小部分源码,其实分析的还是非常简单的,只是初窥了Materializer最基本的初始化过程及其涉及的基本概念.我们知道在materializ ...

  3. C#封装访问修饰符

    C# 封装 封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中".在面向对象程序设计方法论中,封装是为了防止对实现细节的访问. 抽象和封装是面向对象程序设计的相关特性. ...

  4. 为WebSphere Application Server v8.5安装并配置JDK7

    IBM WebSphere Application Server v8.5可以同时支持不同版本的JDK共存,并且可以通过命令设置概要文件所使用的JDK版本.WAS8.5默认安装JDK6,如果要使用JD ...

  5. xcode 制作静态库文件(.a)

    参考: http://www.jb51.net/article/37853.htm 摘要: 1. 获取.a文件的信息              lipo -info /Users/pjk1129/De ...

  6. Java学习笔记-eclipse配置

    一.配置Java环境变量 JAVA_HOME:D:\Program Files\Java\jdk1.7.0_76 CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HO ...

  7. poj2240 Arbitrage

    思路: 有向图判负环. 实现: (1)spfa #include <iostream> #include <map> #include <string> #incl ...

  8. PSP需求分析文档

    PSP软件需求分析文档 刘杰 1.       引言 1.1  背景 开发项目经常延期不能按时提交,甚至不能给出明确的延迟时间 1.2  术语 PSP,数据库 2.       任务概述 2.1  目 ...

  9. mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  10. 【译】x86程序员手册25-7.1任务状态段

    7.1 Task State Segment 任务状态段 All the information the processor needs in order to manage a task is st ...