# -*- coding:utf-8 -*- # è®ç»åæµè¯æä»¶ # è®ç»ç½ç» import caffe import numpy as np import matplotlib.pyplot as plt import math def crop_network(prune_proto, caffemodel, prune_caffemodel): # æªåå·²ç¥ç½ç»çé¨åå± # caffemodelç½ç»æéå¼å¹¶ä¸è¦æ±å ¶ç»æä¸protoç¸å¯¹åº # ç½ç»åªä¼åtrain_protoä¸å®ä¹çç»æä¸æéä½ä¸ºç½ç»çåå§æéå¼ # å æ¤ï¼å½æä»¬éè¦æªåæäºå·²è®ç»ç½ç»çç¹å®å±ä½ä¸ºæ°ç½ç»çæäºå±çæéåå§å¼ï¼åªéè¦å¨å ¶train_protoå®ä¹ååçå± # ä¹åcaffeå°å¨caffemodel䏿¾å°ä¸train_protoå®ä¹çååç»æï¼å¹¶å°å ¶æéä½ä¸ºåºç¨æéåå§å¼ã # prune_deploy: éæ©ä¿ççç½ç»ç»æå±:prototxt # caffemodel: å·²ç¥ç½ç»çæéè¿æ¥ # prune_caffemodelï¼æªæç½ç»çæéè¿æ¥æä»¶ net = caffe.Net(prune_proto, caffemodel, caffe.TEST) net.save(prune_caffemodel) def train(solver_proto, caffemodel='', is_step=True, savefig=''): # è®ç»æ¨¡å彿° # solver_proto: è®ç»é ç½®æä»¶ # caffemodelï¼é¢è®¾æé弿è å¿«ç §çï¼å¹¶ä¸è¦æ±å ¶ç»æä¸ç½ç»ç»æç¸å¯¹åºï¼ä½åªä¼åä¸è®ç»ç½ç»ç»æç¸å¯¹åºçæéå¼ # is_step: Trueè¡¨ç¤ºææ¥è®ç»ï¼Falseè¡¨ç¤ºç´æ¥å®æè®ç» # savefig: 表示è¦ä¿åçå¾åè®ç»æ¶æå¤±ååå¾ # 设置è®ç»å¨ï¼éæºæ¢¯åº¦ä¸éç®æ³ solver = caffe.SGDSolver(solver_proto) if caffemodel!='': solver.net.copy_from(caffemodel) if is_step==False: # ç´æ¥å®æè®ç» solver.solve() else: # è¿ä»£æ¬¡æ° max_iter = 10000 # æ¯é100次æ¶é䏿¬¡æ°æ® display = 100 # æ¯æ¬¡æµè¯è¿è¡100次解ç®ï¼10000/100 test_iter = 100 # æ¯500次è®ç»è¿è¡ä¸æ¬¡æµè¯ï¼100次解ç®ï¼ï¼60000/64 test_interval = 500 # åå§å train_loss = np.zeros(int(math.ceil(max_iter * 1.0 / display))) test_loss = np.zeros(int(math.ceil(max_iter * 1.0 / test_interval))) test_acc = np.zeros(int(math.ceil(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 # æåä¸å±çæå¤±å¼ if it % display == 0: # 计ç®å¹³åtrain loss train_loss[int(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 # 计ç®test accuracy _accuracy += solver.test_nets[0].blobs['accuracy'].data # 计ç®å¹³å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 * np.arange(len(train_loss)), train_loss, 'g') # test loss -> é»è² ax1.plot(test_interval * np.arange(len(test_loss)), test_loss, 'y') # test accuracy -> çº¢è² ax2.plot(test_interval * np.arange(len(test_acc)), test_acc, 'r') ax1.set_xlabel('iteration') ax1.set_ylabel('loss') ax2.set_ylabel('accuracy') if savefig!='': plt.savefig(savefig) plt.show() #CPUæGPU模åè½¬æ¢ #caffe.set_mode_cpu() caffe.set_device(0) caffe.set_mode_gpu() caffe_root = '../../' # caffe_root = 'E:/Code/Github/windows_caffe/' model_root = caffe_root + 'models/mnist/' solver_proto = model_root + 'solver.prototxt' train(solver_proto, caffemodel='', is_step=True)