类型:CONVOLUTION
例子
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "conv1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: CONVOLUTION </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "data" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "conv1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>blobs_lr: 1 # learning rate multiplier for the filters </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>blobs_lr: 2 # learning rate multiplier for the biases </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>weight_decay: 1 # weight decay multiplier for the filters </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>weight_decay: 0 # weight decay multiplier for the biases </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>convolution_param { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>num_output: 96 # learn 96 filters </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>kernel_size: 11 # each filter is 11x11 </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>stride: 4 # step 4 pixels between each filter application </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>weight_filler { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: "gaussian" # initialize the filters from a Gaussian </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>std: 0.01 # distribution with stdev 0.01 (default mean: 0) } </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bias_filler { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: "constant" # initialize the biases to zero (0) </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span> value: 0 } </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>}</span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>}</span>
blobs_lr: 学习率调整的参数,在上面的例子中设置权重学习率和运行中求解器给出的学习率一样,同时是偏置学习率为权重的两倍。
weight_decay:
卷积层的重要参数
必须参数:
num_output (c_o):过滤器的个数
kernel_size (or kernel_h and kernel_w):过滤器的大小
可选参数:
weight_filler [default type: 'constant' value: 0]:参数的初始化方法
bias_filler:偏置的初始化方法
bias_term [default true]:指定是否是否开启偏置项
pad (or pad_h and pad_w) [default 0]:指定在输入的每一边加上多少个像素
stride (or stride_h and stride_w) [default 1]:指定过滤器的步长
group (g) [default 1]: If g > 1, we restrict the connectivityof each filter to a subset of the input. Specifically, the input and outputchannels are separated into g groups, and the ith output group channels will beonly connected to the ith input group channels.
通过卷积后的大小变化:
输入:n * c_i * h_i * w_i
输出:n * c_o * h_o * w_o,其中h_o = (h_i + 2 * pad_h - kernel_h) /stride_h + 1,w_o通过同样的方法计算。
类型:POOLING
例子
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "pool1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: POOLING </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "conv1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "pool1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>pooling_param { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>pool: MAX </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>kernel_size: 3 # pool over a 3x3 region </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>stride: 2 # step two pixels (in the bottom blob) between pooling regions }</span>
<span style="background-color: rgb(255, 255, 255);">}</span>
卷积层的重要参数
必需参数:
kernel_size (or kernel_h and kernel_w):过滤器的大小
可选参数:
pool [default MAX]:pooling的方法,目前有MAX, AVE, 和STOCHASTIC三种方法
pad (or pad_h and pad_w) [default 0]:指定在输入的每一遍加上多少个像素
stride (or stride_h and stride_w) [default1]:指定过滤器的步长
通过池化后的大小变化:
输入:n * c_i * h_i * w_i
输出:n * c_o * h_o * w_o,其中h_o = (h_i + 2 * pad_h - kernel_h) /stride_h + 1,w_o通过同样的方法计算。
类型:LRN
Local ResponseNormalization是对一个局部的输入区域进行的归一化(激活a被加一个归一化权重(分母部分)生成了新的激活b),有两种不同的形式,一种的输入区域为相邻的channels(cross channel LRN),另一种是为同一个channel内的空间区域(within channel LRN)
可选参数:
local_size [default 5]:对于cross channel LRN为需要求和的邻近channel的数量;对于within channel LRN为需要求和的空间区域的边长
alpha [default 1]:scaling参数
beta [default 5]:指数
norm_region [default ACROSS_CHANNELS]: 选择哪种LRN的方法ACROSS_CHANNELS 或者WITHIN_CHANNEL
深度学习是通过最小化输出和目标的Loss来驱动学习。
类型: EUCLIDEAN_LOSS
例子:
<span style="background-color: rgb(255, 255, 255);"># L1 Normlayers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "loss" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: HINGE_LOSS </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "pred" bottom: "label"}</span>
<span style="background-color: rgb(255, 255, 255);"># L2 Normlayers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "loss" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: HINGE_LOSS </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "pred" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "label" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "loss" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>hinge_loss_param { norm: L2 }</span>
<span style="background-color: rgb(255, 255, 255);">}</span>
可选参数:
norm [default L1]: 选择L1或者 L2范数
输入:
n * c * h * wPredictions
n * 1 * 1 * 1Labels
输出
1 * 1 * 1 * 1Computed Loss
例子:
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "relu1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: "RELU" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "conv1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "conv1"}</span>
可选参数:
negative_slope [default 0]:指定输入值小于零时的输出。
ReLU是目前使用做多的激励函数,主要因为其收敛更快,并且能保持同样效果。
标准的ReLU函数为max(x, 0),而一般为当x > 0时输出x,但x <= 0时输出negative_slope。RELU层支持in-place计算,这意味着bottom的输出和输入相同以避免内存的消耗。
例子:
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "encode1neuron" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "encode1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "encode1neuron" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: SIGMOID}</span>SIGMOID 层通过 sigmoid(x) 计算每一个输入x的输出,函数如下图。
例子:
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "encode1neuron" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "encode1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "encode1neuron" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: SIGMOID}</span>
TANH层通过 tanh(x) 计算每一个输入x的输出,函数如下图。
例子:
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "layer" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "in" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "out" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: ABSVAL}</span>ABSVAL层通过 abs(x) 计算每一个输入x的输出。
例子:
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "layer" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "in" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "out" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: POWER </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>power_param { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>power: 1 </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>scale: 1 </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>shift: 0 }</span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>}</span>可选参数: power [default 1] scale [default 1] shift [default 0]
POWER层通过 (shift + scale * x) ^ power计算每一个输入x的输出。
例子:
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "layer" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "in" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "out" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: BNLL}</span>
BNLL (binomial normal log likelihood) 层通过 log(1 + exp(x)) 计算每一个输入x的输出。
数据通过数据层进入Caffe,数据层在整个网络的底部。数据可以来自高效的数据库(LevelDB 或者 LMDB),直接来自内存。如果不追求高效性,可以以HDF5或者一般图像的格式从硬盘读取数据。
类型:DATA
必须参数:
source:包含数据的目录名称
batch_size:一次处理的输入的数量
可选参数:
rand_skip:在开始的时候从输入中跳过这个数值,这在异步随机梯度下降(SGD)的时候非常有用
backend [default LEVELDB]: 选择使用 LEVELDB 或者 LMDB
batch_size:一次处理的输入的数量
HDF5的作用和这节中的其他的层不一样,它是把输入的blobs写到硬盘
new_height, new_width: 把所有的图像resize到这个大小
Dummy 层用于development 和debugging。具体参数DummyDataParameter。
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "fc8" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: INNER_PRODUCT </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>blobs_lr: 1 # learning rate multiplier for the filters </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>blobs_lr: 2 # learning rate multiplier for the biases </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>weight_decay: 1 # weight decay multiplier for the filters </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>weight_decay: 0 # weight decay multiplier for the biases </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>inner_product_param { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>num_output: 1000 </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>weight_filler { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: "gaussian" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>std: 0.01 } </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span> bias_filler { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: "constant" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>value: 0 } </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>} </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span> bottom: "fc7" top: "fc8"}</span>
必要参数:
num_output (c_o):过滤器的个数
可选参数:
weight_filler [default type: 'constant' value: 0]:参数的初始化方法
bias_filler:偏置的初始化方法
bias_term [default true]:指定是否是否开启偏置项
通过全连接层后的大小变化:
输入:n * c_i * h_i * w_i
输出:n * c_o * 1 *1
<span style="background-color: rgb(255, 255, 255);">layers { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>name: "concat" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "in1" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>bottom: "in2" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>top: "out" </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>type: CONCAT </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>concat_param { </span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>concat_dim: 1 }</span>
<span style="background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>}</span>
可选参数:
concat_dim [default 1]:0代表链接num,1代表链接channels
通过全连接层后的大小变化:
输入:从1到K的每一个blob的大小n_i * c_i * h * w
输出:
如果concat_dim = 0: (n_1 + n_2 + ... + n_K) *c_1 * h * w,需要保证所有输入的c_i 相同。
如果concat_dim = 1: n_1 * (c_1 + c_2 + ... +c_K) * h * w,需要保证所有输入的n_i 相同。
通过Concatenation层,可以把多个的blobs链接成一个blob。
类型:MVN