用自己的数据训练和测试“caffenet”
2016-01-24 20:46
447 查看
本次实验本来参考examples/imagenet下的readme.txt进行,但因为数据集过于庞大,所以模拟学习,参考薛开宇的学习方式,模仿搭建自己的数据库。
首先在caffe/data下新建文件夹myself,然后在网上下载猫、鸟、狗的训练图片各50张,测试图片17,11,14张。为了方便,把图片名修改,使用python,代码如下:
重复使用下面这几句话,最后将三类训练数据的文件名都复制到一起。至于文件格式为何要这样.是参考data/ilsvrc12下的train.txt和val.txt.
当然我这方法比较蠢,也可以写脚本文件,或者使用python处理也是可以的。
此外还需要添加test.txt,内容和val.txt一致,不过最后面不跟分类标签,而是0.
我们还需要把图片的大小变成 256X256,但在一个集群环境,可以不明确的进行,使用Mapreduce 就可以了,像杨青就是这样做的。如果我们希望更简单,用下面的命令:
接下来在caffe/examples中新建myself文件夹,然后将caffe/examples/imagenet的create_imagenet.sh复制到该文件夹下,将其名改为create_myimagenet.sh,修改训练和测试路径的设置,运行该sh.如图:
如果出现错误
说明路径有问题,最好像我这样补全。完成后在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,注意修改数据层的路径。如图:
从里面可以观察到,我们将运行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。实践还是得跟进理论,不然很多东西都云里雾里的。
首先在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。实践还是得跟进理论,不然很多东西都云里雾里的。
相关文章推荐
- JavaScript Function(函数表达式)
- hadoop 权限错误 Permission denied: user=root, access=WRITE, inode="/":hdfs:super
- namenode 启动过程
- Json
- JavaScript的继承与多继承
- HTML笔记五,HTML5的多媒体支持
- <<编写可维护的javascript>> part2: 编程实践
- 编写可维护的Javascript读书笔记
- Codeforces Round #336 (Div. 1) A - Chain Reaction
- JSON.stringify 函数
- JSON.stringify 函数
- JSON.stringify 函数
- ZOJ1090 The Circumference of the Circle
- html+css制作简易版Baymax
- 如何发布Node模块到NPM社区
- 用css伪元素实现tooltip效果
- 网页内容的html标签补全和过滤的两种方法
- Difference between datacontract and messagecontract in wcf
- Educational Codeforces Round 6 A. Professor GukiZ's Robot 水
- CSS+DIV:理论实战缺一不可