caffe训练网络的实践

  Caffe现如今已经成为了深度学习一个非常火的框架。但是作为刚接触CNN或者caffe的小白可能对caffe的接口或者细节不是很清楚了解。本文作为尝试着利用caffe做一个简单的图片分类model,希望能够与大家快速入门caffe训练属于自己的数据。

  首先,要准备自己的数据集。这次任务是训练手写的文本。请注意,并不是手写集Mnist,区别在于是手写完整的一页作为一类。一共有6类。肉眼看区别很小。下图为数据的描述性信息,并且每一类选出了一张图片展示给大家。

                            

  在用caffe进行分类之前。我们要对它进行标注,训练集测试集划分,并且将他们的图片尺寸进行统一。我们作为一次简单的实践,投机取巧,将它设置成256 * 256  imagenet标准格式(利用imagenet网络训练)。

  关于标注,在标注环节,我将图片按照不同类别放入不同索引,按照训练集:测试集=9:1的比例关系划分了,train和val两个目录。

  用一个Python脚本将其进行标注类别(形式无所谓,结果相同即可)。

                                                           效果如下图:图片名在前,类别在后。

                                                                       


  尺寸方面,如果在linux的环境下,我们可以很容易的调用convert 命令给图片进行 –resize. 参考语句如下:

                                                                 convert –resize 256x256 a.jpg a.jpg

  如果我们需要转换成mnist需要的单通道灰度图的话,我们还可以如下语句将其进行灰度转化:

                                                                 convert -monochrome a.jpg a.jpg

  建议做成sh 脚本,对图片进行批量的操作。

  

  下面,我们就可以尽情的调用caffe给我们留下的脚本,熟悉caffe流程。二来,利用前辈们的网路训练我们的数据。在这里,我们利用imagenet的网络。我们切换到/caffe-master/examples/imagenet 的路径下。

  第一步,我们需要明确,caffe在运行时需要的数据类型是lmdb和leveldb. 这个实现在了convert_imageset.cpp中。但是我们可以直接调用他们留下的sh脚本create_imagenet.sh。请注意改变一下各个路径(建议写绝对路径,不然每一次调用都需要在caffe-master下执行,非常麻烦)。当我们转化成caffe需要的数据格式lmdb之后目录下就会出现两个目录,一个是训练的目录,一个是测试的目录。

                                                               mydata_val_lmdb   mydata_train_lmdb

  下一步,我们需要计算均值,我们再一次调用make_imagenet_mean.sh。他会输出一个mydata_mean.binaryproto.至此,我们所有的准备工作宣告完成。下面就可以训练了。

  训练阶段,我们先去找/caffe-master/models/bvlc_reference_caffenet

路径下的solver.prototxt 修改我们的数据路径。另外就本次实验而言,如果GPU计算能力不是很足我建议将其中max_iter ,test_iter改一改。尽量改小一点,原因是是数据集量很小几百次iter就可以遍历所有图片不值得这么多迭代浪费计算量。我们注意到脚本里面调用了train_val.prototxt,所以有必要再看一眼train_val.prototxt。

layer {
  name: "fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1
    decay_mult: 1
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 6
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}


一是定义一下数据的路径,改一下最后的num_output,二来,我们可以窥探一下网络结构(比minst)复杂得多,为了以后做结构的研究做好准备。

一切就绪之后,我们就启动train_caffenet.sh 让他尽情的run吧。

                                                              下面附上一张GPU策马奔腾奔跑的图片:)



Tips:这一次的网络是imagenet,也许运行的时间会很长。实验室的GPU只有一个K20在苦苦支撑。所以,如果你遇到这种情况,可以观察他的loss如果loss趋于平缓,没有丝毫降低的意思。我们可以将它提前终止。之后我们就可以看到他的运行出来的model。

          

我们也可以看他的日志大体看一下val数据的准确率。

从图上看,这一次训练结果还是不错的。如果还想提升准确率的话,就需要从别的地方下手啦。


参考文档:

http://www.docin.com/p-871820919.html (很多步骤参考了这篇文档~)

因为caffe用到了proto。类似于XML但是高效的配置文件。所以有时间建议看一下

https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=protobuf

 

下一次,我们将尝试利用训练出来的model做一下这种数据的分类。以及写代码检测一下top3的准确率~~~



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值