Caffe官方教程阅读笔记

来源:互联网 发布:什么是非线性优化 编辑:程序博客网 时间:2024/05/29 08:50

前言:Caffe是一个深度学习的框架,此处介绍Caffe的设计哲学、架构和使用方法,是关于Caffe的实践指引和介绍。


教程内容:1.Nets,Layers,and Blobs:Caffe模型解析;

                    2.Forward and Backword:层状模型的基本计算;

                    3.Loss:由loss定义待学习的任务;

                    4.Solver:solver协调模型的优化;

                    5.Layer Catalogu:“层”是模型和计算的基本单元,Caffe提供的结构中包含了构建先进模型所需的各种层;

                    6.Interface:Caffe 的命令行,Python和Matlab版的接口;

                    7.Data:如何为模型添加caffe式的输入数据。

 

第一章:Blobs,Layers and Nets:Caffe模型解析


blob是caffe的标准数组结构,提供统一的内存接口。它是caffe中处理和传递实际数据的数据封装包,是按照C风格存储的N维数组。

blob常规的维数是图像数量N*通道数K*图像高度H*图像宽度W。Blob按照行为主进行存储,所以一个4维blob中,坐标为(n,k,h,w)

的值的物理位置为((n*K+k)*H+h)*W+w,这也使得最后面/最右边的维度更新最快。

Number/N是每个批次处理的数据量;Channel/K是特征维度,例如对于RGB图像来说,K=3.


对于blob中的数据,我们关心的是values(值)和gradients(梯度),所以一个blob单元存储了两块数据——data和diff。前者是我们在

网络中传送的普通数据,后者是通过网络计算得到的梯度。

有两种数据访问方式:静态方式:不改变数值;动态方式:改变数值。

const Dtype* cpu_data() const; 

Dtype* mutable_cpu_data();


Layer是caffe模型和计算的基本单元。layer可以进行卷积(convolve),池化(pool),内积(inner product),rectified-linear和

sigmoid等非线性运算,元素级的数据变换,normalize(归一化),load data(数据加载),softmax和hinge等losses(损失计算)。

每一个layer都定义了3中重要的运算:setup(初始化设置),forward(前向传播),backword(反向传播)

setup:在模型初始化时重置layers及其相互之间的连接;

Forward:从bottom层中接收数据,进行计算后将其输入到top层;

backword:给定相对于top层输出的梯度,计算其相对于输入的梯度,并传播到bottom层。一个有参数的layer需要计算相对于各个

参数的梯度并存储在内部。

有关于自定义layer:只要定义好其setup,forward和backword,就可以将layer纳入到网络中。


Net是一系列Layers和其连接的集合。通过合成和自动微分,网络同时定义了一个函数和其对应的梯度。通过合成各层的输出来计算这个

函数,执行给定的任务,并通过合成各层的后向传播过程来计算来自损失函数的梯度,从而学习任务。caffe是一种端到端的机器学习引擎。

Net是一系列层组成的有向无环(DAG)计算图。一个典型的Net开始于data layer(从磁盘中加载数据)终止于loss layer(计算如分类

和重构这些任务的目标函数)。Net由一系列层和它们之间的相互连接构成,用的是一种文本建模语言。

Net::lnit()进行模型的初始化:创建blobs和layers以搭建整个网络DAG图。初始化时也会做另一些记录,例如确认整个网络结构的正确与否,

另外,初始化期间,Net会打印其初始化日志到INFO信息中。


Caffe中网络的构建和设备无关,blobs和layers在模型定义时隐藏了实现细节。CPU和GPU无缝切换并且独立于模型定义。

将模型定义和实现分离开来有利于研究和调用。


模型格式:模型是利用文本protocol buffer(prototxt)语言定义的,学习好的模型将会被序列化地存储在二进制protocol

buffer (binaryproto).caffemodel文件中。


第二章:forward and backword(前传/反传)

前传:caffe组合每一层的计算以得到整个模型的计算“函数”。本过程自底向上进行。数据x通过一个内积层得到g(x),

然后通过softmax层得到h(g(x)),通过softmax loss得到fw(x)


反传:caffe通过自动求导并反向组合每一层的梯度来计算整个网络的梯度。


只要定义好模型,这些计算就可以立即进行:Caffe已经自行准备好前传和反传的实现方法。

Net::Forward()和Net::Backward()方法实现网络的前传和后传,而Layer::Forward()和

Layer::Backward()计算每一层的前传和后传。

每一层都有forward_{cpu,gpu}()和backward_{cpu,gpu}方法来适应不同的计算模式。由于条件限制或者为了便利,一个层

可能仅实现了CPU或者GPU模式。


Solver优化一个模型,首先通过调用前传和获得输出和损失,然后调用反传产生模型的梯度,将梯度和权值更新后相结合来最

小化损失。Solver、网络和层之间的分工使得Caffe可以模块化并且开源。


第三章:Loss

与大多数的机器学习模型一样,在caffe中,学习是由一个损失函数驱动的。一个损失函数通过将参数集(即当前的网络权值)

映射到一个可以识别这些参数“不良程度”的标量值来学习目标。学习的目的是找到一个网络权重的集合,使得损失函数最小。


典型的一对多分类任务的损失函数是softMaxWithLoss函数。其中top blob是一个标量数值,该数值是整个batch的损失平均值

(由预测值pred和真实值label计算得到)


Loss weight:对于一个含有多个损失层的网络,损失权重可以被用来指定它们之间的相对重要性。

任何可以反向传播的层,可允许给予一个非0的loss_weight。在caffe中最终的损失函数可以通过对整个网络中所有的权值损失

进行求和计算获得。


第四章:Solver简介

solver通过协调Net的前向推断计算和反向梯度计算来对参数进行更新,从而达到减小loss的目的。

caffe模型的学习被分为两个部分:由Solver进行优化、更新参数,由Net计算出loss和gradient。


第五章:Layer Cataloge

为了创建一个caffe模型,我们需要在一个protocol buffer(prototxt)文件中定义模型的结构。

在caffe中,层和相应的参数都定义在caffe.proto文件里。


视觉层:Vision Layers

头文件:./include/caffe/vision_layers.hpp

视觉层的输入与输出均为图像。具体来说,大多数视觉层通常是在输入数据的某块区域执行特定的操作来产生对应的输出。

相反的,其它类型的层通常会忽略空间结构而把输入图像看做是一个维度为chw的“单个大向量”


激活层:一般来说,激活层执行逐个元素的操作,输入一个底层blob,输出一个尺寸相同的顶层blob。、


数据层:数据能过数据层进入caffe网络,处于网络的最底层,数据可以从高效率的数据库中读取(如LevelIDB或LMDB),

可以直接从内存中读取,若对读写效率要求不高也可以从硬盘上的HDFT文件或者普通文件的图片文件读取。

常见的数据预处理操作(减均值,尺度变换,随机裁剪或者镜像)可以通过设定参数TransformationParameter来实现。


数据库:Database

内存数据:In-Memory

memory data层直接从内存中读取数据而不用拷贝。使用这个层时需要调用MemoryDataLayer::Reset(C++)或者

Net.set_input_arrays(Python)来指定数据来源(四维按行存储的数组),每次读取一个大小为batch-sized的数据块。

HDF5 Input

HDF5 Output

图像数据 Images

窗口 Windows


InnerProduct层(也被称为全连接层)将输入看做一个一维向量,输出也为向量(输出blob的高和宽都为1)

分裂:The Split是一个可以将输入的blob分裂(复制)成多个输出blob的功能层,通常当一个blob需要给多个层作输入数据时该层

会被使用。


摊平Flattening 

latten层用来将尺寸问n*c*h*w的输入blob转换成一个尺寸为n*(c*h*w)的输出blob


变形 Reshape

Reshape层在不改变数据的情况下改变输入blob的维度,和Flatten操作一样,处理过程只在输入blob上进行,没有进行数据的拷贝


连结concat层用来将多个输入blob连结成一个blob输出。


第六章:Interfaces

caffe有命令行、python和matlab三种接口,来实现日常使用、研究代码的交互以及实现快速成型。caffe以C++库为核心,其在开发

中使用模块化接口,而不是每次都调用其定义的编译。cmdcaffe,pycaffe与matcaffe接口都可以供用户使用。


Command Line

命令行接口-cmdcaffe-是caffe中用来模型训练,计算得分以及方法判断的工具。没有附加参数的情况下运行caffe可得到帮助提示。

caffe与其它工具存放在caffe/build/tools目录下(这些例子要求你先要完成LeNet/MNIST的例子)


训练:caffe train命令可以从零开始学习模型,也可以从已保存的snapshots继续学习,或将已经训练好的模型应用在新的数据

与任务上进行微调即fine-tuning学习:

所有的训练都需要添加-solver solver.prototxt参数完成solver的配置。

继续训练需要添加-snapshot model_iter_1000.solverstate参数来加载solver snapshot

fine-tuning需要添加-weights model.caffemodel参数完成模型初始化


测试:caffe test命令通过在test phase中运行模型得到分数,并且用这分数表示网络输出的最终结果。网络结构必须被适当定义,

生成accuracy或loss作为其结果。测试过程中,终端会显示每个batch的得分,最后输出全部batch得分的平均值。


caffe time命令通过逐层计时与同步,执行模型检验。这是用来检验系统性能与测量模块型相对执行时间。


编译matcaffe

用make all matcaffe命令编译matcaffe,随后需要用make mattest命令进行测试。












0 0
原创粉丝点击