【caffe】使用python脚本训练分类模型,并可视化Loss和Accuracy.

PS:这里不是使用caffe默认的终端调用训练指令,而是使用python脚本来进行网络训练,并在网络训练完毕后显示训练过程的loss和accuracy。

详细脚本如下:

1)需要修改的变量:

cafferoot=‘caffe根目录’

solver='网络solver文件'

loss和accuracy为自己网络文件中对应层的名称。

2)其中绿色、黄色和红色曲线分别代表训练loss、测试loss和测试的accuracy。

#coding=utf-8
import sys
cafferoot='/data_1/caffe-path/caffe-refinedet-shufflenet-nocudnn'	#修改为自己的caffe路径
sys.path.insert(0,cafferoot+'/python')  
import matplotlib.pyplot as plt 
from numpy import zeros,arange 
from math import ceil
import caffe   
caffe.set_device(0)  
caffe.set_mode_gpu()   
# 使用SGDsolver,即随机梯度下降算法,这个要看你solver文件里,一般不写的话就是sgd  
#solver=caffe.AdamSolver('/root/caffe/examples/mnist/lenet_solver_adam.prototxt')
solver = caffe.SGDSolver('/data_1/deep_learning_layer/layer/Resnet18/net/ResNet-18-depthwise/net_dw_thin/mobilenet_resnet18_solver.prototxt')  
  
# 等价于solver文件中的max_iter,即最大解算次数  
max_iter = 200000  
# 每隔100次收集一次数据  
display= 100  
  
# 每次测试进行100次解算,
test_iter = 100  
# 每10000次训练进行一次测试(100次解算)
test_interval =10000 
  
#初始化 
train_loss = zeros(int(max_iter * 1.0 / display))   
test_loss = zeros(int(max_iter * 1.0 / test_interval))  
test_acc = zeros(int(max_iter * 1.0 / test_interval))  
  
# iteration 0,不计入  
solver.step(1)  
  
# 辅助变量  
_train_loss = 0; _test_loss = 0; _accuracy = 0  
# 进行解算  
for it in range(max_iter):  
    # 进行一次解算  
    solver.step(1)  
    # 每迭代一次,训练batch_size张图片  
    _train_loss += solver.net.blobs['loss'].data  #注意,这里的‘loss’为你使用的网络中loss层的名称
 
    if it % display == 0:  
        # 计算平均train loss  
        train_loss[it // display] = _train_loss / display  
        _train_loss = 0  
  
    if it % test_interval == 0:  
        for test_it in range(test_iter):  
            # 进行一次测试  
            solver.test_nets[0].forward()  
            # 计算test loss  
            _test_loss += solver.test_nets[0].blobs['loss'].data	#注意,这里的‘loss’为你使用的网络中loss层的名称
            # 计算test accuracy  
            _accuracy += solver.test_nets[0].blobs['acc/top-1'].data	#注意,这里的‘acc/top-1’为你使用的网络中Accuracy层的名称
 
        # 计算平均test loss  
        test_loss[it / test_interval] = _test_loss / test_iter  
        # 计算平均test accuracy  
        test_acc[it / test_interval] = _accuracy / test_iter  
        _test_loss = 0  
        _accuracy = 0  
  
# 绘制train loss、test loss和accuracy曲线  
print '\nplot the train loss and test accuracy\n'  
_, ax1 = plt.subplots()  
ax2 = ax1.twinx()  
  
# train loss -> 绿色  
ax1.plot(display * arange(len(train_loss)), train_loss, 'g')  
# test loss -> 黄色  
ax1.plot(test_interval * arange(len(test_loss)), test_loss, 'y')  
# test accuracy -> 红色  
ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r')  
  
ax1.set_xlabel('iteration')  
ax1.set_ylabel('loss')  
ax2.set_ylabel('accuracy')  
plt.show()

 

你可能感兴趣的:(【caffe】使用python脚本训练分类模型,并可视化Loss和Accuracy.)