先验知识:
(1)如何配置caffe for windows的python接口;
(2)如何将图片转换成LMDB格式;
(3)如何计算训练数据的均值文件。
我们知道。Caffe是用C++语言写的,C++是一门相对比较复杂的语言,可能很多人不太熟悉,因此想用更为简单的脚本语言来实现。
Caffe提供matlab和python接口,这两种语言就非常简单,而且非常容易进行可视化,使得我们的学习更加快速,理解更加深入。
在初步用了caffe for windows之后,我决定采用python接口。python是一门以前没有接触过的语言,所以在此记录了一些使用过程中的笔记。
首先,我按照前面的内容配置了python接口,紧接着第一步要做的,就是写配置文件。将通过下面的代码来学习:
from __future__ import print_function
from caffe import layers as L,params as P,to_proto
from caffe.proto import caffe_pb2
path='E:/CaffeDev/caffe-master/data/mypython1/'
#保存数据和配置文件的路径
train_lmdb=path+'train_db'
val_lmdb=path+'val_db'
#意思是说train_lmdb和val_lmdb是两个路径的名字
mean_file=path+'mean.binaryproto'
#意思是说mean_file是一个路径
train_proto=path+'train.prototxt'
val_proto=path+'val.prototxt'
#意思是train.prototxt和val.prototxt同样生成后放在这个路径下面
#现在我们编写一个网络,用于生成网络
def create_net(lmdb,batch_size,include_acc=False):
#创建第一层:数据层。向上传递两类数据:图片数据和对应的标签
data,label = L.Data(source=lmdb,backend=P.Data.LMDB,batch_size=batch_size,ntop=2,
transform_param=dict(crop_size=40,mean_file=mean_file,mirror=True))
#创建第二层:卷积层
conv1=L.Convolution(data,kernel_size=5,stride=1,num_output=16,pad=2,weight_filler=dict(type='xavier'))
#创建激活函数层
relu1=L.ReLU(conv1,in_place=True)
#创建池化层
pool1=L.Pooling(relu1,pool=P.Pooling.MAX,kernel_size=3,stride=2)
conv2=L.Convolution(pool1,kernel_size=3,stride=1,num_output=32,pad=1,weight_filler=dict(type='xavier'))
relu2=L.ReLU(conv2,in_place=True)
pool2=L.Pooling(relu2,pool=P.Pooling.MAX,kernel_size=3,stride=2)
#创建一个全连接层
fc3=L.InnerProduct(pool2,num_output=1024,weight_filler=dict(type='xavier'))
relu3=L.ReLU(fc3,in_place=True)
#创建一个Dropout层
drop3=L.Dropout(relu3,in_place=True)
fc4=L.InnerProduct(drop3,num_output=10,weight_filler=dict(type='xavier'))
loss=L.SoftmaxWithLoss(fc4,label)
#在训练阶段,不需要accuracy层,但是在验证阶段,是需要的
if include_acc:
acc=L.Accuracy(fc4,label)
return to_proto(loss,acc)
else:
return to_proto(loss)
def write_net():
#将以上的设置写入到prototxt文件
with open(train_proto, 'w') as f:
f.write(str(create_net(train_lmdb,batch_size=64)))
#写入配置文件
with open(val_proto, 'w') as f:
f.write(str(create_net(val_lmdb,batch_size=32,include_acc=True)))
if __name__ == '__main__':
write_net()
通过上面这个文件的执行,将会在相应的路径下得到两个配置文件:train.prototxt和val.prototxt,分别用于训练阶段和验证阶段。