今天主要学习caffe网络的一些定义。
caffe模型需要两个重要的参数文件:网络模型(*.prototxt)和参数配置(*.solver.prototxt)。训练出的模型输出文件的格式为:*.caffemodel。
caffe的模型是由Protocol Buffer语言定义后存放于caffe.prototxt中,使得caffe更加灵活易于扩展。
caffe支持LevelDB,LMDB,HDF5三个数据库输入,原始图片需要通过convert_imageset.cpp转换格式。命令如下:
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
参数说明:FLAGS:图片参数,主要包括-gray是否灰度图,-shuffle是否随机打乱。
ROOTFOLDER/:图片的绝对路径。
LISTFILE:图片文件列表清单,一个txt文件,一行一张图片
DB_NAME:生成的数据库文件存放目录。
caffe使用Blob结构来存储,交换和处理网络中正/反向传播的数据和导数信息。Blob中最重要的数据是values和gradients,存储单元对应data(网络中传递的普通数据)和diff(计算得到的梯度)两个数据节点。有两种数据访问方法:静态不改变数据方法和动态改变数据方法:
Const Dtype* cpu_data() const;
Dtype mutable_cpu_data();
Layer是caffe模型的本质内容和执行计算的基本单元。可以执行卷积,池化,内积,rectified-linear和sigmoid等非线性操作,以及元素级的数据交换,归一化,数据加载,softmax和hinge等损失计算。在Layer catalogue层目录中可以查看所有操作。
1.Data Layers:位于最底层,数据可以从数据库/内存/硬盘中读取。预处理操作在该层进行,如尺度变换,随机裁剪和镜像等等,设定Transformation Parameter实现。
(1). 数据库:
layer{
name:"mnist"
tpye:"Data"#层类型
top:"data"
top:"label"
include{
phase:TRAIN
}
transform_param{
scale:0.0039
}
data_param{
source:"example/mnist/mnsit_train_lmdb"
batch_size:64
backend:LMDB
}
}
(2).内存数据:memory data 直接从内存中读取数据而不是拷贝,需要调用MemoryDataLayer::Resst(C++)或是Net.set_input_arrays(Python)来指定数据来源。
layer{
width:100
channels:1
}
transform_param{
scale:0.0039
mean_file:"mean.proto"
mirror:false
}
}
(3).HDF5数据
layer{
name:"data"
type:"HDF5Data" #层类型
top:"data"
top:"label"
hsf5_data_param{
source:"examples/hdf5_classification/data/train.txt" #文件路径 必填
batch_size:10 #每次输入网络数据 必填
}
}
(4).图像数据Images
layer{
name:"data"
type:"ImageData"
top:"data"
top:"label"
transform_param{
mirror:false
crop_size:227
mean_file:"data/ilsvrc12/imagenet_mean.linaryproto"
}
image_data_param{
source:”examples/_temp/file_list.txt“ #txt文件对应的路径 txt每一行对应一张图片 必填
batch_size:50 #每次处理的图片数 必填
new_height:256
new_width:256
}
}
(5).Windows窗口
source&batch_size必填 层类型:WindowsData
(6).Dummy 层类型:Dummydata 用于开发&调试
2.卷积层 Convolution Layers
输入:n*c_i*h_i*w_i
输出:n*c_o*h_o*w_o, 其中h_o=(h_i+2*pad_h-kerhel_h)/stride_i+1
layer{
name:"conv1"
type:"convulution" #层类型
bottom:"data"
top:"conv1"
param{lr_mult:1 decay_mult:1} #卷积核的局部学习率和权值衰减因子
param{lr_mult:2 decay_mult:0} #偏置的局部学习率和权值衰减因子
convolution_param{
num_output:96 #学习96组卷积核
kernel_size:11
stride:4 #滑动步长
weight_filter{
type:"gaussian" #使用高斯分布初始化卷积核
std:0.01
}
bias_filter{
type:"constant" #使用常数0初始化偏置
value:0
}
}
}
3.池化层 Pooling Layer
层类型:Pooling。池化层输入图片的大小如同卷积层。核的大小是必填参数。
4.全连层或内积层 InnerProduct Layers
层类型:InnerProduct。 num_output(输出节点数)&weight_filter(参数初始化方案)必填。
输入:n*c_i*h_i*w_i,输出:n*c_o*1*1
5.ReLU Layers
层类型:ReLU
6.Sigmoid Layers
层类型:Sigmoid
7.LRN Layers 局部响应值归一化
层类型:LRN。通过对输入数的局部归一化操作,执行了一种“侧抑制”操作。
8.Dropout Layers
层类型:Dropout,防止过拟合,有概率的丢弃数据。
9.SoftmaxWithLoss Layers
层类型:SoftmaxWithLoss,封装了softmax的loss层,输出loss值。
10.Softmax Layers
层类型:Softmax。无参数,输出拟然值。
11.Accuracy Layers
层类型:Accurary。phase:include必填,默认test阶段输出分类精度。
Caffe Solver通过Net的前向推断计算和反向计算对参数进行更新,减小loss。Caffe有如下Solver:SGD(随机梯度下降),AdaDelta,AdaGrad(自适应梯度),Adam,Nesterov,RMPSprop。
SGD:其中有两个重要的参数:学习率(负梯度的权重)&动量(一次更新值的权重),这两个学习参数需要一定的调整才能达到最好的效果。一般将学习率设置为0.01,当loss达到稳定时,将学习率除以一个常数,如10,重复多次。动量设置为0.9,它可以使权值更新更平缓。如果训练过程中出现发散,可以减小基准学习速率再训练,重复多次,找到一个合适的学习速率。
AdaDelta:一种鲁邦的学习率方法,同样是基于梯度的优化方法。
AdaGrad:自适应性梯度下降,需要格外的空间存储历史梯度信息。
Adam:可以看做AdaGrad的泛化形式,参数默认值:momentum=0.9,momentum2=0.999,delta=10^-8.
NAG:一种凸优化算法,与SGD权值更新相似。
RMSprop:如果梯度产生震动,让梯度减少(乘以(1-delta)),否则乘以delta。默认值delta=0.02.