如何绘制caffe网络训练曲线
本系列文章由 @yhl_leo 出品,轉(zhuǎn)載請(qǐng)注明出處。
文章鏈接: http://blog.csdn.net/yhl_leo/article/details/51774966
當(dāng)我們?cè)O(shè)計(jì)好網(wǎng)絡(luò)結(jié)構(gòu)后,在神經(jīng)網(wǎng)絡(luò)訓(xùn)練的過(guò)程中,迭代輸出的log信息中,一般包括,迭代次數(shù),訓(xùn)練損失代價(jià),測(cè)試損失代價(jià),測(cè)試精度等。本文提供一段示例,簡(jiǎn)單講述如何繪制訓(xùn)練曲線(training curve)。
首先看一段訓(xùn)練的log輸出,網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)的那段忽略,直接跳到訓(xùn)練迭代階段:
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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
這是一個(gè)普通的網(wǎng)絡(luò)訓(xùn)練輸出,含有1個(gè)loss,可以看出solver.prototxt的部分參數(shù)為:
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"- 1
- 2
- 3
- 4
- 5
- 6
- 7
當(dāng)然,上面的分析,即便不理會(huì),對(duì)下面的代碼也沒(méi)什么影響,繪制訓(xùn)練曲線本質(zhì)就是文件操作,從上面的log文件中,我們可以看出:
- 對(duì)于每個(gè)出現(xiàn)字段] Iteration和loss =的文本行,含有訓(xùn)練的迭代次數(shù)以及損失代價(jià);
- 對(duì)于每個(gè)含有字段] Iteration和Testing net (#0)的文本行,含有測(cè)試的對(duì)應(yīng)的訓(xùn)練迭代次數(shù);
- 對(duì)于每個(gè)含有字段#2:和loss/top-5的文本行,含有測(cè)試top-5的精度。
根據(jù)這些分析,就可以對(duì)文本進(jìn)行如下處理:
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_lossif '] 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_iteraitionsif '] 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_accuracyif '#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()- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
示例代碼中,添加了簡(jiǎn)單的注釋,如果網(wǎng)絡(luò)訓(xùn)練的log輸出與本中所列出的不同,只需要略微修改其中的一些參數(shù)設(shè)置,就能繪制出訓(xùn)練曲線圖。
最后附上繪制出的訓(xùn)練曲線圖:
總結(jié)
以上是生活随笔為你收集整理的如何绘制caffe网络训练曲线的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: solver.prototxt参数说明(
- 下一篇: Faster-Rcnn的loss曲线可视