layer定义 | 深度学习caffe框架

正文共2500张图,13张图,预计阅读时间13分钟。


640?wx_fmt=pngcaffe的代码层次


首先让我们回顾一下caffe的代码层次: blob,layer, net和solver.


其中blob是数据结构, layer是网络的层, net是将layer搭建成的网络,solver是网络BP时候的求解算法. 本节主要介绍caffe的layer基本结构, 种类, 以及不同类型的layer如何定义.


640?wx_fmt=pnglayer的基本结构和种类


Caffe的layer的基本结构:


1Layer{
2name: "xx"  # 名称
3type"xx" # 类型
4top: "xx" # 输出
5bottom: "xx" # 输入
6some_param { # 其他参数定义等
7...
8}
9}


640?wx_fmt=png


从一个典型的卷积神经网络模型结构出发, 首先需要数据输入层,然后是图像的预处理,例如图像切割slice, 卷积层Convolution, 在caffe中,激活函数等数据运算也用layer的方式定义. 总的来说,caffe的layer种类如下:


  • 数据输入层:

  • 视觉层(Vision Layers): 包括Convolution, Pooling, Local Response Normalization (LRN), im2col等

  • 损失层: softmax-loss层, Euclidean层.

  • 循环层: RNN, LSTM层等.

  • 工具层(Utility layer): 例如reshape层, concat层等

  • 普通层(Common layer): dropout层, 全连接层, embed层.


640?wx_fmt=png数据输入层


一个常见的数据输入层定义如下. 输入数据定义为lmdb数据库格式.


 1layer {
2name: "data"
3type: "CPMData"
4top: "data"
5top: "label"
6data_param {
7source: "/home/zhecao/COCO_kpt/lmdb_trainVal"  # lmdb数据文件路径
8batch_size: 10
9backend: LMDB
10}
11cpm_transform_param { # 图片预处理
12stride: 8 
13max_rotate_degree: 40 # 旋转
14visualize: false 
15crop_size_x: 368 
16crop_size_y: 368
17scale_prob: 1
18scale_min: 0.5 # 缩放比例
19scale_max: 1.1 # 缩放比例
20target_dist: 0.6
21center_perterb_max: 40
22do_clahe: false
23num_parts: 56
24np_in_lmdb: 17
25 }
26}


详细的数据数据层定义见:http://www.cnblogs.com/denny402/p/5070928.html


640?wx_fmt=png视觉层


视觉层包括Convolution, Pooling, Local Response Normalization (LRN), im2col等层


640?wx_fmt=png卷积层


卷积层是卷积神经网络的核心层. 卷积层的定义:


 1layer {
2name"conv1_1"
3type: "Convolution"
4bottom: "image" # 输入
5top: "conv1_1" # 输出
6param { 
7lr_mult: 1.0  #权值学习率的系数,
8decay_mult: 1 # 学习率的衰减系数
9}
10param {
11lr_mult2.0 # 偏置的系数
12decay_mult: 0 # 偏置的衰减系数
13}
14convolution_param {
15num_output64 #卷积核(filter)的个数
16pad: 1  # 步长
17kernel_size: 3 # 卷积核大小
18weight_filler { # 卷积核权值的初始化, 默认是常值0, 或者gaussian/ xavier
19type: "gaussian"       
20std: 0.01
21}
22bias_filler {
23type"constant"
24     }
25  }
26}


lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。


pad: 进行边缘扩充。默认为0, 也就是不扩充。 扩充的时候是左右、上下对称的,比如卷积核的大小为5*5,那么pad设置为2,则四个边缘都扩充2个像素,即宽度和高度都扩充了4个像素,保证在卷积运算之后的特征图就不会变小。也可以通过pad_h和pad_w来分别设定。


输入:n*c0*w0*h0
输出:n*c1*w1*h1


其中,c1就是参数中的num_output,生成的特征图个数


w1=(w0+2*pad-kernel_size)/stride+1;
h1=(h0+2*pad-kernel_size)/stride+1;


如果设置stride为1,前后两次卷积部分存在重叠。如果设置pad=(kernel_size-1)/2,则运算后,宽度和高度不变.


640?wx_fmt=png池化层


池化层有效减少了网络参数, 同时尽可能保持了位置信息.


 1layer {
2name: "pool1"
3type"Pooling"
4bottom: "conv1"
5top: "pool1"
6pooling_param {
7pool: MAX # 池化类型
8kernel_size: 3 # 池化核的大小
9stride: 2 # 步长
10  }
11}


这里pad还是默认为0,不进行扩充。


输入:n*c*w0*h0
输出:n*c*w1*h1


和卷积层的区别就是其中的c保持不变


w1=(w0+2*pad-kernel_size)/stride+1;
h1=(h0+2*pad-kernel_size)/stride+1;


如果设置stride为2,前后两次卷积部分不重叠。100*100的特征图池化后,变成50*50.


3.局部响应归一化层(Local Response Normalization, LRN)


对于每一个输入, 去除以

640?wx_fmt=png


得到归一化后的输出。


4.Im2col层.


将输入的image的各个区域(小矩阵)拉成向量,然后依次排列形成新的大矩阵.


640?wx_fmt=png


在caffe中,卷积运算就是先对数据进行im2col操作,再进行内积运算(inner product)。这样做,比原始的卷积操作速度更快。


640?wx_fmt=png


LRN和im2col层的详细情况见:http://www.cnblogs.com/denny402/p/5071126.html


640?wx_fmt=png激活层


在激活层,是对输入做元素级的激活操作(函数变换), 输入和输出的维度是一致的.常用的激活函数有sigmoid, relu和tanh等.


典型的激活层定义:


1layer {
2name"XX"
3bottom: "in_data"
4top: "out_data" 
5type: "Sigmoid"  # 也可以是"ReLU"或者"TanH"
6}


以ReLU层为例, 非线性变化层 max(0,x),一般与CONVOLUTION层成对出现


1layer {
2name"relu1"
3type: "ReLU" # 激活函数类型
4bottom: "ip1"
5top: "ip1"
6}


640?wx_fmt=png其他层


全连接层


  • weight_filler: 权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"

  • bias_filler: 偏置项的初始化。一般设置为"constant",值全为0。

  • bias_term: 是否开启偏置项,默认为true, 开启


    全连接层的定义为:

 1layer {
2name"ip1"
3type: "InnerProduct"
4bottom: "pool2"
5top: "ip1"
6 param {
7lr_mult: 1
8}
9param {
10lr_mult2
11}
12inner_product_param {
13num_output500  # 输出参数个数
14weight_filler { # 权重的初始化
15type: "xavier"
16}
17bias_filler { 
18type"constant"
19     }
20     }
21   }
Dropout层


防止过拟合.只需要定义dropout比率就可以了.


1layer {
2name"drop7"
3type: "Dropout"
4bottom: "fc7-conv"
5top: "fc7-conv"
6dropout_param {
7dropout_ratio: 0.5
8   }
9 }



Dropout层softmax-loss层


如果我们最终目的就是得到各个类别的概率似然值,这个时候就只需要一个 Softmax层,而不一定要进行softmax-Loss 操作;如果输出结果理论上的概率分布已知,然后要做最大似然估计,此时最后需要一个softmax-Loss层.


从Softmax-loss的计算公式可以看出, softmax-loss实际上定义的是交叉熵:

640?wx_fmt=png


softmax-loss层的定义:


1layer {
2name"loss"
3type: "SoftmaxWithLoss"
4bottom: "ip1"
5
6bottom: "label"
7top: "loss"
8}


Softmax和softmax-loss的比较:http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/


还有如reshape层等,参考:caffe官网: http://caffe.berkeleyvision.org/tutorial/layers.html


原文链接:https://www.jianshu.com/p/e397c2ed034b


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章

640?wx_fmt=jpeg

大家都在看

640.png?

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值