您的位置:首页 > Web前端

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

2016-01-24 20:46 447 查看
本次实验本来参考examples/imagenet下的readme.txt进行,但因为数据集过于庞大,所以模拟学习,参考薛开宇的学习方式,模仿搭建自己的数据库。

首先在caffe/data下新建文件夹myself,然后在网上下载猫、鸟、狗的训练图片各50张,测试图片17,11,14张。为了方便,把图片名修改,使用python,代码如下:

[code]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.

[code] 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 就可以了,像杨青就是这样做的。如果我们希望更简单,用下面的命令:

[code]for name in train/bird/*.JPEG ; do  convert -resize 256x256\! $name $name; done
for name in train/dog/*.JPEG ; do  convert -resize 256x256\! $name $name; done
for name in train/cat/*.JPEG ; do  convert -resize 256x256\! $name $name; done
for 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,注意修改数据层的路径。如图:

[code]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。实践还是得跟进理论,不然很多东西都云里雾里的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: