【机器学习】caffe:solver、train、val、deploy配置和线性回归神经网络

简单的线性回归是回归理论的入门基础。简单线性回归的公式为 y=wTx+b ,其中y、w、x均为多维向量数据。求解线性回归,就是在已知y和x的情况下,求解参数 wT 和b。求解方法参见【机器学习】线性回归
现在我用python版本的caffe,构建一个神经网络来拟合上述简单的线性回归。首先我要构建一个solver配置文件,该配置文件定义了公共的参数,比如给定训练和测试的神经网络文件的路径,学习率,迭代步数等。我用python写出solver文件:

from caffe.proto import caffe_pb2
solver_config = caffe_pb2.SolverParameter()
solver_config.test_interval = 50#每隔50次,进行一次test
solver_config.base_lr = 0.00001#学习率
solver_config.momentum = 0.9#冲量单元,有助于训练过程中逃离局部最小值
solver_config.weight_decay = 0.0005#正则项洗漱
solver_config.lr_policy = 'sigmoid'#学习率衰减方法
solver_config.gamma = 0.001#学习率衰减方法参数
solver_config.power = 0.75#学习率衰减方法
solver_config.max_iter = 20000#最大迭代次数
solver_config.stepsize=3#每隔几次学习率衰减一下
solver_config.display = 20#每隔几次显示进度
solver_config.type ='SGD'#网络类型
solver_config.train_net = './train.txt'#训练网络文件
solver_config.test_net.append('./test.txt')#测试网络文件
solver_config.test_iter.append(50)#测试网络运行batch次数
solver_config.snapshot = 20000#每隔几次保存一次
solver_config.snapshot_prefix = './my'
solver_config.solver_mode = proto.caffe_pb2.SolverParameter.CPU#用CPU计算
with open('./solver.txt', 'w') as f:
    f.write(str(solver_config))

由于我只是构建一个简单的线性回归神经网络,所以不需要大动干戈制备lmdb或者hdf5文件。我使用MemoryDataLayer来直接获取我定义的数据。每个solver包含一个训练网络,多个测试网络,所以test_net相关项目需要使用append函数。
构建训练和测试神经网络,我用了两层全连接层来拟合,其实这个神经网络只有一层全连接层,只是方便展示而已:

import caffe
from caffe import layers as L,proto,to_proto
from caffe import params as P
trainer = caffe.NetSpec()
trainer.data,trainer.label = L.MemoryData(batch_size=10, height=1, width=2, channels=1,ntop=2)#每次迭代一次性训练10个元素,元素尺寸为1*1*2,输出两个数据
trainer.ip1 = L.InnerProduct(trainer.data, num_output=3, weight_filler=dict(type='xavier'))#用xavier方法初始化,有3个神经节点
trainer.ip2 = L.InnerProduct(trainer.ip1, num_output=1, weight_filler=dict(type='xavier'))#用xavier方法初始化,输出一个数据
trainer.eu1 = L.EuclideanLoss(trainer.ip2, trainer.label)#用欧式距离表示损失
with open('./train.txt', 'w') as f:
    f.write(str(trainer.to_proto()))

tester = caffe.NetSpec()
tester.data,tester.label = L.MemoryData(batch_size=10, height=1, width=2, channels=1,ntop=2)
tester.ip1 = L.InnerProduct(tester.data, num_output=3, weight_filler=dict(type='xavier'))
tester.ip2 = L.InnerProduct(tester.ip1, num_output=1, weight_filler=dict(type='xavier'))
tester.eu1 = L.EuclideanLoss(tester.ip2, tester.label)
with open('./test.txt', 'w') as f:
    f.write(str(tester.to_proto()))

Accuracy层是用来比较分类标签是否一致的,而不是label和输出数据的差异百分比,因此不能用在这里。
现在solver,train,test配置文件都有了,开始给出训练和测试数据,我设定线性回归公式为 y=2.0x+5.0 ,然后加入随机噪声:

import numpy as np
train_X = np.array([[np.float(i),1] for i in xrange(-49, 51)], np.float32)
train_Y = train_X[:,0] * 2.0 +5.0 + (np.random.random()-0.5) * 2.0
sz = len(train_X)
train_X = train_X.reshape((sz,1,1,2))
train_Y = train_Y.reshape((sz,1,1,1))

test_X = np.array([[np.float(i),1] for i in xrange(0, 150)], np.float32)
test_Y = test_X[:,0] * 2.0 +5.0 + (np.random.random()-0.5) * 2.0
sz = len(test_X)
test_X = test_X.reshape((sz,1,1,2))
test_Y = test_Y.reshape((sz,1,1,1))

其中train_X里面有个常量1,用于表征b参数。
然后执行训练:

sgd = caffe.SGDSolver('./solver.txt')
sgd.net.set_input_arrays(train_X, train_Y)
sgd.test_nets[0].set_input_arrays(test_X, test_Y)
sgd.solve()

训练完,caffemodel和solverstate文件都自动保存下来。
要使用训练好的caffemodel,需要再编写一个deploy配置文件:

deployer = caffe.NetSpec()
deployer.ip1 = L.InnerProduct(bottom='data', num_output=3, weight_filler=dict(type='xavier'))
deployer.ip2 = L.InnerProduct(deployer.ip1, num_output=1, weight_filler=dict(type='xavier'))
with open('./deploy.txt', 'w') as f:
    f.write('layer {\n  name: "data"\n  type: "Input"\n  ')
    f.write('top: "data"\n  input_param { shape: { dim: 2 dim: 1 dim: 1 dim: 2 } }\n}\n')
    f.write(str(deployer.to_proto()))

deploy配置文件的第一层是InputLayer,暂时没有找到对应的caffe layer,所以直接写出来了。最后一层不包含EuclideanLossLayer,我只需要输出数值就行。
现在制造测试数据,然后进行测试:

des_X = np.array([[-60.0,1.0],[70.0,1.0]], np.float32)
sz = 2
des_X = des_X.reshape((sz,1,1,2))

deploynet = caffe.Net('./deploy.txt', './my_iter_20000.caffemodel', caffe.TEST)
deploynet.blobs['data'].data[...]=des_X
out = deploynet.forward()
out['ip2']

神经网络输出为-115.06198883和144.93806458,正确结果是 60×2+5=115,70×2+5=145 。神经网络拟合的还算好。
请注意,caffe神经网络网络中data层的batch_size必须能整除测试数据个数,否则会报错退出,这并不方便。caffe的改进还任重道远。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值