用自己的数据训练和测试“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。实践还是得跟进理论,不然很多东西都云里雾里的。
- 用自己的数据训练和测试“caffenet”
- Caffe_Windows学习笔记(二)用自己的数据训练和测试CaffeNet
- windows 训练、微调caffenet 训练测试自己的数据
- caffe示例实现之5用CaffeNet训练与测试自己的数据集
- caffe示例实现之5用CaffeNet训练与测试自己的数据集
- caffe示例实现之5用CaffeNet训练与测试自己的数据集
- caffe利用caffenet训练自己的图片数据
- caffe----训练自己的图片caffenet模型
- Tiny_cnn用自己的数据训练和测试
- Tiny_cnn用自己的数据训练和测试
- 利用自己的数据微调caffenet
- Caffe下自己的数据训练和测试
- Caffe下自己的数据训练和测试
- windows-caffe 训练和测试自己的数据集
- Caffe训练和测试自己的数据集
- Caffe训练和测试自己的数据集
- Caffe训练和测试自己的数据集
- FCN制作自己的数据集、训练和测试 caffe
- 30 从n个数中随机获取m个数字
- LeetCode11. Container With Most Water最容易理解的解法
- 2016.1.19 ACM算法讨论群 群赛
- C/C++编码规范
- maven测试指定类或方法
- 用自己的数据训练和测试“caffenet”
- 83.Reverse Integer
- 从关系型数据库到非关系型数据库
- 上传裁剪头像(Jcrop)
- POJ 3020(二分图之最小路径覆盖)
- Huffman树
- Java EE V7.0学习笔记-WildFly 代码案例
- 1012. 数字分类 (20)
- MVC中的几个细节点