在caffe提供的例程当中,例如mnist与cifar10中,数据集的准备均是通过调用代码自己完成的,而对于ImageNet1000类的数据库,对于高校实验室而言,常常面临电脑内存不足的尴尬境地。而对于应用者而言,用适合于自己条件的的数据集在caffe下训练及测试才是更重要的。所以我们有必要自己做数据库以及在caffe上训练及测试。
1,数据准备
在data中新建文件夹myself,我们截取了ImageNet1000类中的两类—panda与sea_horse,训练panda的图片24张,测试panda的图片6张,训练sea_horse的图片38张,测试sea_horse的图片7张。如图所示:
培训和测试的输入是用train.txt和val.txt描述的,这些文档列出所有文件和他们的标签。注意,在imagenet1000类中,我们分类的名字是ASCII码的顺序,即0-999,对应的分类名和数字的映射在synset_words.txt(自己写)中。
运行以下指令:
find -name *.jpeg |cut -d ‘/‘ -f2-3> train.txt
注意路径
然后,因为自己的数据库样本数比较少,可以自行手动做分类标签。在train.txt的每个照片后用1-2分类。如图:
当样本过多,就自己编写指令批量处理。
同理,获得val.txt。matlab(windows下)批量处理代码如下:
% batch write in txt
clear all
clc
file=dir(‘F:\animal\sea_horse‘);
temp=length(file);
file=file(3:temp);
fp=fopen(‘F:\animal\animal.txt‘,‘at‘);
% ‘at‘ open or create file for reading and writing; append data to end of file
% ‘wt‘ discard existing contents
for n=1:length(file)
fprintf(‘iter=%d\n‘,n)
txt=[file(n).name ‘ 2‘ ‘\n‘];
fprintf(fp,txt);
end
fclose(fp);
Test.txt不能标签,全部设置成0。
我们还需要把图片的大小变成256X256,官网上提供了下面的命令:
for name in /path/to/imagenet/val/*.JPEG; do
convert -resize 256x256\! $name $name
done
但是我自己并没有成功,就只好用matlab(windows下)代码处理了一下:
for n=1:length(file)
temp=imread([‘F:\animal\panda\‘ file(n).name]);
temp=imresize(temp,2);
temp=imresize(temp,[256 256]);
imwrite(temp,[‘F:\animal\panda\‘ file(n).name]);
end
然后在caffe-master/examples中新建myself文件夹,然后将caffe-maester/examples/imagenet的create_imagenet.sh复制到该文件夹下,将其名改为create_animal.sh,修改训练和测试路径的设置,运行该sh.如图:
最后得到myself_train_lmdb和myself_val_lmdb:
2 计算图像均值
模型需要我们从每张图片减去均值,所以我们必须获得训练的均值,用
tools/compute_image_mean.cpp实现,这个cpp是一个很好的例子去熟悉如何操作多个组建,例如协议的缓冲区,leveldbs,登录等。我们同样复制caffe-maester/examples/imagenet的
./make_imagenet_mean到examples/myself中,将其改名为make_animal_mean.sh,加以修改路径。
3 网络的定义
把caffe-master/models/bvlc_reference_caffenet中所有文件复制到caffe-master/examples/myself文件夹中,修改train_val.prototxt,注意修改数据层的路径。如图:
如果你细心观察train_val.prototext,你会发现他们除了数据来源不同和最后一层不同,其他基本相同。在训练中,我们用一个softmax——loss层计算损失函数和初始化反向传播,而在验证,我们使用精度层检测我们的精度。
我们还有一个运行的协议solver.prototxt,复制过来,将第一行路径改为我们的路径net: “examples/myself/train_val.prototxt”,从里面可以观察到,我们将运行256批次,迭代4500000次(90期),每1000次迭代,我们测试学习网络验证数据,我们设置初始的学习率为0.01,每100000(20期)次迭代减少学习率,显示一次信息,训练的weight_decay为0.0005,每10000次迭代,我们显示一下当前状态。
以上是教程的,实际上,以上需要耗费很长时间,因此,我们稍微改一下
test_iter: 1000是指测试的批次,我们就10张照片,设置10就可以了。
test_interval: 1000是指每1000次迭代测试一次,我们改成500次测试一次。
base_lr: 0.01是基础学习率,因为数据量小,0.01就会下降太快了,因此改成0.001
lr_policy: “step”学习率变化
gamma: 0.1学习率变化的比率
stepsize: 100000每100000次迭代减少学习率
display: 20每20层显示一次
max_iter: 450000最大迭代次数,
momentum: 0.9学习的参数,不用变
weight_decay: 0.0005学习的参数,不用变
snapshot: 10000每迭代10000次显示状态,这里改为2000次
solver_mode: GPU末尾加一行,代表用GPU进行
4 训练
把caffe-master/examples/imagenet中的train_caffenet.sh复制过来并修改名为train_myself.sh运行,修改里面的路径,如图:
当然,只有两类,正确率还是相当的高,例如迭代到2000次的时候,正确率是0.924,即13张var样本只有1张预测错了。
如图:
5 恢复数据
把caffe-master/examples/imagenet中的resume_training.sh复制过来并运行。
我们用指令./即可。
参照材料:学习笔记3 用自己的数据训练和测试“CaffeNet” 2014.7.22 薛开宇
Caffe官网 ImageNet tutorial
版权声明:本文为博主原创文章,未经博主允许不得转载。