如同前幾篇的可視化,這里采用的也是jupyter notebook來進行曲線繪制。
In [1]:
#加載必要的庫
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import sys,os,caffe
#設置當前目錄
caffe_root = '/home/bnu/caffe/'
sys.path.insert(0, caffe_root + 'python')
os.chdir(caffe_root)
設置求解器,和c++/caffe一樣,需要一個solver配置文件。
In [2]:
# set the solver prototxt
caffe.set_device(0)
caffe.set_mode_gpu()
solver = caffe.SGDSolver('examples/cifar10/cifar10_quick_solver.prototxt')
如果不需要繪制曲線,只需要訓練出一個caffemodel, 直接調用solver.solve()就可以了。如果要繪制曲線,就需要把迭代過程中的值
保存下來,因此不能直接調用solver.solve(), 需要迭代。在迭代過程中,每迭代200次測試一次
In [5]:
%%time
niter =4000
test_interval = 200
train_loss = np.zeros(niter)
test_acc = np.zeros(int(np.ceil(niter / test_interval)))
# the main solver loop
for it in range(niter):
solver.step(1) # SGD by Caffe
# store the train loss
train_loss[it] = solver.net.blobs['loss'].data
solver.test_nets[0].forward(start='conv1')
if it % test_interval == 0:
acc=solver.test_nets[0].blobs['accuracy'].data
print 'Iteration', it, 'testing...','accuracy:',acc
test_acc[it // test_interval] = acc
繪制train過程中的loss曲線,和測試過程中的accuracy曲線。
In [6]:
print test_acc
_, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(np.arange(niter), train_loss)
ax2.plot(test_interval * np.arange(len(test_acc)), test_acc, 'r')
ax1.set_xlabel('iteration')
ax1.set_ylabel('train loss')
ax2.set_ylabel('test accuracy')
Out[6]: