Caffe笔记(二)Caffe 必备基础知识点

引言:

这篇博客的内容主要摘自《深度学习 21天实战caffe》,另外在此推荐初学者可以阅读由CaffeCN深度学习社区集体翻译的Caffe官方教程中译本v1.0

Caffe数据结构

Blob----caffe的基本存储单元,用于存储和交换数据。

在内存中表示四维数组,维度从低到高为(width_,height_,channels_,num_),前三项分别为图像宽、高、通道数,num_表示图像数,用于存储数据或权值(data)和权值增量(diff)

Layer----caffe的基本计算单元,至少有一个输入/输出Blob,部分Layer带有权值(weight)和偏置项(bias)

Net----caffe的一个完整的CNN模型


Caffe I/O模块

数据读取层(DataLayer/ImageDataLayer)----读取LMDB(Lightning Memory-Mapped Database Manager)、LEVELDB/原始图像

数据交换器(DataTransformer)----主要提供对原始输入图像的预处理方法,包括随机切块、随机镜像、幅度缩放、去均值、灰度变换等


Caffe模型

深度学习模型通常由三部分参数组成:

可学习参数(Learnable Parameter),又称可训练参数、神经网络权系数、权重,其数值由模型初始化参数、误差反向传播过程控制,一般不可人工干预。训练结束时会以二进制ProtoBuffer文件(.caffemodel)形态序列化并存储在磁盘上。

结构参数(Archetecture Parameter),包括卷积层/全连接层/下采样层数目、卷积核数目、大小等描述网络结构的参数,一旦设定好,在训练阶段无法更改。网络初始化时通过该描述文件(.protoxt)构建Net、Layer对象形成最终模型结构。

训练超参数(Hyper-Parameter),用来控制网络训练收敛的参数,训练阶段可以自动或手动调节以获取更好的效果,预测阶段不需要该参数,如学习速率、遗忘因子等。训练阶段利用该描述文件构建求解器(Solver)对象。


反向传播(Backward)----类似链式求导法则,计算梯度

损失函数(Loss Function)----损失层(Loss Layer)是CNN终点,接收两个Blob(CNN预测值;真实标签)作为输入,将两个输入进行一系列运算得到当前网络的损失函数
Caffe中实现了多种损失层,分别用于不同场合:

Hinge损失函数----最大间隔分类,SVM

SoftmaxWithLossLayer----实现了Softmax+交叉熵损失函数计算过程,适用于单label的分类问题

Sigmoid+交叉熵损失函数----用于多属性/多分类问题


Caffe最优化求解过程

求解器(Solver)----负责模型优化(使损失函数达到全局最小),即将梯度转换成权值增量

所做工作如下:

1.创建用于学习的训练网络和用于评估学习效果的测试网络;记录优化过程,为模型、求解器状态打快照;周期性地评估测试网络;

2.调用Forward计算输出和损失函数;调用Backward计算梯度;根据求解器算法将梯度转换为权值增量

求解器算法:

随机梯度下降算法(Stochastic Gradient Descent,SGD)


Caffe支持的深度学习特性

卷积层(Conv)

概念:卷积层主要是让输入和卷积核做一个卷积计算,得到图像的特征,通俗来说是一个特征提取的过程。

区别:卷积层所做的卷积计算与平常所接触的二维卷积有所不同,首先维度上升至三维及以上,对应维度仍然按二维卷积的方式计算出多个输出,再将数值求和得到最终结果。(因此要求输入图像和卷积核的维度相同);其次它的计算过程没有“翻转”操作。

基本原则:局部互联、共享权值、下采样、使用多个卷积层

卷积参数:

1.卷积步长(Stride):窗口滑动一次的距离,从效率出发,既不能太大也不能太小。

2.Pad 为了在卷积过程中不让边缘像素点利用频次比其他点低,因此用0填充边缘,Pad值决定填充的圈数。

3.假设Input(hi,wi)、kernel_size、stride、Output(ho,wo) 则ho=(hi-kernel_size+2*Pad)/stride+1

4.卷积核个数,假定每层有L个输入,K个输出,则需要K个卷积核;学习参数数量(params)=卷积核个数*卷积核尺寸

下采样层(pooling layer)----针对特征图选取一个“窗口”操作

算法:MAX(取大) 、MEAN(平均)  反向传播的时候一样,MAX:最大值点不变其余的点用0填充、MEAN:将数值按SIZE平均,每一个都相同。

注:同一模型不同的下采样层通常选取同样大小的“窗口”,如 2x2 MAXPOOL stride2

激活函数(Activation Function)

激活函数使得深度神经网络具有丰富的表达能力,几个常用的激活函数如下:

(1)Sigmoid函数--值域(0,1)


(2)tanh函数--值域(-1,1)

注:上述两种函数存在梯度消失问题,即在反向传播计算激活函数的导数过程中,梯度每传递一层都会衰减一次,网络层数较多时,梯度会不停衰减直到消失。

(3)ReLU函数--值域[0,+∞)  是非饱和激活函数


个人对于跑神经网络例程的理解

训练模型:

1.设计网络,形成模型描述文件(.protoxt)。包括层的名称、类型、数目、作用、相关参数(数据来源/类型/数目、卷积核参数等)

注:

(1)一般选择参照or修改别人已训练好的模型,根据自身项目考虑是否要更改参考的网络模型及训练超参数,即进一步微调(finetune)。参考模型获取链接一

(2)设计网络时尽量用小网络的堆叠替代大网络,用filter数目的翻倍来弥补pooling压缩特征图带来的影响。

2.设定训练超参数,形成求解器描述文件(.protoxt)。包括网络选取、相关参数(迭代次数、学习速率等)、求解模式(CPU or GPU)

3.执行编译好的caffe.bin,语法:caffe <command><args>

常见command:train、test、time(评估模型执行时间)、device_query(显示GPU诊断信息)

常见可选参数:-iterations(循环迭代次数,默认50)、-model(指定模型描述文件)、-solver(指定求解器文件)、-weights(指定用于微调的训练权值)

注:

1.通常在训练前还要对数据进行预处理{格式转换、数据增强(包括水平翻转、随机组合平移/旋转/拉伸/修剪等操作、随机裁剪/缩放)等}以加快训练速度,提高效率。

2.输出日志中可以看到最后训练的模型权值、训练状态保存的文件名和路径。

利用训练好的网络对数据进行预测

执行caffe.bin test -model *****.prototxt -weights ******.caffemodel


贴一些别人好的博客地址:

caffe - 随笔分类 - denny402 - 博客园

Caffe-Python接口常用API参考 - CSDN博客


猜你喜欢

转载自blog.csdn.net/qq_38156052/article/details/77905925
今日推荐