caffe之cifar10练习

参考:blog.csdn.net/qq_32211827/article/details/54574924

CIFAR10简介

(1)cifar10是是由Hinton的两大弟子Alex Krizhevsky,ilya Sutskever收集的一个用于普适物体识别的数据集。Cifar是加拿大政府牵头投资的一个先进科学项目研究所。Hinton,Bengio以及他的学生在2004年拿到了Cifar投资的少量资金,建立了神经计算和自适应感知项目。这个项目集结了不少的计算机科学家,生物学家,电气工程师,神经科学家,心理学家,加速推动了DL的进程。从这个阵容来看,DL已经和ML系的数据挖掘分的很远了。

DL强调的是自适应感知和人工智能,是计算机与神经科学的交叉。DM强调的是告诉,大数据,统计数学分析,是计算机与数学的交叉。

(2)cifar-10数据集简介

1 === Cifar-10由60000张32*32的RGB(三通道)彩色图构成,共10个分类
2 === 其中50000张为训练样本(训练集),10000为测试样本(测试集)
3 === 注意

1) --- 这个数据集做大的特点在于将识别迁移到普适物体
2) --- 可以将10分类问题扩展至100类物体的分类,甚至1000类和更多类的物体分类
3) --- 该示例 中的数据集存放在一个10000*3072数组中----10000张图片×每张图片的像素数组
4) --- 3072存储了一个32*32的彩色图片(3*32*32=3*1024=3072)
5) --- numply的前1024位是RGB图像中的R分量像素值,中间的1024位是G分量的像素值,最后的1024是B分量的像素值
6) --- Cifar10这个例子只能用于[小图片]的分类,类似于前面所讲的Mnist示例,主要用于【手写数字的识别一样】

caffe之cifar10练习_第1张图片

(3)cifar10所使用的卷积神经CNN的网络模型

1 === DL的的两大核心:数据+模型,数据集在上面已经详细给出,下面是Caffe10中所使用的网络(net)模型
2 === 该模型在caffe安装目录下,文件名为:cifar10_quick_train_test.prototxt。具体路径为/home/wei/caffe/examples/cifar10/cifar10_quick_train_test.prototxt
3 === 该CNN-NET主要由:卷基层,POOLing层,非线性变换层(有的在pool之后,有的在conv之后,who knows),局部对比归一化线性分类器等组成

数据准备

(1)下载数据集,执行下面的命令:

sudo sh ./data/cifar10/get_cifra10.sh

(2)lmdb

    将刚下载进来的【二进制数据文件】转换成【caffe所识别的LMDB格式的数据库形式】,并且计算数据集的均值文件,数据格式的转化和计算均值所要使用的所有shell命令都被写在了一个shell脚本中,所以我们只需要运行这个shell脚本就可以了,这个shell脚本在/home/wei/caffe/examples/cifar10目录下,名称为create_cifar10.sh。执行之后,会在/home/wei/caffe/examples/cifar10目录下生成三个文件--------如下图所示:

caffe之cifar10练习_第2张图片

训练模型

在这个阶段,要准备三个文件,当然caffe已经为我们准备好了

1 === 网络模型配置文件:cifar10_quick_train_test.prototxt ---所在目录---/home/wei/caffe/examples/cifar10
2 === 超参数配置文件solver:cifar10_quick_solver.prototxt   ---所在目录---/home/wei/caffe/examples/cifar10/
3 === 训练脚本文件:train_quick.sh  ----所在目录---/home/wei/caffe/examples/cifar10
4 === 编写训练模型的shell脚本文件train_quick.sh ,但是由于我使用的CPU没有GPU,所以在编写该文件之前,还应该修改cifar10_quick_solver.prototxt文件。准备好数据+模型+solver文件之后,执行下面的命令:sudo ./examples/cifar10/train_quick.sh(注意:这里使用了多个学习率的技巧)

训练过程如下图所示:

caffe之cifar10练习_第3张图片

其中,每迭代100次,显示一次训练时的lr(学习率)和loss(训练损失)。注:训练完成之后,训练好的模型参数存储在protobuf格式的文件中,cifar-10训练好的模型存储在/home/wei/caffe/examples/cifar10/文件夹下

批量测试

./build/tools/caffe test --model=examples/mnist/lenet_train_test.prototxt 
--weights=examples/mnist/lenet_iter_10000.caffemodel --gpu=0

单张分类

python python/classify.py --model_def examples/cifar10/cifar10_quick.prototxt --pretrained_model examples/cifar10/cifar10_quick_iter_4000.caffemodel.h5 --center_only  examples/images/cat.jpg foo

之前我们在跑mnist的时候,创建了一个classifymnist.py,而这里全部是给参数赋值的形式,那些参数在classify.py里面都有,有的参数给了,但是不给值的话是默认文件中的值,给了会重新赋值,有的不存在是否有值,只是给没给象征着什么,比如center_only

cifar10_quick.prototxt就是该网络的deploy.prototxt。

python python/classify.py --model_def examples/cifar10/cifar10_quick.prototxt --pretrained_model examples/cifar10/cifar10_quick_iter_5000.caffemodel.h5 --mean_file=examples/cifar10/mean.binaryproto --center_only examples/images/cat.jpg foo

center_only: 应该是说从中间crop相应大小的吧
报错:"Failed to interpret file %s as a pickle" % repr(file))
IOError: Failed to interpret file 'examples/cifar10/mean.binaryproto' as a pickle

解决:需要把mean.binaryproto转mean.npy

使用Caffe的C++接口进行操作时,需要的图像均值文件是pb格式,例如常见的均值文件名为mean.binaryproto;但在使用python 接口进行操作时,需要的图像均值文件是numpy格式,例如mean.npy。所以在跨语言进行操作时,需要将mean.binaryproto转换成 mean.npy,转换代码如下:

#coding:utf-8
import caffe
import numpy as np
MEAN_PROTO_PATH = 'examples/cifar10/mean.binaryproto' # 待转换的pb格式图像均值文件路径MEAN_NPY_PATH = 'examples/cifar10/mean.npy'   # 转换后的numpy格式图像均值文件路径
blob = caffe.proto.caffe_pb2.BlobProto()           # 创建protobuf blob
data = open(MEAN_PROTO_PATH, 'rb' ).read()   # 读入mean.binaryproto文件内容blob.ParseFromString(data)    # 解析文件内容到blob
array = np.array(caffe.io.blobproto_to_array(blob))# 将blob中的均值转换成numpy格式,array的shape (mean_number,channel, hight, width)
mean_npy = array[0]   # 一个array中可以有多组均值存在,故需要通过下标选择其中一组均值
np.save(MEAN_NPY_PATH ,mean_npy)

运行:

python python/classify.py --model_def examples/cifar10/cifar10_quick.prototxt --pretrained_model examples/cifar10/cifar10_quick_iter_5000.caffemodel.h5 --mean_file=examples/cifar10/mean.npy --center_only examples/images/cat.jpg foo

最后生成一个foo.npy的结果文件,里面存储的是长度为10的数组,记录所属各个类别的概率



你可能感兴趣的:(caffe之cifar10练习)