学习知识的一种方式是先会用然后再问为什么。
在安装完成caffe,根据caffe的提示下载完mnist训练测试数据,并且运行lenet训练模型之后,摆在眼前的问题就是我怎么用caffe训练自己的数据啊,mnist的数据通过脚本就可以下载创建成lmdb,我要训练自己的数据集该怎么做?
用caffe训练自己的数据,必须解决的问题有两个:1.如何输入数据, 2.如何定义输出
首先我们解决第一个问题:训练数据的输入,这里我们之介绍使用lmdb的方式
查看lenet的train_val.prototxt,数据的输入是通过data layer中的source参数指定的,并且输入数据的格式指定为lmdb,如果我们能够把我们的数据转换成lmdb,就可以作为输入数据,通过修改source的路径输入到网络中进行训练。在caffe目录下 的create_imagenet.sh脚本提供了一个将我们自己的数据转换成lmdb格式的模板,我们可以通过修改create_imagenet.sh脚本的方式生成自己的数据,需要修改的地方包括:输出文件的路径EXAMPLE,我们自己的数据存储路径DATA,我们的训练数据所在的路径TRAIN_DATA_ROOT和测试数据所在的路径TEST_DATA_ROOT,输出的lmdb数据的全名,如果需要对图片进行resize的话,需要将RESIZE设置为true,然后再设置RESIZE的HEIGHT和WIDTH。做了这些离生成自己的lmdb数据还差一步,在脚本中还有train.txt和val.txt,这两个文本是做什么的?train.txt和val.txt是对数据的描述,给出了每一个数据的类别,并且数据的类别最好从0开始,我们在生成lmdb之前,需要为我们自己的数据生成这两个文件,和我们的训练数据放置在同一个目录下,然后就可以运行脚本生成我们自己的训练数据。
在生成自己的lmdb数据之后,就可以修改train_val.prototxt,将自己的数据输入到网络中。
输入我们自己的数据之后,还有一个问题,就是我们数据的输出怎么办,假如我们的数据有10个类别,我在哪里输入到模型中?输出的定义查看LOSS层或者Accuracy层的上一层,修改盖层的num_output就可以了
然后就可以开始训练了,在进行训练时需要知道训练的参数在solver.prototxt和train_val.prototxt中都有定义,batch_size定义了每次取多少个数据进行训练或者测试,max_iter定义最大的迭代次数,test_iter定义了测试的次数,为了保证所有的数据都被测试test_iter和测试batch_size的乘积需要大于等于测试数据的总数。