Caffe从入门到精通04

来源:互联网 发布:linux 查看登陆ip 编辑:程序博客网 时间:2024/06/05 08:54

【Blob】

Blob是caffe框架中一种标准的数组,一种统一的内存接口,它详细描述了信息是如何存储的,以及在如何在层之间通讯。

Blobs封装了运行时的数据信息,用于存储数据或者权值(data)和权值增量(diff)

每层(layer)的输入(bottom)和输出(top)都需要对Blob对象进行缓冲

Blob可以自助同步CPU和GPU上的数据

从数学上来说,Bolb就是一个N维数组,是caffe中的数据操作基本单位;对于图片来说,Blob可以表示为(N*C*H*W)的4维数组。其中N表示图片的数量,C表示图片的通道数,H和W分别表示图片的高度和宽度;对于CNN网络的feature-map来说,N表示一个batch中的样本数量,C为通道数(在 softmax-loss层之前实际就是分类数),H*W为feature-map的大小,通常为1

【layer】

层是网络模型的组成要素和计算的基本单位。

从bottom进行数据的输入,计算后,通过top进行输出。

每一种类型的层都定义了三种关键计算:setup,forward、backward

setup:层的建立和初始化,以及在整个模型中的连接初始化

forward:从bottom得到输入数据,进行计算,将计算结果送到top,进行输出

backward:从层的输出端top得到数据的梯度,计算当前的梯度,并将计算结果送到bottom,向前传递。

【Net】

Net代表一个完整的CNN模型,包含若干layer实例

Net对应的描述文件为*.prototxt

Net中既包含layer对象,又包含blob对象,其中blob对象用于存放每个layer输入/输出、中间结果;layer则根据net的描述,对指定的输入blob进行计算处理(卷积、池化、全连接、计算代价函数),然后将输出结果放到输出blob中

区分两种blob:1.权值blob:随着学习过程而更新,属于“模型” 2.layer的输入\输出 blob:随网络输入变换,属于“数据”

【Blob、layer、net三者的关系】

Blob提供了数据容器机制

layer通过不同策略使用该数据容器,实现多元化的计算处理过程,同时提供了各种基本的算法机制

net利用layer的这些机制,组合为完整的深度学习模型

【Solver】

solver是caffe的运算核心,协调着整个模型的运作。caffe程序必带的一个参数就是solver配置文件。运行代码一般为

%一般格式%.\Build\x64\Release\caffe.exe train -solver=*_solver.prototxt%举例%.\Build\x64\Release\caffe.exe train -solver=examples\mnist\lenet_solver.prototxt
solver的主要作用就是交替调用前向算法和后向算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法
常用solver优化算法就是SGD,即“随机梯度下降”
solver的流程:
1.设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络(通过调用另外一个配置文件prototxt来进行)
2.通过forward和backward迭代的进行优化来更新参数
3.定期的评价测试网络
4.在优化过程中显示模型和solver的状态
在每一次的迭代过程中,solver做了一下一下工作:
1.调用forward算法来计算最终的输出值,以及对应的loss
2.调用backward算法来计算每层的梯度
3.根据选用的solver算法,进行梯度进行参数更新
4.记录并保存每次迭代的学习率、快照、以及对应的状态

【详解solver.prototxt 以mnist为例】
# The train/test net protocol buffer definition# 训练\测试 网络配置定义net: "examples/mnist/lenet_train_test.prototxt"# test_iter specifies how many forward passes the test should carry out.# In the case of MNIST, we have test batch size 100 and 100 test iterations,# covering the full 10,000 testing images.# test_iter 表明了测试的前向迭代次数。# 就MNSIT而言,用于测试的一个批量含有100个样本,测试迭代100,这样就可以测试全部的10000张测试图片test_iter: 100# Carry out testing every 500 training iterations.#每500次训练迭代后执行一次测试test_interval: 500# The base learning rate, momentum and the weight decay of the network.#基础学习率、动量、网络权重的衰减base_lr: 0.01momentum: 0.9weight_decay: 0.0005# The learning rate policy#学习率策略lr_policy: "inv"gamma: 0.0001power: 0.75# Display every 100 iterations#每100次迭代显示一次display: 100# The maximum number of iterations#最大跌打次数max_iter: 1000# snapshot intermediate results#中间快照结果snapshot: 5000snapshot_prefix: "examples/mnist/lenet"# solver mode: CPU or GPU#求解器模式solver_mode: CPU

参数详解
net:设置深度网络模型。每一个模型就是一个net,需要在一个专门的配置文件中对net进行设置(本例为“examples\mnist\lenet_train_test.prototxt”),注意,文件的路径要从caffe的根目录开始,其他所有的配置都是这样。
test_iter:由于mnist的测试样本总数为10000,一次性全部执行数据效率很低,因此,我们将测试数据分成几个批次来执行,每个批次的数量就是batch_size。当batch_size为100时,需要在测试时迭代100次,才能把10000数据全部执行完。而执行完一次全部数据,称之为一个epoch
test_interval:测试间隔,也就是每训练500次,才进行一次测试
(base_lr基础学习率,lr_policy学习策略,gamma常量,power指数常量):学习率策略参数组,当lr_policy的设置为“inv”,则学习策略定义为,当前学习率定义为:base_lr * (1 + gamma * iter) ^ (- power),其中iter表示当前迭代次数,即可在迭代过程中,对学习率进行动态调整。
momentum:上一次梯度值得权重,隶属于SGD算法参数。SGD表达式如下图所示,

SGD通过负梯度▽L(W)和上一次的权重更新值V的线性组合来更新W,其中α是负梯度的学习率(base_lr),μ上一次梯度值的权重(momentum),用来加权之前梯度方向对现在梯度下降方向的影响,这两个参数一般根据经验设定。
weight_decay:正则项,减弱过拟合现象,隶属于loss函数参数。小批量mini-batch的loss函数的表达式如下图所示:

其中N为每一个mini-batch中的样本数量,fW(x(i))计算的是数据x(i)上的loss, 先将每个单独的样本x的loss求出来,然后求和,最后求均值。 r(W)是正则项(weight_decay),为了减弱过拟合现象。
综上所述,有了loss函数之后,就可以使用caffe默认SGD算法来优化求解。

diplay:每训练100次,在屏幕上显示一次
max_iter:最大迭代次数,这个数设置太小,会导致没有收敛,精度很低,设置太大,会导致震荡。
snapshot:快照,将训练出来的model和solver状态进行保存。本例为5000次迭代后进行保存,snapshot_prefix设置保存路径
solver_mode:设置运行模式,如果没有NVDIA的GPU,就用CPU模式。







原创粉丝点击