1、Caffe AlexNet 实例汇报:吴彩云Caffe AlexNet instance基本原理简介AlexNet物体分类例程Caffe框架简介CONTENT目 录基本原理简介01CHAPTER人工智能是一门具有高度综合性和交叉行性的学科,其研究范畴包括:自动推理、知识表达、专家系统、机器学习、语言识别、图像识别、智能机器人等。而其中机器学习是人工智能的核心,其应用遍布了人工智能的各个领域,涉及的算法包括:决策树、支持向量机(SVM)、人工神经网络、聚类、贝叶斯分类器、规则学习、强化学习等。20世纪80年代,人工神经网络,成为了人工智能领域的研究热点,它模拟了生物神经元的工作原理进行建模,取得
2、了很大的进展。但是浅层的网络在表达能力方面有所欠缺。后来人工神经网络发展到深层的状态,也就是现在的深度学习网络。更深的网络使得模型的性能更好,相较于传统机器学习,不需要进行手工提取特征。人工智能机器学习深度学习人工智能与深度学习的关系其结构包括:多层感知机(MLP)、卷积神经网络(CNN)、循环神经网络(RNN),长短时记忆网络网络(LSTM)等。其实质上均为一个非常复杂的非线性数学计算结构,它可以拟合各种复杂的规律。CNNMLP常见的深度学习网络RNNLSTM多层感知机卷积神经网络循环神经网络长短时记忆网络网络神经网络基本单元神经元当激活函数为如下的阶跃函数时:这时候的神经元又叫作“感知器”
3、10=0 xf xelse单个神经元的实质:输入加权求和再加偏置,激活函数进行非线性转化,映射到固定值域。1njijiiOfw xb7常见的激活函数etanh:()xxxxef xeeRe:()max(0,)LUf xx:()ln(1)xsoftplus f xe1:()1xsigmoidf xe8BP神经网络BP神经网络是一种按照误差反向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。其结构可以看做若干神经元叠加而成。使用误差反向传播(BP)算法BP神经网络网络最后常接上Softmax或其他分类器,生成输入属于每个类别的概率,概率最高即为输出的分类9反向传播的基本思想正向传播,计
4、算输出,对比label,得到error,反向调整权值偏置,最小化error,error,最小时,权值最优。10梯度下降梯度下降是神经网络求解最常用的算法,简单的理解,就是从初始值顺着“loss”盆地最陡峭的方向下降,直到达到最低点,此时对应的参数即为最优解。11卷积神经网络(CNN)卷积网络(CNN)是为识别二维形状而特殊设计的一个前馈神经网络,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。12全连接如图为三层的全连接网络。全连接层中,每个节点与相邻层的所有节点都有连接。特点:参数较多,计算量较大,容易造成过 拟合。作用:用于将提取的图像特征用于分类。局部感知上图左:全连
5、接网络。如果我们有1000 x1000像素的图像,有106个隐层神经元,每个隐层神经元都连接图像的每一个像素点,就有1000 x1000 x106=1012个连接,也就是1012个权值参数。上图右:局部连接网络,每一个节点与上层节点同位置附近10 x10的窗口相连接,则106个隐层神经元就只有100乘以106,即108个参数。其权值连接个数比原来减少了四个数量级。权值共享在局部感知的基础上,若所有神经元采取一套权值,则数量级则会由106个,降低到102个。卷积结构卷积操作示意图如左图:原图:绿色矩阵,矩阵每个值对应原图的像 素值。卷积核:黄色矩阵,对图像大矩阵和卷积小 矩阵对应的位置元素相乘在
6、求和的操 作就叫做卷积。新生成图像:红色矩阵。111011001101010101权值第一个窗口的输入1110110011100100114第一个窗口的输出多核卷积如图所示,不同颜色表明不同的卷积核,单个卷积核特征提取显然不充分,多个卷积核能获取更充足的特征信息。多通道卷积如图展示了四通道的卷积操作,共有两个卷积核,生成两个特征图。以w1为例,在m层生成的特征图的某个位置(i,j)处的值,为四个通道对应卷积结果相加取激活操作得到的值。池化(pooling)操作池化通常作用于图像中不重合的区域,过程如右图。步长stride:相邻两个池化窗口,水平位移或竖直位移。最常见的池化:平均池化(mean
7、pooling)和最大池化(max pooling)。CAFFE框架简介02CHAPTERCaffe简介Caffe作者贾扬清Caffe的特点速度快速度快易上手易上手多语言多语言社区友好社区友好主主CNNCNN特点:1、基于C+/CUDA框架 ,也支持命令行、Matlab和Python接口2、利用MKL、OpenBLAS、cuBLAS等矩阵运算库加速计算、同时支持GPU加速3、例程脚本丰富,入门很快4、有检测框架Faster R-CNN系列、Caffe For Windows等衍生项目Caffe源码文件夹结构build:编译结果存放处,结构与主目录相似cmake:存放的编译配置文件,不关注,可忽
8、略data:存放原始数据集,及数据集获取的脚本如:MNIST、CIFAR-10distribute:编译后生成发布包的位置,用于迁移,暂可忽略docker:为了便于迁移,使用Docker工具,暂可忽略doc:doxgen工程文件存放在这路,暂可忽略examples:存放Caffe简单例程,如MNIST、CIAFR-10、ImageNetinclude:存放Caffe中源码的各种头文件matlab:Matlab接口models:存放一些示例模型,如AlexNet、GooLeNet等python:python 接口scripts:存放脚本文件src:存放Caffe源码文件,包括各层的实现等tool
9、s:存放常用的工具Caffe的核心概念n 网络(Net):Caffe中的网络结构常分为训练使用(常被命名为train_test.prototxt)的和实际使用(常被命名为deploy.prototxt)的网络结构。n 层(Layer):Caffe中网络结构(Net)是由一个个layer搭建而成。Layer采用一个或多个Blobs作为输入,产生一个或多个Blobs作为输出。n 数据存储Blobs:Caffe通过Blobs的形式,以4维数组的方式进行存储和传递数据。n 求解器(Solver):Caffe的求解方法和参数等单独卸载一个超参文件中,常被命名为solver.prototxt。n 权值文件
10、caffemodel:caffe中训练生成的为后缀为“.caffemodel”的权值文件,需结合网络文件一起使用。准备数据集03CHAPTER数据集类别数据集使用了5个分类的数据集,类别包括:Bus(大巴)、dinosaur(恐龙)、elephant(大象)、flower(花朵)、horse(马)训练集每个类别为80张,测试集每个类别20张,图片大小均为384*256。数据集概览Caffe支持数据集格式n 数据来源于数据库:LevelDB 和 LMDB n 数据来自于内存n 数据来源于HDF5n 数据来源于图片Caffe的数据集支持以下几种格式,不同格式的数据集,输入层的书写格式不同:Data
11、MemoryDataHDF5DataImageDatan 数据来源于WindowsWindowData输入层类型原始图片训练集n数据集的常规格式图片01train:按类别分别 存放着训练图片02val:散放着验证集图片flower03train.txt/val.txt:训练/验证集描述文件,格式为:路径+空格+labelval路径:bus/398.jpg标签:0路径:400.jpg标签:104label.txt:存放类别,通常为字母或数字或符号。Label=类别对应的行号-1n 可处理为LMDB格式可选择n 可直接以图片格式作为输入转化为LMDB格式n 可处理为LMDB格式n 可直接以图片格式
12、作为输入n LMDB:训练更高效,但转化需要时间和磁盘空间n 图片:数据集调整方便、不占用额外资源本实验中,我们将把图片转化成本实验中,我们将把图片转化成LMDB格式,转化脚本如下,是由格式,转化脚本如下,是由Caffe自带的自带的examples/imagenet/create_imagenet.sh修改修改而来。是比较通用性的转化脚本。而来。是比较通用性的转化脚本。在在caffe-master目录下,如下执行即可:目录下,如下执行即可:#./01_alexnet_example/01_create_lmdb_dataset.sh执行命令后,生成执行命令后,生成LMDB格式数据集格式数据集0
13、1_create_lmdb_dataset.sh脚本第一部分:脚本第一部分:(1)首先修改脚本涉及路径的部分)首先修改脚本涉及路径的部分(2)ALexNet输入层的输入大小为输入层的输入大小为227,图片大小不符合,则需要调整参数大小。图片大小不符合,则需要调整参数大小。01_create_lmdb_dataset.sh整个脚本等同于:整个脚本等同于:build/tools/convert_imageset-resize_height=227-resize_width=227-shuffle 01_alexnet_example/data/train/01_alexnet_example/da
14、ta/train.txt 01_alexnet_example/alexnet_train_lmdbbuild/tools/convert_imageset-resize_height=227-resize_width=227-shuffle 01_alexnet_example/data/val/01_alexnet_example/data/val.txt 01_alexnet_example/alexnet_val_lmdb注意:由于生成的注意:由于生成的alexnet_train_lmdb并不会覆盖写,所并不会覆盖写,所以若文件已经存在,则需要先删除再以若文件已经存在,则需要先删除再执
15、行转化命令。执行转化命令。准备均值文件04CHAPTER减均值的意义图图a为原始数据分布为原始数据分布,图像中的像素分布为图像中的像素分布为0-255,所以图像的数据分布就类似图,所以图像的数据分布就类似图a。图图b中的紫色线为中的紫色线为y=ax+b 想达到的分类效果,红线为想达到的分类效果,红线为y=ax+b常见的刚初始化后的效果。常见的刚初始化后的效果。图图c中的数据为减均值后的数据分布中的数据为减均值后的数据分布。对准确率影响不大,但会加快模型收敛效果生成均值文件Caffe中有两种减均值方式中有两种减均值方式:(1)直接)直接设定均值设定均值大小,如:大小,如:mean_value:1
16、04(2)指定均值文件,如:指定均值文件,如:mean_file:mymean.binaryproton 指定均值文件转化使用转化使用build/tools/compute_image_mean命令,带两命令,带两个参数。第一个参数为个参数。第一个参数为LMDB格式的训练集格式的训练集,第二个参数为第二个参数为生成均值文件的路径。生成均值文件的路径。build/tools/compute_image_mean 01_alexnet_example/alexnet_train_lmdb 01_alexnet_example/alexnet_mean.binaryproto选择在在caffe-ma
17、ster路径下执行以下命令:路径下执行以下命令:./01_alexnet_example/02_create_mean.sh生成准备网络结构文件05CHAPTERILSVRC大赛ILSVRC(ImageNet Large Scale Visual Recognition Challenge)大赛(ImageNet大规模视觉识别竞赛)是世界上最顶尖的视觉识别竞赛,很多顶尖的深度学习研究人员和企业都在这场比赛中角逐。从2010年开始,该大赛每年举办一次,直到2017年才落下帷幕。每年的冠军模型所用的方法,对深度学习的研究都有很大的借鉴作用。AlexNet网络结构1、网络结构:AlexNet共有8层
18、,共由5个卷积层和3个全连接层组成,最后一层共1000个输出。Data-conv1-relu1-LRN1-pooling1-conv2-relu2-LRN2-pooling2-conv3-relu3-conv4-relu4-conv5-relu5-pooling5-fc6-relu6-drop6-fc7-relu7-drop7-fc8AlexNet结构特点Data Augmentation采用数据增强,对一些数据进行变换。进行水平翻转(mirror),或取其中小块(crop)进行训练。Multiple GPUs采用了两块GPU的稀疏连接结构,加快训练速度。Dropout将某些连接按照一定概率从
19、网络中丢弃,防止过拟合。Overlapping Pooling使用了重叠最大池化代替了以往的普通平均池化。保障了特征的丰富性,也避免了平均池化的模糊效果。ReLU使用了ReLU代替sigmod激活函数,解决了梯度弥散的问题,收敛速度更快。LRN使用了局部响应归一化,权重高的值变得更大,权重小的值则得到抑制。增强了网络的泛化能力。Caffe中的AlexNet原始的原始的AlexNet网络结构文件网络结构文件用于训练的结构用于训练的结构#vim caffe-master/models/bvlc_alexnet/train_val.prototxtCaffe中的中的AlexNet训练数据集:训练数据
20、集:ILSVRC大赛提供的大赛提供的ImageNet数据集数据集训练数据集:自己组织的数据集训练数据集:自己组织的数据集5类分类类分类1000类分类类分类本实验本实验中的中的AlexNet本本实验中实验中AlexNet网络结构文件网络结构文件用于训练的结构用于训练的结构#vim caffe-master/01_alexnet_example/train_val.prototxt使用现成的Caffe模型,需要修改的内容 输入层1、本实验使用LMDB格式作为数据集,训练更高效。且数据集小的情况下,图片转LMDB的时间和空间消耗都较小。01原始的输入层输入层01本实验的输入层使用现成的Caffe模型
21、,需要修改的内容 输出层1、看原始数据类别数据集有多少类,最后一层全连接层的num_output参数即为几。02原始的输出层输出层02本实验的输出层超参文件设置06CHAPTER超参文件设置n 超参文件中设置了,模型结构文件、迭代次数、优化方法等:#vim 01_alexnet_example/solver.prototxtnet:01_alexnet_example/train_val.prototxt#训练使用的网络模型结构训练使用的网络模型结构test_iter:5#每次测试,迭代每次测试,迭代5次,结合测试阶段的次,结合测试阶段的batch_size为为20次,次,5次正好测试完次正好
22、测试完100张图片张图片test_interval:50#训练时,每迭代训练时,每迭代50次,进行一次测试次,进行一次测试test_initialization:false#开始训练时,不进行测试开始训练时,不进行测试base_lr:0.01#基础学习率为基础学习率为0.01#采用步进采用步进衰减,衰减,step的方式进行的方式进行,#采取采取step策略后,基础学习率的变化方式为:策略后,基础学习率的变化方式为:basr_lr=base_lr*gamma (floor(iter/step)lr_policy:step gamma:0.1#step策略的参数策略的参数stepsize:100#
23、step策略的策略的参数参数display:1#每迭代一次,在屏幕打印一次输出每迭代一次,在屏幕打印一次输出max_iter:300#最大迭代次数最大迭代次数momentum:0.9#冲量冲量,基本,基本思路是为寻优加入了思路是为寻优加入了“惯性惯性”的影响,这样一来,当误差曲面中存在平坦区的时候,的影响,这样一来,当误差曲面中存在平坦区的时候,SGD可以更快的速度学习可以更快的速度学习weight_decay:0.005#权衰量权衰量snapshot:100#最大迭代次数最大迭代次数snapshot_prefix:“01_alexnet_example/models/alex”#模型保存的路
24、径模型保存的路径solver_mode:CPU#训练模式选择训练模式选择GPU模式模式训练模型07CHAPTER训练模型命令详解caffe程序的命令行执行格式如下:caffe build/tools/caffe命令test:测试模型train:训练或finetune模型(model)device_query:显示gpu信息time:显示程序执行时间-solver:接超参文件,其中设置了训练的各种参数-gpu:接GPU的ID-snapshot:用于从快照中恢复训练-weights:fine-tuning模型时,接权值文件-iteration:设置迭代次数,默认为50-model:网络结构描述文件
25、-sighup_effect:设定当发生挂起事件时,执行的操作-sigint_effect:设定当程序发生键盘中止事件时(ctrl+c),执行的操作常用命令示例n 例1:使用0号GPU训练#./build/tools/caffe train-solver examples/mnist/lenet_solver.prototxt -gpu 0注:命令行输入时,为了书写方便,看着清晰,可以用“”隔开,也可将其换做空格,如下:#./build/tools/caffe train-solver examples/mnist/lenet_solver.prototxt-gpu 0n 例2:从训练了500
26、0次的快照中继续训练#./build/tools/caffe train-solver examples/mnist/lenet_solver.prototxt-snapshot examples/mnist/lenet_iter_5000.solverstate常用命令示例n 例3:利用别人训练的模型,微调(fine-tuning)模型#./build/tools/caffe train-solver examples/finetuning_on_flickr_style/solver.prototxt-weights models/bvlc_reference_caffenet/bvlc_
27、reference_caffenet.caffemodeln 例4:在验证集中验证已经训练好的模型#./build/tools/caffe test-model examples/mnist/lenet_train_test.prototxt-weights examples/mnist/lenet_iter_10000.caffemodel-gpu 0-iterations 100以上意思为利用训练好了的权重(-weight),输入到测试模型中(-model),用编号为0的gpu(-gpu)测试100次(-iteration)。训练模型训练训练模型实际调用了模型实际调用了build/tool
28、s/caffe命令,命令接两个命令,命令接两个参数:参数:第一批参数为:第一批参数为:train,表示训练;,表示训练;第二批参数为第二批参数为 只有一个只有一个-solver,接训练的超参文件,接训练的超参文件命令如下:命令如下:./build/tools/caffe train-solver 01_alexnet_example/solver.prototxt可在可在caffe-master路径下直接执行如下命令开始训练:路径下直接执行如下命令开始训练:#./01_alexnet_example/03_train_alexnet.sh批量测试模型08CHAPTER批量测试模型训练训练模型实
29、际调用了模型实际调用了build/tools/caffe命令,命令接两批参数:命令,命令接两批参数:第一批参数为:第一批参数为:test,表示,表示测试测试;第二批参数为第二批参数为 有三个:有三个:-model,接训练用的网络结构文件,接训练用的网络结构文件-weight,接训练得到的权值文件,接训练得到的权值文件-iterations,接迭代的次数,接迭代的次数命令如下:命令如下:./build/tools/caffe test-model 01_alexnet_example/train_val.prototxt-weights 01_alexnet_example/models/ale
30、x_iter_300.caffemodel-iterations 5可在可在caffe-master路径下直接执行如下命令开始训练:路径下直接执行如下命令开始训练:./01_alexnet_example/04_test_val.sh 单张分类09CHAPTER单张测试分类Caffe中提供了一个小工具中提供了一个小工具build/examples/cpp_classification/classification.bin,用于直观的对图像进行分类。,用于直观的对图像进行分类。classification.bin有有5个个参数,分别为参数,分别为5个个文件:文件:(1)测试用的网络结构)测试用的
31、网络结构文件:文件:已有已有,01_alexnet_example/deploy.prototxt。Caffe中本就提供,也可通过训练网络修改中本就提供,也可通过训练网络修改(2)训练得到的)训练得到的模型:模型:已有已有,01_alexnet_example/models/alex_iter_300.caffemodel。模型训练后得到。模型训练后得到(3)均值文件:)均值文件:已有已有,01_alexnet_example/alexnet_mean.binaryproto。步骤。步骤02中已生成中已生成(4)标签)标签文件:文件:已有已有,01_alexnet_example/label.txt。制作数据集时提供的。制作数据集时提供的(5)测试图片:已有,)测试图片:已有,01_alexnet_example/data/val/514.jpg。从。从val中抽取的一张图片,也可自己准备中抽取的一张图片,也可自己准备可在可在caffe-master目录下执行,如下命令,进行单张测试:目录下执行,如下命令,进行单张测试:#./01_alexnet_example/05_test_1_pic.sh