Caffe 专题二各层的含义
caffe 各层的详解
caffe 网络配置文件中有prototx 和 solver 文件、其中prototxt 文件定义了网络模型结构、solver 文件定义了网络的超参数。
prototxt 中的数据层详解
数据层是每一个模型的起始层或者底层、通过数据层完成blobs 格式数据的上传、在数据层的某些参数可以实现数据的预处理(减去均值,放大缩小,剪裁,镜像等)
训练时的数据输入层:
name: "LeNet"
layer {
name: "mnist" # 对该层的命名
type: "Data" # 对该层的类型定义
top: "data" # bottom 代表输入数据、top 代表输出的数据、可以有多个bottom 和top
top: "label"
include {
phase: TRAIN # 此网络层在训练阶段使用
}
transform_param {
scale: 0.00390625 # 将数据进行缩放,实际其值为1/255,即将输入数据由0-255规划到0-1之间
mean_file_size: mean.binaryproto # 将数据进行均值化,使用的是caffe 框架自带的均值化操作
mirror: 1 # 其值可以是1 或 0,代表开启和关闭镜像
crop_size: 227 # 表示以227*227进行裁剪
}
data_param {
source: "examples/mnist/mnist_train_lmdb" # 读取训练数据
batch_size: 64 # 训练时的batch 大小,即批量处理数
backend: LMDB # 训练的数据格式,数据格式有LevelDB、LMDB 和hfd5 格式
}
}
测试时的数据输入层:
layer {
name: "mnist" # 对该层的命名
type: "Data" # 对该层的类型定义
top: "data" # bottom 代表输入数据、top 代表输出的数据、可以有多个bottom 和top
top: "label"
include {
phase: TEST # 此层在测试阶段使用
}
transform_param {
scale: 0.00390625 # 将数据进行缩放,实际其值为1/255,即将输入数据由0-255规划到0-1之间
}
data_param {
source: "examples/mnist/mnist_test_lmdb" # 读取训练数据
batch_size: 100 # 训练时的batch 大小,即批量处理数
backend: LMDB # 训练的数据格式,数据格式有LevelDB、LMDB 和hfd5 格式
}
}
维度变换层:
layer {
name: "reshape" # 对该层的命名
type: "Reshape" # 不改变输入的数据值得大小,仅改变维度
bottom: "input"
top: "output"
reshape_param {
shape { # 0:表示维度不变,即输入维度和输出维度的相等
dim: 0
dim: 0
dim: 0
dim: -1 # -1 为自己推断
}
}
}
eg: 假设原数据为 32*3*28*28, 表示32张3通道的28*28的彩色图片
shape {
dim:0
dim:0
dim:14
dim:-1
}
其输出为: 32*32*14*56
卷积层:
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
param {
lr_mult: 1 # 网络权值学习率的系数,最终的学习率=solver 文件中的基础学习率base_lr * lr_mult
decay_mult: 1 # 权值衰减
}
param {
lr_mult: 2 # 偏置项学习率的系数,一般是权值系数的2倍
decay_mult: 0
}
convolution_param {
num_output: 20
pad: 2
kernel_size: 5
stride: 1
weight_filler {
type: "xavier" # 对权值进行初始化,默认为"constant", 即值全为0。还有“xavier”算法和“gaussian”算法,但一般使用“xavier”算法比较多,保证输出和输入尽可能地服从相同的概率分布,即均匀化分布
}
bias_filler {
type: "constant" # 偏置项的初始化,一般是"constant"
}
}
}
池化层:
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX # 设置为最大池化,可选方法还有平均池化和最小池化等
kernel_size: 2 # 设置池化尺寸的大小
stride: 2 # 设置池化的步长
}
}
LRN层:
对输入的局部区域进行归一化,达到"侧抑制"的效果。对于输入除以一个归一化公式,这个最早是Alexnet 提出的现在用的少。
layer {
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
local_size: 3 # 默认是5。如果是跨通道LRN,则表示求和的通道数;如果是通道内LRN,则表示求和的正方形区域长度。
alpha: 5e-05 # 默认是1,归一化公式中参数
beta: 0.75 # 默认是5,归一化公式中参数
norm_region: WITHIN_CHANNEL # 默认为ACROSS_CHANNELS, ACROSS_CHANNELS 表示在相邻的通道间求和归一化,WITHIN——CHANNEL 表示在一个通道内部特定的区域内进行求和归一化
}
}
全连接层:
类似卷积层,只是它的卷积核大小和原数据大小一致。因此它的参数基本和卷积层的参数一样。
layer {
name: "ip1"
type: "InnerProduct"
bottom: "pool2"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 500
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
激活函数层:
layer {
name: "relu1"
type: "ReLU" #将激活函数设置为ReLU,还可以是Sigmoid等
bottom: "ip1"
top: "ip1"
}
dropout层:
用来防止过拟合,一般在全连接层后。
layer {
name: "drop6"
type: "Dropout"
bottom: "ip1" #输出和输入为同一层
top: "ip1"
dropout_param {
dropout_ratio: 0.5 #让网络某些隐藏层节点的权重随机失活,其值为0.5即每个节点权重有50%的概率失活
}
}
BN层(BatchNormal):
批量归一化或者正则化,使其不依赖初始值,加快训练速度。
layer {
name: "batchnorm"
type: "BatchNorm"
bottom: "conv"
top: "conv"
batch_norm_param {
use_global_stats: true
}
include {
phase: TRAIN/TEST
}
}
计算精度层:
计算准确率,一般在测试阶段使用。
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
计算loss层:
计算损失,输出loss值。
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}
softmax层:
输出概率值。
layer {
name: "prob"
type: "Softmax"
bottom: "fc8-conv"
top: "prob"
}