Windows下caffe训练自己的数据

来源:互联网 发布:mac照片占用空间 编辑:程序博客网 时间:2024/05/17 02:44

使用的是happynear版本的caffe,编译过程传送门:http://blog.csdn.net/happynear/article/details/45372231

1.数据格式转换

Caffe的数据格式采用leveldb或者lmdb格式的,第一步要做的就是数据的格式转换了。

编译conver_imageset,在bin目录下生成convert_imageset.exe.

在caffe根目录下新建data文件夹,在data文件夹下新建本次实验起名为CharacterDiscrimination文件夹,之后的数据安排如下:


train和val存放原始的数据,trainldb和valldb存放格式转换后的leveldb数据,mean存放均值文件,实验数据选取的是字符和非字符二分类问题。部分数据大概如下:

部分正例:



部分负例:



用批处理命令对数据加标签

dir /b/s/p/w *.png > num.txt

生成如图所示:

利用替换功能调整为以下格式,0为该组数据对应的标签,对所有数据均做以下处理。


每一类都生成对应的标签后,对train和val生成总的样本标签(bat命令还不熟,以后再说吧o(╯□╰)o)

@echo off
set d=E:\my project\caffe-windows-master\caffe-windows-master\data\mine\train
pushd %d%
del train.tmp 2>nul
for /f "tokens=*" %%i in ('dir/b/s *.txt') do type "%%i">>train.txt

ren train.tmp train.txt
popd

得到所有训练样本的标签,并保存到train.txt内。val同样的操作。

利用convert_imageset.exe生成对应的leveldb格式数据,注意参数和路径,参数部分可以查看conver_imageset.cpp文件中的定义

SET GLOG_logtostderr=1
.\bin\convert_imageset.exe --backend=leveldb --resize_width=32 --resize_height=32 E:\myproject\caffe-windows-master\caffe-windows-master\data\CharacterDiscrimination E:\myproject\caffe-windows-master\caffe-windows-master\data\CharacterDiscrimination\train\train.txt E:\myproject\caffe-windows-master\caffe-windows-master\data\CharacterDiscrimination\trainldb 
pause

生成成功后得到以下信息:


trainldb文件夹下生成对应的文件:



其他格式的数据转换,比如binary等可以参考examples下cifar10和mnist下的样例。早晚还是要自己写的。

2.数据预处理

这一步主要计算数据的均值,得到均值文件,一般来说,训练集减去均值文件后再进行训练效果会好一点,当然也可以对数据做其他处理。
同上编译compute_image_mean.cpp,执行compute_image_mean.exe
SET GLOG_logtostderr=1
.\bin\compute_image_mean.exe --backend leveldb E:\myproject\caffe-windows-master\caffe-windows-master\data\CharacterDiscrimination\trainldb E:\myproject\caffe-windows-master\caffe-windows-master\data\CharacterDiscrimination\train_mean.binaryproto
pause

生成均值文件:



3.定义网络结构并训练

使用bvlc_alexnet配置文件和solver,稍微修改下:


主要是修改一下路径。




接下来再写个bat命令,使用下caffe.exe

.\bin\caffe.exe train --solver=data/CharacterDiscrimination/train-val/solver.prototxt 
pause

接下来就等着训练吧








————————————————————————————————————————————————————————————————————————

caffe训练时遇到loss一直居高不下时:

http://blog.sina.com.cn/s/blog_141f234870102w941.html


另外,均值一般都是训练集的均值,测试集正常是不知道,无法求出来的。


我利用Caffe训练一个基于AlexNet的三分类分类器,将train_val.prototxt的全连接输出层的输出类别数目改为3,训练一直不收敛,loss很高;当把输出改成4或1000(>3)的时候,网络可以收敛。也就是caffenet结构的输出层的类别数一定要大于我训练集的类别数才可以收敛!后来查了半天才发现原因,让我泪奔。。。
原来我把图像类别的label设置成1,2,3,改成0,1,2后,最后全连接层的转出改成3就OK了。

————————————————————————————2017.3.10更新——————————————————————
统一说下评论区出现的可能问题
1.网络结构方面的配置信息:prototxt要根据自己的实际情况和数据集进行修改,每个参数的实际意义要自己弄清楚,文中给出的prototx只是个示例,具体还是要自己修改,每个参数的意义网上有,可以查一下,用法可以参见caffe.prototxt(添加自己的layer时会需要在这里加参数的),还有loss不降可能是学习率设置的问题,我最近在vgg-face的模型上finetune其他人脸数据时,学习率用0.01,怎么训练都没啥结果,换成0.0001,loss就开始降了,accuracy也挺满意。
还有就是当时写bat文件时用的都是些绝对路径,自己调整好就可以了,这个看下报错信息,问题不大

Reference:

1.在caffe上跑自己的数据

2.如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口



1 0