简介
caffe是一个友好、易于上手的开源深度学习平台,主要用于图像的相关处理,可以支持CNN等多种深度学习网络。
基于caffe,开发者可以方便快速地开发简单的学习网络,用于分类、定位等任务,也可以用于科研,在其源码基础上进行修改,实现自己的算法。
本文的主要目的,是介绍caffe的基本使用方法,希望通过本文,能让普通的工程师可以使用caffe训练自己的简单模型。
本文主要包括以下内容:运行caffe的例子训练cifar训练集、使用别人定义好的网络训练自己的数据、使用训练好的模型fine tune自己的数据。
背景知识简介
深度学习是机器学习的一个分支,主要目标在于通过学习的方法,解决以往普通编程无法解决的问题,例如:图像识别、文字识别等等。
机器学习里的“学习”,指通过向程序输入经验数据,通过若干次“迭代”,不断改进算法参数,最终能够获得“模型”,使用新数据输入模型,计算得出想要的结果。
例如图像分类任务中,经验数据是图片和对应的文字,训练出模型后,将新图片使用模型运算,就可以知道其对应的类别。
以上只是简单介绍,这里还是建议先学习机器学习、卷积神经网络的相关基础知识。
安装
这一部分网上有不少教程,这里就略掉,另外,我是用docker的镜像直接安装的,网上可以直接搜到带caffe的docker镜像。好处是省去安装环境的时间,缺点是后面设置文件会麻烦一些,建议从长计议还是直接安装在电脑上。
训练cifar训练集
cifar是一个常见的图像分类训练集,包括上万张图片及20个分类,caffe提供了一个网络用于分类cifar数据集。
cifar网络的定义在examples/cifar10目录下,训练的过程十分简单。
(以下命令均在caffe默认根目录下运行,下同)
1、获取训练数据
cd $CAFFE_ROOT ./data/cifar10/get_cifar10.sh ./examples/cifar10/create_cifar10.sh
2、开始训练
cd $CAFFE_ROOT ./examples/cifar10/train_quick.sh
3、训练完成后我们会得到:
cifar10_quick_iter_4000.caffemodel.h5
cifar10_quick_iter_4000.solverstate.h5
此时,我们就训练得到了模型,用于后面的分类。
4、下面我们使用模型来分类新数据
先直接用一下别人的模型分类试一下:(默认用的ImageNet的模型)
python python/classify.py examples/images/cat.jpg foo
下面我们来指定自己的模型进行分类:
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
上面这句话的意思是,使用cifar10_quick.prototxt网络 + cifar10_quick_iter_4000.caffemodel.h5模型,对examples/images/cat.jpg图片进行分类。
默认的classify脚本不会直接输出结果,而是会把结果输入到foo文件里,不太直观,这里我在网上找了一个修改版,添加了一些参数,可以输出概率最高的分类。
替换python/classify.py,下载地址:http://download.csdn.net/detail/caisenchuan/9513196
这个脚本添加了两个参数,可以指定labels_file,然后可以直接把分类结果输出出来:
python python/classify.py --print_results --model_def examples/cifar10/cifar10_quick.prototxt --pretrained_model examples/cifar10/cifar10_quick_iter_4000.caffemodel.h5 --labels_file data/cifar10/cifar10_words.txt --center_only examples/images/cat.jpg foo
输出结果:
Loading file: examples/images/cat.jpg Classifying 1 inputs. predict 3 inputs. Done in 0.02 s. Predictions : [[ 0.03903743 0.00722749 0.04582177 0.44352672 0.01203315 0.11832549 0.02335102 0.25013766 0.03541689 0.02512246]] python/classify.py:176: FutureWarning: sort(columns=....) is deprecated, use sort_values(by=.....) labels = labels_df.sort(‘synset_id‘)[‘name‘].values [(‘cat‘, ‘0.44353‘), (‘horse‘, ‘0.25014‘), (‘dog‘, ‘0.11833‘), (‘bird‘, ‘0.04582‘), (‘airplane‘, ‘0.03904‘)] 上面标明了各个分类的顺序和置信度Saving results into foo