1. 前言
caffe 是一个非常好用的处理深度学习的基本框架,使用C++编写,因而速度非常快,同时提供了python 和 matlab接口,使用起来非常方便,但是由于caffe的文档资源相对比较少,因而上手起来并不是非常容易。在捣腾了很久之后,终于跑通了mnist数据集,这里将期间遇到的一些问题做一些记录,方便以后查阅。
2. LeNet简介
- LeNet-5这是一个非常成熟了的CNN神经网络,主要用来识别手写数字
- 它的基本结构如下所示:
通常意义上这是一个7层神经网络,通过对输入图像卷积,池化,再卷积,再池化,全链接,ReLU激励,SoftMax计算互熵损失,可以得到一个非常好的识别效果。
3. prototxt数据格式
- caffe 采用的是 prototxt 这种配置格式进行网络的配置,这种格式有点类似于 gson,但是据说会更加高效,参考文档路径: https://developers.google.com/protocol-buffers/docs/overview
- 当然,如果看英文非常费劲的话,可以看看这位大神的博客: Caffe学习系列(2):数据层及参数, Caffe学习系列(3):视觉层(Vision Layers)及参数, 当然,英文水平好的可以直接查看官方文档:Training LeNet on MNIST with Caffe, 当然对于我们新手而言,只要基本可以看懂就可以了,需要使用的时候,可以依葫芦画瓢。
- 通过prototxt 定义的神经网络,非常清晰明了,有多少层,就定义多少个layer,设置好他们的层属性,数据流动即可
4. mnist 数据集介绍
- THE MNIST DATABASE of handwritten digits这个数据集是业界知名的用于手写数字检测识别的数据集,官网提供了数据文件下载,并给出了相应的文件格式
- 如果希望能够看到相应的训练图像的,可以简单的编写一个转换函数进行实现,具体可以参考博客: 如何用python解析mnist图片
5. mnist 训练
- 由于我们下载的是微软封装过的caffe, 在example 文件夹下可以找到对应mnist文件夹,将相应的数据文件放入相应位置,在命令行中输入下面指令,即可实现网络的训练。
caffe.exe train --solver=examples/mnist/lenet_solver.prototxt
6. 测试自己的数据
- 经过训练之后,我们可以得到我们想要的网络权重文件
测试自己的数据实际上使用的是 caffe 指令,类似于训练的过程,我们可以定义自己的prototxt训练文件(可以直接将原始的lenet_train_test.prototxt拷贝一份,进行修改),只需要填入自己的测试数据路径即可
创建自己的数据集可以使用caffe 提供的工具 convert_imageset
注意需要给定图像所在文件夹,以及相应的图像描述文本文件
转化代码如下:
进行测试
可以看到这个结果准确率非常低,这是因为,我们这里的标号都是胡乱给值的
正确数据跑出来的结果如下:
可以看到,这个模型的准确度还是非常高的。
7. 跑单幅图片数据
- 以上过程,仅仅可以看成是训练和测试的过程,如果我们需要判定一个图像是属于什么类别, 就需要使用到classification 指令了。可以参考文章 mnist实例编译之model的使用-classification
- 此处,需要定义自己的deploy.prototxt 文件,这个文件和训练时候的文件非常类似,只是输入数据层不同,并且没有softmaxwithloss层,多了一个softmax层(由于中间部分的网络参数都相同,这里省略了)
layer{
name: "data"
type: "Input"
top: "data"
input_param{shape:{
dim: 1 dim: 1 dim: 28 dim : 28
}}
}
...
layer {
name: "loss"
type: "Softmax"
bottom: "ip2"
top: "loss"
}
- 在使用classification命令的时候,需要使用图像均值文件,可以通过compute_image_mean 指令获取得到
- 检测效果图
8. 遇到的问题
- 训练的时候模型文件和权重文件位置放反了
- 测试数据集格式与网络训练时候的格式不符合