caffe如何自定义网络以及自定义层(python)(三)
2016-11-21 16:47
393 查看
前面是学习调用和修改训练好的model,接下来是训练自己的模型,这个其实很简单了,前面已经介绍过很多种数据输入格式了,直接原来的配置文件中的数据替换成自己的数据。这一篇学习一下LeNet的python求解,按照官网的整理一下。
首先是数据集和配置文件准备:
调用python接口的调试代码:
最后的运行版本:
首先是数据集和配置文件准备:
caffe_root=/home/x/git/caffe pro=/home/x/git/caffe/examples/test_layer_lb/test_python/mnist sh $caffe_root/data/mnist/get_mnist.sh sh $caffe_root/examples/mnist/create_mnist.sh
调用python接口的调试代码:
#!/usr/bin/env python #coding=utf-8 import numpy as np from pylab import * caffe_root = '/home/x/git/caffe/' import sys sys.path.insert(0, caffe_root + 'python') import caffe # run scripts from caffe root import os os.chdir(caffe_root) os.chdir('examples') from caffe import layers as L, params as P #生成配置文件 def lenet(lmdb, batch_size): # our version of LeNet: a series of linear and simple nonlinear transformations #定义网络 n = caffe.NetSpec() n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb, transform_param=dict(scale=1./255), ntop=2) n.conv1 = L.Convolution(n.data, kernel_size=5, num_output=20, weight_filler=dict(type='xavier')) n.pool1 = L.Pooling(n.conv1, kernel_size=2, stride=2, pool=P.Pooling.MAX) n.conv2 = L.Convolution(n.pool1, kernel_size=5, num_output=50, weight_filler=dict(type='xavier')) n.pool2 = L.Pooling(n.conv2, kernel_size=2, stride=2, pool=P.Pooling.MAX) n.fc1 = L.InnerProduct(n.pool2, num_output=500, weight_filler=dict(type='xavier')) n.relu1 = L.ReLU(n.fc1, in_place=True) n.score = L.InnerProduct(n.relu1, num_output=10, weight_filler=dict(type='xavier')) n.loss = L.SoftmaxWithLoss(n.score, n.label) return n.to_proto() with open('/home/x/git/caffe/examples/mnist/lenet_auto_train.prototxt', 'w') as f: f.write(str(lenet('/home/x/git/caffe/examples/mnist/mnist_train_lmdb', 64))) with open('/home/x/git/caffe/examples/mnist/lenet_auto_test.prototxt', 'w') as f: f.write(str(lenet('/home/x/git/caffe/examples/mnist/mnist_test_lmdb', 100))) #加载求解文件和调试solver文件 caffe.set_device(0) caffe.set_mode_gpu() ### load the solver and create train and test nets solver = None # ignore this workaround for lmdb data (can't instantiate two solvers on the same data) solver = caffe.SGDSolver('/home/x/git/caffe/examples/mnist/lenet_auto_solver.prototxt') # each output is (batch size, feature dim, spatial dim) print [(k, v.data.shape) for k, v in solver.net.blobs.items()] # just print the weight sizes (we'll omit the biases) print [(k, v[0].data.shape) for k, v in solver.net.params.items()] print "++++++++++++++++++++++++++++++++++++net+++++++++++++++++++++++++++++++++++++++++" print type(solver) print dir(solver) #print help(solver) #print help(solver.net) #forward是个字典 print dir(solver.net.forward()) solver.net.forward() # train net print "++++++++++++++++++++++++++++++++test_nets+++++++++++++++++++++++++++++++++++++++" print dir(solver.test_nets) print len(solver.test_nets) print type(solver.test_nets) #是个长度为1的向量 print dir(solver.test_nets[0]) #是个实例化的方法 print type(solver.test_nets[0].forward) print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" solver.test_nets[0].forward() # test net (there can be more than one) # we use a little trick to tile the first eight images imshow(solver.net.blobs['data'].data[:8, 0].transpose(1, 0, 2).reshape(28, 8*28), cmap='gray'); axis('off') print 'train labels:', solver.net.blobs['label'].data[:8] #show() imshow(solver.test_nets[0].blobs['data'].data[:8, 0].transpose(1, 0, 2).reshape(28, 8*28), cmap='gray'); axis('off') print 'test labels:', solver.test_nets[0].blobs['label'].data[:8] #show() print "++++++++++++++++++++++++++++++++++step(1)++++++++++++++++ ++++++++++++++++++++++" print dir(solver.step) print type(solver.step) #iteration 0,不计入 #solver.step(1) print "++++++++++++++++++++++++++++++++++step(2)+++++++++++++++++++++++++++++++++++++++" #这个是迭代iteration个数,然后显示设置在配置文件中我设置1,5,10次(默认100) solver.step(40) print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" imshow(solver.net.params['conv1'][0].diff[:, 0].reshape(4, 5, 5, 5) .transpose(0, 2, 1, 3).reshape(4*5, 5*5), cmap='gray'); axis('off') #show() #一些求解迭代参数设置 #由于前面有迭代40次所以最后显示迭代220次(从0开始) niter = 200 test_interval = 25 # losses will also be stored in the log train_loss = zeros(niter) test_acc = zeros(int(np.ceil(niter / test_interval))) output = zeros((niter, 8, 10)) # 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 # store the output on the first test batch # (start the forward pass at conv1 to avoid loading new data) solver.test_nets[0].forward(start='conv1') output[it] = solver.test_nets[0].blobs['score'].data[:8] # run a full test every so often # (Caffe can also do this for us and write to a log, but we show here # how to do it directly in Python, where more complicated things are easier.) if it % test_interval == 0: print 'Iteration', it, 'testing...' correct = 0 for test_it in range(100): solver.test_nets[0].forward() correct += sum(solver.test_nets[0].blobs['score'].data.argmax(1) == solver.test_nets[0].blobs['label'].data) test_acc[it // test_interval] = correct / 1e4 #plot the train loss and test accuracy. _, ax1 = subplots() ax2 = ax1.twinx() ax1.plot(arange(niter), train_loss) ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r') ax1.set_xlabel('iteration') ax1.set_ylabel('train loss') ax2.set_ylabel('test accuracy') ax2.set_title('Test Accuracy: {:.2f}'.format(test_acc[-1])) show() for i in range(8): figure(figsize=(2, 2)) imshow(solver.test_nets[0].blobs['data'].data[i, 0], cmap='gray') figure(figsize=(10, 2)) imshow(output[:50, i].T, interpolation='nearest', cmap='gray') xlabel('iteration') ylabel('label') #show() for i in range(8): figure(figsize=(2, 2)) imshow(solver.test_nets[0].blobs['data'].data[i, 0], cmap='gray') figure(figsize=(10, 2)) imshow(exp(output[:50, i].T) / exp(output[:50, i].T).sum(0), interpolation='nearest', cmap='gray') xlabel('iteration') ylabel('label') #show()
最后的运行版本:
#!/usr/bin/env python #coding=utf-8 import numpy as np from pylab import * caffe_root = '/home/x/git/caffe/' import sys sys.path.insert(0, caffe_root + 'python') import caffe # run scripts from caffe root import os os.chdir(caffe_root) os.chdir('examples') from caffe import layers as L, params as P train_net_path = '/home/x/git/caffe/examples/mnist/custom_auto_train.prototxt' test_net_path = '/home/x/git/caffe/examples/mnist/custom_auto_test.prototxt' solver_config_path = '/home/x/git/caffe/examples/mnist/custom_auto_solver.prototxt' ### define net def custom_net(lmdb, batch_size): # define your own net! n = caffe.NetSpec() # keep this data layer for all networks n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb, transform_param=dict(scale=1./255), ntop=2) # EDIT HERE to try different networks # this single layer defines a simple linear classifier # (in particular this defines a multiway logistic regression) n.score = L.InnerProduct(n.data, num_output=10, weight_filler=dict(type='xavier')) # EDIT HERE this is the LeNet variant we have already tried # n.conv1 = L.Convolution(n.data, kernel_size=5, num_output=20, weight_filler=dict(type='xavier')) # n.pool1 = L.Pooling(n.conv1, kernel_size=2, stride=2, pool=P.Pooling.MAX) # n.conv2 = L.Convolution(n.pool1, kernel_size=5, num_output=50, weight_filler=dict(type='xavier')) # n.pool2 = L.Pooling(n.conv2, kernel_size=2, stride=2, pool=P.Pooling.MAX) # n.fc1 = L.InnerProduct(n.pool2, num_output=500, weight_filler=dict(type='xavier')) # EDIT HERE consider L.ELU or L.Sigmoid for the nonlinearity # n.relu1 = L.ReLU(n.fc1, in_place=True) # n.score = L.InnerProduct(n.fc1, num_output=10, weight_filler=dict(type='xavier')) # keep this loss layer for all networks n.loss = L.SoftmaxWithLoss(n.score, n.label) return n.to_proto() with open(train_net_path, 'w') as f: f.write(str(custom_net('mnist/mnist_train_lmdb', 64))) with open(test_net_path, 'w') as f: f.write(str(custom_net('mnist/mnist_test_lmdb', 100))) ### define solver from caffe.proto import caffe_pb2 s = caffe_pb2.SolverParameter() # Set a seed for reproducible experiments: # this controls for randomization in training. s.random_seed = 0xCAFFE # Specify locations of the train and (maybe) test networks. s.train_net = train_net_path s.test_net.append(test_net_path) s.test_interval = 500 # Test after every 500 training iterations. s.test_iter.append(100) # Test on 100 batches each time we test. s.max_iter = 10000 # no. of times to update the net (training iterations) # EDIT HERE to try different solvers # solver types include "SGD", "Adam", and "Nesterov" among others. s.type = "SGD" # Set the initial learning rate for SGD. s.base_lr = 0.01 # EDIT HERE to try different learning rates # Set momentum to accelerate learning by # taking weighted average of current and previous updates. s.momentum = 0.9 # Set weight decay to regularize and prevent overfitting s.weight_decay = 5e-4 # Set `lr_policy` to define how the learning rate changes during training. # This is the same policy as our default LeNet. s.lr_policy = 'inv' s.gamma = 0.0001 s.power = 0.75 # EDIT HERE to try the fixed rate (and compare with adaptive solvers) # `fixed` is the simplest policy that keeps the learning rate constant. # s.lr_policy = 'fixed' # Display the current training loss and accuracy every 1000 iterations. s.display = 1000 # Snapshots are files used to store networks we've trained. # We'll snapshot every 5K iterations -- twice during training. s.snapshot = 5000 s.snapshot_prefix = '/home/x/git/caffe/examples/test_layer_lb/test_python/mnist/custom_net' # Train on the GPU s.solver_mode = caffe_pb2.SolverParameter.GPU # Write the solver to a temporary file and return its filename. with open(solver_config_path, 'w') as f: f.write(str(s)) ### load the solver and create train and test nets solver = None # ignore this workaround for lmdb data (can't instantiate two solvers on the same data) solver = caffe.get_solver(solver_config_path) ### solve niter = 2500 # EDIT HERE increase to train for longer test_interval = niter / 10 # losses will also be stored in the log train_loss = zeros(niter) test_acc = 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 # run a full test every so often # (Caffe can also do this for us and write to a log, but we show here # how to do it directly in Python, where more complicated things are easier.) if it % test_interval == 0: print 'Iteration', it, 'testing...' correct = 0 for test_it in range(100): solver.test_nets[0].forward() correct += sum(solver.test_nets[0].blobs['score'].data.argmax(1) == solver.test_nets[0].blobs['label'].data) test_acc[it // test_interval] = correct / 1e4 _, ax1 = subplots() ax2 = ax1.twinx() ax1.plot(arange(niter), train_loss) ax2.plot(test_interval * arange(len(test_acc)), test_acc, 'r') ax1.set_xlabel('iteration') ax1.set_ylabel('train loss') ax2.set_ylabel('test accuracy') ax2.set_title('Custom Test Accuracy: {:.2f}'.format(test_acc[-1])) show()
相关文章推荐
- caffe如何自定义网络以及自定义层(python)(四)
- caffe如何自定义网络以及自定义层(python)(一)
- caffe如何自定义网络以及自定义层(python)(六)
- caffe如何自定义网络以及自定义层(python)(二)
- caffe如何自定义网络以及自定义层(python)(五)
- Caffe in Python之定义网络结构和添加自定义网络层
- caffe 实战系列:proto文件格式以及含义解析:如何定义网络,如何设置网络参数(以AlexNet为例)
- 如何在caffe中自定义网络层
- 如何在caffe中自定义网络层
- caffe 实战系列:proto文件格式以及含义解析:如何定义网络,如何设置网络参数(以AlexNet为例) 2016.3.30
- 如何针对自己的需要修改caffe的网络(Python)
- Moss/Sharepoint 如何自定义显示界面以及字段
- 什么是网络推广以及如何做好网络推广
- Python如何使用urllib2获取网络资源
- 【VSTO】创建 Excel 2007 AddIn (1. CommandBar 以及如何自定义Icon)
- 如何在DeepEarth中进行图形绘制(点、线、多边形以及自定义图片图层)
- 【转】Python如何使用urllib2获取网络资源(zz)
- [网络收集]用户自定义控件中如何引入样式文件
- ABAP–如何在’REUSE_ALV_GRID_DISPLAY’使用自定义F4帮助,返回多个字段以及计算修改其他字段
- 如何创建自定义winForm控件 以及添加事件属性