用自己的数据训练和测试“caffenet”

来源:互联网 发布:java多线程api 编辑:程序博客网 时间:2024/06/04 14:51

本次实验本来参考examples/imagenet下的readme.txt进行,但因为数据集过于庞大,所以模拟学习,参考薛开宇的学习方式,模仿搭建自己的数据库。
首先在caffe/data下新建文件夹myself,然后在网上下载猫、鸟、狗的训练图片各50张,测试图片17,11,14张。为了方便,把图片名修改,使用python,代码如下:

import os;def rename():    count=0;    name="dog";    path='/home/jack/caffe/data/myself/train/dog';    filelist=os.listdir(path)    for files in filelist:        olddir=os.path.join(path,files);        if os.path.isdir(olddir):            continue;        filename=os.path.splitext(files)[0];        filetype=os.path.splitext(files)[1];        newdir=os.path.join(path,name+str(count)+filetype);        os.rename(olddir, newdir);        count+=1;rename();

这里写图片描述

这里写图片描述
重复使用下面这几句话,最后将三类训练数据的文件名都复制到一起。至于文件格式为何要这样.是参考data/ilsvrc12下的train.txt和val.txt.

 find train/dog -name *.JPEG |cut -d '/' -f2-3 >train.txt sed "s/$/ 2/" ./train.txt>./train1.txt

这里写图片描述
这里写图片描述
这里写图片描述
当然我这方法比较蠢,也可以写脚本文件,或者使用python处理也是可以的。
此外还需要添加test.txt,内容和val.txt一致,不过最后面不跟分类标签,而是0.
我们还需要把图片的大小变成 256X256,但在一个集群环境,可以不明确的进行,使用Mapreduce 就可以了,像杨青就是这样做的。如果我们希望更简单,用下面的命令:

for name in train/bird/*.JPEG ; do  convert -resize 256x256\! $name $name; donefor name in train/dog/*.JPEG ; do  convert -resize 256x256\! $name $name; donefor name in train/cat/*.JPEG ; do  convert -resize 256x256\! $name $name; donefor name in val/*.JPEG ; do  convert -resize 256x256\! $name $name; done

接下来在caffe/examples中新建myself文件夹,然后将caffe/examples/imagenet的create_imagenet.sh复制到该文件夹下,将其名改为create_myimagenet.sh,修改训练和测试路径的设置,运行该sh.如图:
这里写图片描述
如果出现错误./create_myimagenet.sh: 39: ./create_myimagenet.sh: build/tools/convert_imageset: not found
Creating val lmdb...
./create_myimagenet.sh: 49: ./create_myimagenet.sh: build/tools/convert_imageset: not found
Done.

说明路径有问题,最好像我这样补全。完成后在examples/myself下多出连个文件夹,如下图
这里写图片描述

2 计算图像均值
减去图像均值会获得更好的效果,所以我们使用tools/compute_image_mean.cpp实现,这个cpp是一个很好的例子去熟悉如何操作多个组建,例如协议的缓冲区,leveldbs,登录等。我们同样复制caffe-maester/examples/imagenet的
./make_imagenet_mean到examples/myself中,将其改名为make_myimagenet_mean.sh,加以修改路径。
这里写图片描述
不管如何修改文件名和路径一定要对应,不然会有小问题出现。运行./make_myimagenet_mean.sh会在data/myself下出现myimagenet_mean.binaryproto文件
3 网络的定义
把caffe/models/bvlc_reference_caffenet中所有文件复制到caffe/examples/myself文件夹中,修改train_val.prototxt,注意修改数据层的路径。如图:

name: "CaffeNet"layer {  name: "data"  type: "Data"  top: "data"  top: "label"  include {    phase: TRAIN  }  transform_param {    mirror: true    crop_size: 227    mean_file: "data/myself/myimagenet_mean.binaryproto"  }# mean pixel / channel-wise mean instead of mean image#  transform_param {#    crop_size: 227#    mean_value: 104#    mean_value: 117#    mean_value: 123#    mirror: true#  }  data_param {    source: "examples/myself/ilsvrc12_train_lmdb"    batch_size: 256    backend: LMDB  }}layer {  name: "data"  type: "Data"  top: "data"  top: "label"  include {    phase: TEST  }  transform_param {    mirror: false    crop_size: 227    mean_file: "data/myself/myimagenet_mean.binaryproto"  }# mean pixel / channel-wise mean instead of mean image#  transform_param {#    crop_size: 227#    mean_value: 104#    mean_value: 117#    mean_value: 123#    mirror: false#  }  data_param {    source: "examples/myself/ilsvrc12_val_lmdb"    batch_size: 50    backend: LMDB  }}

从里面可以观察到,我们将运行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进行
如果出现错误cudasucess(2.0vs 0)out of memory之类的说明batchsize太大,我设置成4和5。然后如果训练不收敛就重试,我试了三次,每次用的时间都超过15个小时,2.1计算能力的电脑就是差,今天总算完成了。这里写图片描述
准确率并不高,可能是选的图片不是很好,这个也有关系的,另外我是有三类和他们的两类不一样。训练完成后结果存放在哪里我也不是很清楚,只知道myself前一级文件夹下有很多类似
myself_iter_160.caffemodel的文件出现。现在还不是很懂,此外还有查看GPU状态的指令nvidia-smi。实践还是得跟进理论,不然很多东西都云里雾里的。

1 0
原创粉丝点击