上文总结了基于caffe的网络模型要素及构成、数据库类型等,本文将承接上文对caffe的主要层的功能及参数进行解释说明。
- Layer 是caffe模型的本质内容和执行计算的基本单元,可进行多种运算,如convolve、pool、innerproduct、rectified-linear和sigmoid等非线性运算,还有元素及的数据变换、normalize、load data、softmax和hinge等losses计算。
- Layer 承担了网络的两个核心操作:forward pass(前向传播) 接收输入并计算输出和 backward pass(反向传播) 接收输出梯度,计算相对于参数和输入梯度并反向传播给前面的层。
1、data layers
caffe的数据层data layers处在最底层,数据可以从高效的数据库中读取,也可以直接从内存中读取,或者直接从硬盘存储的文件中读取。
- 数据预处理层,常见操作有 减均值、尺度变换、随机裁剪或者镜像 等。
(1)数据库
source | 数据库文件路径 | 必填 |
---|
batch_size | 网络单次数据数据量 | 必填 |
rank_skip | 异步随机梯度下降中使用 | 可选 |
backend | 选择是LMDB还是LevelDB | 可选 |
(2)内存数据
batch_size | 网络单次数据数据量 | 必填 |
---|
channels | 通道数 | 必填 |
height | 图像高度 | 必填 |
weight | 图像宽度 | 必填 |
(3)HDF5数据
source | 数据库文件路径及文件名 | 必填 |
---|
batch_size | 网络单次数据数据量 | 必填 |
(4)图像数据Images
source | txt文件的路径名,文件中每行存储一张图片的路径及对应的标签 | 必填 |
---|
batch_size | 网络单次数据数据量,即图片数 | 必填 |
rank_skip | 异步随机梯度下降中使用 | 可选 |
shuffle | 是否随机打乱图片顺序,默认为false | 可选 |
new_height | 根据设置的值将图像调整成给定的高度 | 可选 |
new_weight | 根据设置的值将图像调整成给定的宽度 | 可选 |
(5)窗口Windows
source | 数据库文件路径及文件名 | 必填 |
---|
batch_size | 网络单次数据数据量,即图片数 | 必填 |
2、convolution layers
- 层类型:Convolution
- CPU实现代码: .\src\caffe\layers\conv_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\conv_layer.cu
- 参数:
num_output | 指定卷积核的数量 | 必填 |
---|
kernel_size | 指定卷积核的高度和宽度 | 必填 |
weight_filler | 指定参数的初始化方案 | 可选 |
bias_term | 指定是否给卷积输出添加偏置项,默认true | 可选 |
pad | 指定在输入图像周围补0的像素个数,默认为0 | 可选 |
stride | 指定卷积核在输入图像上滑动的布长,默认为1 | 可选 |
group | 指定分组卷积操作的组数 | 可选 |
3、pooling layers
- 层类型:Pooling
- CPU实现代码: .\src\caffe\layers\pooling_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\pooling_layer.cu
- 参数:
kernel_size | 指定池化窗口的高度和宽度 | 必填 |
---|
pool | 指定池化方法,有三种:最大值、均值、随机 | 可选 |
pad | 指定在输入图像周围补0的像素个数,默认为0 | 可选 |
stride | 指定池化窗口在输入图像上滑动的布长,默认为1 | 可选 |
4、InnerProduct Layers
- 层类型:InnerProduct(全连接层或者內积层)
- CPU实现代码: .\src\caffe\layers\inner_product_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\inner_product_layer.cu
- 参数:
num_output | 全连接层的输出节点或者滤波器个数 | 必填 |
---|
weight_filler | 指定参数的初始化方案,默认类型为constant,值为0 | 必填 |
bias_filler | 指定滤波器的偏置类型,默认类型为constant,值为0 | 可选 |
bias_term | 指定是否给滤波器输出添加并训练偏置项,默认true | 可选 |
5、ReLU Layers
- 层类型:ReLU
- CPU实现代码: .\src\caffe\layers\relu_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\relu_layer.cu
- 参数:
negative_slope | 设置激活函数在负数部分的斜率。输入数据小于零的部分乘以这个因子,斜率为0时,小于零的部分完全滤掉,默认为0 | 可选 |
---|
给定一个输入数据,当x>0时,relu输出为x,当x≤0时,relu输出为x*negative_slope,当negative_slope未指定时,等同于标准ReLU函数max(x,0)。
6、Sigmoid Layers
- 层类型:Sigmoid
- CPU实现代码: .\src\caffe\layers\sigmoid_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\sigmoid_layer.cu
- 参数:无
Sigmoid层使用sigmoid(x)函数计算每个输入数据的输出。
7、LRN Layers
- 层类型:LRN(local response normalization,局部响应值归一化)
- CPU实现代码: .\src\caffe\layers\lrn_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\lrn_layer.cu
- 参数:
local_size | 跨通道时的归一化,指名参与求和的通道数;通道内的规范化,指名参与求和的方形区域的边长。默认为5 | 可选 |
---|
alpha | 尺度参数,默认值为1 | 可选 |
beta | 指数参数,默认值为1 | 可选 |
norm_region | 指定在通道之间规范化还是通道内规范化,默认通道间 | 可选 |
8、Dropout Layers
- 层类型:Dropout
- CPU实现代码: .\src\caffe\layers\dropout_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\dropout_layer.cu
- 参数:
dropout_ratio | 过拟合丢弃数据的概率,默认为0.5 | 可选 |
---|
9、SoftmaxWithLoss Layers
- 层类型:SoftmaxWithLoss
- CPU实现代码: .\src\caffe\layers\softmax_loss_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\softmax_loss_layer.cu
- 参数:无
softmax_loss层没有参数项,它封装了一个softmax层即softmax_loss=softmax+loss regression,该层输出的是loss值。
10、Softmax Layers
- 层类型:Softmax
- CPU实现代码: .\src\caffe\layers\softmax_layer.cpp
- CUDA GPU实现代码: .\src\caffe\layers\softmax_layer.cu
- 参数:无
softmax_loss层没有参数项,该层输出的是似然值。
11、Accuracy Layers
- 层类型:Accuracy
- CPU实现代码: .\src\caffe\layers\accuracy_layer.cpp
- 参数:
phase:include | 默认test阶段输出分类精确度 | 必填 |
---|
12、caffe solver
caffe模型的学习分为两个部分:solver优化、更新参数以及Net计算loss和gradient。
solver方法是计算最小化损失loss值,采用方法有:
- SGD(随机梯度下降)
- AdaDelta(鲁棒的学习率方法)
- AdaGrad(自适应性梯度下降方法)
- Adam(基于梯度的优化方法)
- NAG(加速度下降)
- RMSprop(基于梯度)
每一次迭代完成了一下功能:
- 调用Net的前向过程计算输出和loss
- 调用Net的后向过程计算梯度
- 根据solver方法,利用梯度更新参数
- 根据学习率,历史数据和求解方法更新solver状态,使权重逐步更新到最终的学习状态。