楼主自己改好的一个二分类卷积神经网络,识别率已经达到100%,用了900张train集,100张test集
本帖为zzou原创,未经博主同意不得转载,转载请注明出处。
现在我详细记录我的训练过程:
1.采集数据,我用的是一个叫做crazy_pic的软件从百度上down下来两个分类的图片各450张
其中不乏有一些图片会有格式错误,这时候需要用到类似格式工厂的工具把图片格式统一到JPG格式
2.存储数据
在caffe\data\目录下创建一个mine文件夹用来放数据,创建一个test文件夹,一个train文件夹,将图片每类分为train训练集400,test训练集50,并将图片统一命名,为方便后续加标签,然后创建两个.txt文档用来存放目录名称,并且加上标签,最简单的批处理命令得到目录:
将1.txt放到mine\目录下,并改名为test.txt或者train.txt
注意这时候路径是相对路径名(就是在data\mine\test\...的后面的路径)(和后面的转换时候的路径拼接起来)
然后加标签,我用的最笨的方法就是编辑替换,bike是a.jpg结尾的替换为a.jpg 0 , 0就是标签, 同理car为b.jpg 1。
3.转换数据
那么这时候数据我们就准备好了,我们需要把数据转换为leveldb格式,因为这个格式caffe才能处理
首先我们需要编译caffe\tools\目录下的convert_imageset.cpp编译成convert_imageset.exe,编译过程会遇到一系列问题自行解决,楼主是用编译好了的程序并且具有计算均值的功能
然后,我们需要编辑一个批处理命令调用这个程序将图片转换为leveldb格式。这个.bat文件要放在caffe\目录下
(我们可以注意到第二行第一项为调用程序,第二项为数据的路径,第三项为数据的目录文件,第四项为生成的数据文件,第五项1:表示数据输入时候被打乱)
那么这时候我们在data\mine\目录下会得到两个leveldb的文件夹,在caffe\目录下会得到一个均值文件imagenet_mean.binaryproto
这三个文件就是我们后续网络需要的输入。
4.创建网络
那么有了输入我们需要编写一个网络了
网络主要有两个文件:
一个是解决方案,用来控制我们网络的配置,solver.prototxt
还有一个是网络参数,train_val.prototxt (这个文件比较长而且参数较多,博主zzou将在下一篇博客中重点详细讲解)
把这两个文件放在caffe\example\mine目录下,然后,还需要把均值文件从caffe\目录下拷贝到这个训练目录下。
这时候我们就可以训练了
我们需要编写一个批处理命令来控制:train.bat
(如果你要用别人训练好的网络,那么你需要把数据层的source改成我们自己准备的路径)
(转载请注明出处:http://blog.csdn.net/q375010308/article/details/47126407)
这里面非常重要的几个参数需要在训练的时候根据自己的结果进行调整
base_lr:这个是初始学习率,非常重要,如果大了很可能就结果不收敛,太小很可能就不怎么变化
gamma:这个是学习率的变化率,我采用的是step的形式,每400次迭代缩小0.9倍。
5.测试训练
有了网格有了数据,我们解可以开始训练了,这时候,双击train.exe,泡好一杯caffe,坐等结果就可以了。
当然,前提是你的caffe也已经编译了,生成了MainCalle.exe,博主是在windows下编译的,用的是学长给的caffe版本,博主估摸着是niuzhizeng大神原创的
详细的版本问题看这里:http://blog.csdn.net/q375010308/article/details/46908041
(这是某次博主测试的结果,accurcay就是精确度,可以看到在2000次迭代后达到了99%!
你可以用Alex或者lenet或者别的已经被用过的网络来测试我的数据,识别率也就80左右)
那么接下来你就要分析你的数据结果,然后修改你的网络参数和网络配置,达到你需要的实验精度和速度
楼主在两天的尝试和修改参数后,AC最后终于达到了100%!(此处应该有掌声)。也就是说这个网络已经完美work了!识别个自行车汽车那是随便玩了。
解决二分类已经没问题了,楼主后期将继续测试10分类,100分类,1000分类。
进展:目前博主将这个二分类的网络用来直接用在10分类上10000张图片,top1识别率达到50%+,结果还不是很理想,还在改进当中。
本博客将持续更新,博主才疏学浅,难免有错误和不足之处,请大神指点迷津!
如有问题请联系博主邮箱交流:zzou@interjoy.com.cn