Caffe 实例笔记 3 Brewing Logistic Regression then Going Deeper

From now on, I will try to write some blogs in English to improve my English writing skills. If there is anything wrong in the blogs ,please let me know. Thanks.
In this example, we will
1. use caffe as a generic SGD optimizer to train logistic regression ,
2. and then we will add layers to improve accuracy.

1 classify with sklearn

shutil - Utility functions for copying and archiving files and directory trees.

Note the following function when generate a binary classification:

sklearn.datasets.make_classification(...)
sklearn.cross_validation.train_test_split(X,y)
ind=np.random.permutation(X.shape[0])[:1000]
df=pd.DataFrame(X[ind])
_=pd.scatter_matrix(df,figsize=(9,9),diagonal='kde',marker='o',s=40,alpha=0.4,c=y[ind])#alpha=transparency
clf = sklearn.linear_model.SGDClassifier(...)
clf.fit(X, y)
yt_pred = clf.predict(Xt)
print('Accuracy: {:.3f}'.format(sklearn.metrics.accuracy_score(yt, yt_pred)))

we can get the result like this:
accuracy:0.772
accuracy:0.772
accuracy:0.772
accuracy:0.772
1 loops, best of 3: 443 ms per loop

2 use caffe

2.1 save dataset to HDF5

?

dirname=os.path.abspath('/home/beatree/caffe-rc3/examples/hdf5_classification/data')
if not os.path.exists(dirname):
    os.makedirs(dirname)
train_filename=os.path.join(dirname,'train.h5')
test_filename=os.path.join(dirname,'test.h5')
with h5py.File(train_filename,'w')as f:
    f['data']=X
    f['label']=y.astype(np.float32)
with open(os.path.join(dirname,'train.txt'),'w') as f:
    f.write(train_filename+'\n')#why list the same data file twice???
    f.write(train_filename+'\n')
comp_kwargs={'compression':'gzip','compression_opts':1}
with h5py.File(test_filename,'w')as f: 
    f.create_dataset('data',data=Xt,**comp_kwargs)
    f.create_dataset('label',data=yt.astype(np.float32),**comp_kwargs)
with open (os.path.join(dirname,'test.txt'),'w')as f:
    f.write(test_filename+'\n')

2.2 prottobuf model(shallow)

from caffe import layers as L
from caffe import params as P
def logreg(hdf5,batch_size):
    n=caffe.NetSpec()
    n.data,n.label=L.HDF5Data(batch_size=batch_size,source=hdf5,ntop=2)
    n.ip1=L.InnerProduct(n.data,num_output=2,weight_filler=dict(type='xavier'))
    n.accuracy=L.Accuracy(n.ip1,n.label)
    n.loss=L.SoftmaxWithLoss(n.ip1,n.label)
    return n.to_proto()
train_net_path='/home/beatree/caffe-rc3/examples/hdf5_classification/logreg_auto_train.prototxt'
test_net_path='/home/beatree/caffe-rc3/examples/hdf5_classification/logreg_auto_test.prototxt'
with open(train_net_path,'w')as f:
    f.write(str(logreg('/home/beatree/caffe-rc3/examples/hdf5_classification/data/train.txt',10)))
with open(test_net_path,'w')as f:
    f.write(str(logreg('/home/beatree/caffe-rc3/examples/hdf5_classification/data/test.txt',10)))

solver.prototxt

from caffe.proto import caffe_pb2
def solver(train_net_path,test_net_path):
    s= caffe_pb2.SolverParameter()
    s.train_net= train_net_path
    s.test_net.append(test_net_path)
    s.test_interval=1000
    s.test_iter.append(250)
    s.max_iter=10000
    s.base_lr=0.01
    s.lr_policy='step'
    s.gamma=0.1
    s.stepsize=5000
    s.momentum=0.9
    s.weight_decay=5e-4
    s.display=1000
    s.snapshot=10000
    s.snapshot_prefix='/home/beatree/caffe-rc3/examples/hdf5_classification/data/train'
    s.solver_mode=caffe_pb2.SolverParameter.CPU
    return s
solver_path='/home/beatree/caffe-rc3/examples/hdf5_classification/logreg_solver.protxt'
with open (solver_path,'w') as f:
    f.write(str(solver(train_net_path,test_net_path)))
%%timeit
caffe.set_mode_cpu()
solver=caffe.get_solver(solver_path)
solver.solve()
accuracy=0
batch_size=solver.test_nets[0].blobs['data'].num
test_iters=int(len(Xt)/batch_size)
for i in range (test_iters):
    solver.test_nets[0].forward()
    accuracy+=solver.test_nets[0].blobs['accuracy'].data
accuracy/=test_iters
print ('accuracy:{:.3}'.format(accuracy))

accuracy:0.771
accuracy:0.771
10 loops, best of 3: 156 ms per loop

2.3 deeper model

from caffe import layers as L
from caffe import params as P
def nonlinear_net(hdf5,batch_size):
    n=caffe.NetSpec()
    n.data,n.label=L.HDF5Data(batch_size=batch_size,source=hdf5,ntop=2)
    n.ip1=L.InnerProduct(n.data,num_output=40,weight_filler=dict(type='xavier'))
    n.relu1=L.ReLU(n.ip1,in_place=True)
    n.ip2=L.InnerProduct(n.relu1,num_output=2,weight_filler=dict(type='xavier'))
    n.accuracy=L.Accuracy(n.ip2,n.label)
    n.loss=L.SoftmaxWithLoss(n.ip2,n.label)
    return n.to_proto()
train_net_path='/home/beatree/caffe-rc3/examples/hdf5_classification/nonlinear_auto_train.prototxt'
test_net_path='/home/beatree/caffe-rc3/examples/hdf5_classification/nonlinear_auto_test.prototxt'
with open(train_net_path,'w')as f:
    f.write(str(nonlinear_net('/home/beatree/caffe-rc3/examples/hdf5_classification/data/train.txt',10)))
with open(test_net_path,'w')as f:
    f.write(str(nonlinear_net('/home/beatree/caffe-rc3/examples/hdf5_classification/data/test.txt',10)))
solver_path='/home/beatree/caffe-rc3/examples/hdf5_classification/nonliear_logreg_solver.prototxt'
with open (solver_path,'w') as f:
    f.write(str(solver(train_net_path,test_net_path)))
%%timeit
caffe.set_mode_cpu()
solver=caffe.get_solver(solver_path)
solver.solve()
accuracy=0
batch_size=solver.test_nets[0].blobs['data'].num
test_iters=int(len(Xt)/batch_size)
for i in range (test_iters):
    solver.test_nets[0].forward()
    accuracy+=solver.test_nets[0].blobs['accuracy'].data
accuracy/=test_iters
print ('acc:{:.3}'.format(accuracy))

acc:0.827
acc:0.826
acc:0.828
acc:0.829
1 loops, best of 3: 254 ms per loop

we get a higher accuracy!
finally,if you want to clean up the dir

shutil.remtree(dirname)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值