CIFAR是什么
CIFAR-10和CIFAR-100都是带标签的大小为8000万小图数据集的子集。其中CIFAR-10有10类,每类6000个大小为32x32的图像。其中训练图像和测试图像的比例是5:1,对每类图像,随机选择1000个测试图像,剩下的就是训练图像。
注意到10类图像既有automobile,还有truck。它们是不重叠的。Automobile包含的是轿车,SUV等,truck只包含大卡车,连pickup皮卡也不包括。
Cuda-convnet利用卷积神经网络在没有新增训练数据下可以达到18%的错误率,新增数据可以达到11%的错误率。Jasper Snoek利用贝叶斯超参数优化在相同网络下不借助训练数据新增可以达到15%的错误率。
下载数据集并解压
从Alex Krizhevsky的网站下载二进制格式的CIFAR-10数据集。解压存放在:caffe-master\examples\cifar10\input_folder当中(input_folder文件夹需要自己创建)
解压得到一个txt格式的标签文件。5个训练数据batch,1个测试batch。
转换格式 利用convert_cifar_data.exe和bat
将二进制文件.bin转为为caffe规定的格式leveldb。在caffe-master\examples\cifar10 下创建一个记事本(后缀改为 .bat ),输入以下code,保存为convert_cifar10.bat (后缀改为 .bat)。
..\..\Build\x64\Release\convert_cifar_data.exe input_folder output_folders leveldbpause
Ps:
1.bat的Usage:Convert_cifar_data input_folderoutput_folder db_type
2.注意不同属性参数之间要以空格分开
3.../得到父级目录
4.Prototxt中注释在行首加#
然后双击运行,可以看到在 caffe-master\examples\cifar10下会生成一个文件夹,output_folders。里面有两个文件夹,存放的就是转换好的数据
计算均值文件 利用compute_image_mean.exe和bat
在caffe-master\examples\cifar10下创建一个记事本(后缀改为 .bat ),输入以下code
..\..\Build\x64\Release\compute_image_mean.exe -backend=leveldb../../examples\cifar10\output_folders\cifar10_train_leveldb mean.binaryprotoPause
然后运行此文件,在caffe-master\examples\cifar10 下会出现mean.binaryproto文件
在prototxt中更改一些参数
更改caffe-master\examples\cifar10 下的cifar10_quick_solver.prototxt和cifar10_quick_train_test.prototxt
cifar10_quick_solver.prototxt改中了:
net:"../../examples/cifar10/cifar10_quick_train_test.prototxt"
snapshot_prefix:"../../examples/cifar10/cifar10_quick"
如果只用CPU计算网络,还要改solver_mode:
solver_mode: CPU
cifar10_quick_train_test.prototxt中改了:solver_mode: CPU
mean_file:"../../examples/cifar10/mean.binaryproto"
source:"../../examples/cifar10/output_folders/cifar10_train_leveldb"mean_file:"../../examples/cifar10/mean.binaryproto"
source:"../../examples/cifar10/output_folders/cifar10_test_leveldb"backend: LEVELDB
Ps:examples/cifar10/中有几种不同的训练模式(quick和full等),要一一对应。
开始训练 利用caffe.exe
在caffe-master\examples\cifar10下创建文本文件,更改后缀为.bat,开始运行。(注意train之后有空格):
..\..\Build\x64\Release\caffe.exe train --solver=../../examples/cifar10/cifar10_quick_solver.prototxt
Pause
bat中只用到了cifar10_quick_solver.prototxt,但在这个文件里面第一个参数就是刚才修改的网络配置文件cifar10_quick_train_test.prototxt,这样才能不断迭代优化求解出参数,得到最终的模型。
还有一种训练方法是在vs中把caffe设为启动项目,调试参数改为train --solver=../../examples/cifar10/cifar10_quick_solver.prototxt。然后ctrl+F5开始调试。
因为是在靠CPU训练,半个多小时后训练才结束,optimization done,examples/cifar10下出现如下两个文件,说明已经训练完成。
在后期应用过程中,需要生成caffemodel文件而非caffemodel.h5文件,我们将cifar10_quick_solver.prototxt中的snapshot_format:HDF5注释掉,重新训练,就可以得到下面的文件
Cifar10_quick_iter_4000.caffemodel是分类器描述文件。Cifar10_quick_iter_4000.solverstate是继续学习将会用到的文件。
现在,可以进入到实测了。
分析这个bat命令,首先使用了编译生成的exe文件。在网络层面,使用了刚训练生成的caffemodel模型和一个prototxt文件,关于prototxt文件,参考博客说是训练后新生成的,但是我的文件日期是2016年的,应该是版本不同的原因。这个prototxt文件应该就是上一篇博客里面分析的修改train_test.prototxt首尾得到的网络配置文件。图像层面,不仅要指定待分类的图像,还要有txt文件,存放类别名称,还要有均值文件,可以提升分类准确性。
classification.exe examples\cifar10\cifar10_quick.prototxtexamples\cifar10\cifar10_quick_iter_4000.caffemodel examples\cifar10\mean.binaryprotomy.txt 3.jpgpause
注意这个标签txt文件,写成一列,不能有额外的空格。否则出现类别个数与网络最后一层输出个数不符的情况:
结果1 对网上下载的柴犬图像3.jpg的识别
结果2 将下载图像resize成34x34重新识别
看到概率大小发生了变化,但是还是错误的。
结果3 对网上下载的飞机图像的识别
Reference:
1. https://www.cnblogs.com/TensorSense/p/6260287.html
2. https://blog.csdn.net/weixinhum/article/details/71304852