在开始前,对cifar数据集进行一个简单的介绍:
【cifar数据集介绍】
Cifar-10是由Hinton的两个大弟子Alex Krizhevsky、Ilya Sutskever收集的一个用于普适物体识别的数据集。Cifar是加拿大政府牵头投资的一个先进科学项目研究所。这个项目结集了不少计算机科学家、生物学家、电气工程师、神经科学家、物理学家、心理学家,加速推动了DL的进程。DL强调的是自适应感知和人工智能,是计算机与神经科学交叉。DM强调的是高速、大数据、统计数学分析,是计算机和数学的交叉。CIFAR-10数据集含有6万个32*32的彩色图像,共分为10种类型,包含50000张训练图片,10000张测试图片
数据集的数据存在一个10000*3072的数组中,单位是uint8s,3072是存储了一个32*32的彩色图像。(3072=1024*3)。前1024位是r值,中间1024是g值,后面1024是b值。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类(姊妹数据集Cifar-100达到100类,ILSVRC比赛则是1000类)。
1、数据集下载
CIFAR-10数据库的下载地址:http://www.cs.toronto.edu/~kriz/cifar.html(下载二进制格式)
2、解压至相关路径
下载完成后,将其解压缩至.../caffe-master/data/cidar10/下,与get_cifar10.sh放在一起,其实./get_cifar10.sh命令的作用也就是“下载并解压缩”,只不过是linux环境下的而已。其中,data_batch_1.bin、data_batch_2.bin、data_batch_3.bin、data_batch_4.bin和data_batch_5.bin包含了该数据库中的50000张共10类(每类5000张)彩色图像,是用于训练的,而test_batch_.bin中包含了10000张共10类(每类1000张)是用于测试的。
3、转换数据库为lmdb格式
进入convert_cifar_data.exe所在的路径.../caffe-master/Build/x64/Release/,在cmd中执行:
命令执行完后可以在.../caffe-master/examples/cifar10/路径下面看到生成的两个文件夹cifar10_test_lmdb和cifar10_train_lmdb,它们分别是测试数据库和训练数据库对应的转换后的数据库。 接着,将db格式的训练图像进行求平均值,进入convert_cifar_data.exe所在的路径.../caffe-master/Build/x64/Release/,在cmd中执行:
命令执行完后可以在.../caffe-master/examples/cifar10/路径下面看到生成的mean.binaryproto。
由此我们得到了:
1--cifar10_train_lmdb--------训练样本数据集
2--cifar10_test_lmdb---------测试样本数据集
3--mean.binaryproto----------数据集的均值文件(用于减均值操作)
4、训练
该CNN由卷积层、POOLing层、非线性变换层以及在顶端的局部对比归一化线性分类器组成。在.../caffe-master/examples/cifar10/路径下有一堆*.prototxt,它们均是用来修改配置参数的。 由于我们所采用的平台没有英伟达的GPU,故只能采用CPU进行训练,所以将cifar10_quick_solver.prototxt和cifar10_quick_solver_lr1.prototxt中的solver_mode:GPU均改为solver_mode:CPU。这两个参数配置文件是用来协调模型的优化的,例如学习因子(learning rate)。
训练或者测试时都要采用Release模式下的caffe.exe,进入.../caffe-master/Build/x64/Release/路径下,采用dos命令行,也就是执行cmd,执行下列命令:
上述命令执行完毕后会生成cifar10_quick_iter_4000.caffemodel.h5以及cifar10_quick_iter_4000.solverstate.h5两个文件,其中cifar10_quick_iter_4000.solverstate.h5将在进一步的训练中使用到,而cifar10_quick_iter_4000.caffemodel.h5模型权值文件可用于数据集的测试(此处可不用,因为还有下面更深层的训练,会生成更深层的模型权值文件cifar10_quick_iter_5000.caffemodel.h5)。该过程大约持续半小时。
在上一步基础上,进一步执行如下命令:
上述命令执行完毕后会生成cifar10_quick_iter_5000.caffemodel.h5以及cifar10_quick_iter_5000.solverstate.h5两个文件,在此例子中,就是用cifar10_quick_iter_5000.caffemodel.h5模型权值文件进行预测的。
需要注意的是,在执行上述命令时,会报错,提示找不到文件或无法写入等问题:
这是文件路径引起的问题,在此为解决该问题,我把各文件中的路径进行了改动,可以根据报错内容修改对应的文件路径,需要修改的文件内容中的路径一般是cifar10_quick_solver.prototxt和cifar10_quick_solver_lr1.prototxt中的net以及snapshot_prefix对应的路径,还有cifar10_quick_train_test.prototxt中的mean_file和source对应的路径。此处,我将cifar10_quick_solver_lr1.prototxt和cifar10_quick_train_test.prototxt中的路径均改成了绝对路径。
原始的prototxt文件里面涉及到路径的都写的很含糊,省略了上级路径,当你稍微一动文件的时候,按照例子来进行跑的时候,就会出现路径不一致。所以,建议先将路径全部改为绝对路径。
下面将对配置文件中的内容进行简单说明或解释:
net:用于训练、预测的网络描述文件
test_iter:预测阶段迭代次数
test_interval:训练时每迭代多少次,进行一次预测
base_lr、momentum、weight_delay:网络的基础学习速率、冲量和权衰量
lr_policy:学习速率的衰减策略
display:每经过多少次迭代,在屏幕上打印一次运行日志
max_iter:最大迭代次数
snapshot:每多少次迭代打印一次快照
solver_mode:caffe的求解模式,根据实际情况选择GPU或CPU
5、测试
其实,预测就是用训练好的模型进行预测,对于此例子来说,就是使用cifar10_quick_iter_5000.caffemodel.h5模型权值文件进行预测的。
进入.../caffe-master/Build/x64/Release/路径下,在cmd中执行下列命令:
其中:
test :表示只做预测(前向传播计算),不进行参数更新(后向传播计算)
-model ../../../examples/cifar10/cifar10_quick_train_test.prototxt:指定模型描述文本文件
-weights ../../../examples/cifar10/cifar10_quick_iter_5000.caffemodel.h5 :指定模型权值文件,也就是预先训练出来的模型或者说权值文件
-iterations 100:指定迭代的次数,也就是参与测试的样本数目。
采用cifar10_quick_iter_5000.caffemodel.h5模型权值文件进行预测时,最终得到的结果如下所示,准确率为0.75左右:
若采用cifar10_quick_iter_4000.caffemodel.h5模型权值文件进行预测时,准确率为0.7159:
说明迭代次数对最终结果还是有一定的影响。