Caffe学习--Layer分析

Caffe_Layer
1.基本数据结构
//Layer层主要的的参数
LayerParamter layer_param_; // protobuf内的layer参数
vector<shared_ptr<Blob<Dtype>*>>blobs_;//存储layer的参数,
vector<bool>param_propagate_down_;//表示是否计算各个blobs反向误差。
2.主要函数接口
virtual void SetUp(const vector<Blob<Dtype>*>&bottom,
vector<Blob<Dtype>*>& top);
Dtype Forward(const vector<Blob<Dtype>*>&bottom,
vector<Blob<Dtype>*>&top);
void Backward(const vector<Blob<Dtype>*>&top,
const vector<bool>param_propagate_down,vector<Blob<Dtype>*>& bottom);
3.具体的Layer分析
具体的常用Layer分析
(1) DataLayer
数据通过数据层进入Layer,可以来自于数据库(LevelDB或者LMDB),也可以来自内存,HDF5等
//Database:类型 Database
//必须参数 source,batch_size
//可选参数:rand_skip,mirror,backend[default LEVELDB]
// In-Memory:类型 MemoryData
// 必选参数:batch_size,channels,height,width
//HDF5 Input:类型 HDF5Data
//必选参数: source,batch_size
//Images : 类型 ImageData
//必要参数:source(文件名label),batch_size
//可选参数:rand_skip,shuffle,new_width,new_height;
(2) 激励层(neuron_layers)
一般来说,激励层是element-wise,输入输出大小相同,一般非线性函数
输入:n*c*h*w
输出:n*c*h*w
//ReLU/PReLU
//可选参数 negative_slope 指定输入值小于零时的输出。
// f(x) = x*(x>0)+negative_slope*(x<=0)
//ReLU目前使用最为广泛,收敛快,解决梯度弥散问题
layer{
name:"relu"
type:"ReLU"
bottom:"conv1"
top:"conv1"
}
//Sigmoid
//f(x) = 1./(1+exp(-x)); 负无穷--正无穷映射到-1---1
layer{
name:"sigmoid-test"
bottom:"conv1"
top:"conv1"
type:"Sigmoid"
}
(3) 视觉层(vision-layer)
常用layer操作
//卷积层(Convolution):类型Convolution
//包含学习率,输出卷积核,卷积核size,初始方式,权值衰减
//假使输入n*ci*hi*wi,则输出
// new_h = ((hi-kernel_h)+2*pad_h)/stride+1;
// new_w = ((wi-kernel_w)+2*pad_w)/stride+1;
//输出n*num_output*new_h*new_w;
layer{
name: "conv1"
type: "CONVOLUTION"
bottom: "data"
top: "conv1"
blobs_lr: 1
blobs_lr: 2
weight_decay: 1
weight_decay: 0
convolution_param {
num_output: 96
kernel_size: 11
stride: 4
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
//池化层(Pooling) 类型 Pooling
// (hi-kernel_h)/2+1;
layer{
name:"pool1"
type:"POOLING"
bottom:"conv1"
top:"conv1"
pooling_param{
pool:MAX //AVE,STOCHASTIC
kernel_size:3
stride:2
}
}
//BatchNormalization
// x' = (x-u)/δ ;y = α*x'+β;
(4) 损失层
最小化输出于目标的LOSS来驱动学习更新
//Softmax
4.说明
SetUp函数需要根据实际的参数设置进行实现,对各种类型的参数初始化;Forward和Backward对应前向计算和反向更新,输入统一都是bottom,输出为top,其中Backward里面有个propagate_down参数,用来表示该Layer是否反向传播参数。
在Forward和Backward的具体实现里,会根据Caffe::mode()进行对应的操作,即使用cpu或者gpu进行计算,两个都实现了对应的接口Forward_cpu、Forward_gpu和Backward_cpu、Backward_gpu,这些接口都是virtual,具体还是要根据layer的类型进行对应的计算(注意:有些layer并没有GPU计算的实现,所以封装时加入了CPU的计算作为后备)。另外,还实现了ToProto的接口,将Layer的参数写入到protocol buffer文件中。
Caffe学习--Layer分析的更多相关文章
- Caffe学习--Blob分析
Caffe_blob 1.基本数据结构 Blob为模板类,可以理解为四维数组,n * c * h * w的结构,Layer内为blob输入data和diff,Layer间的blob为学习的参数.内部封 ...
- Caffe学习--Net分析
Caffe_Net 1.基本数据 vector<shared_ptr<Layer<Dtype> > > layers_; // 记录每一层的layer参数 vect ...
- caffe 学习(3)——Layer Catalogue
layer是建模和计算的基本单元. caffe的目录包含各种state-of-the-art model的layers. 为了创建一个caffe model,我们需要定义模型架构在一个protocol ...
- Caffe学习笔记(三):Caffe数据是如何输入和输出的?
Caffe学习笔记(三):Caffe数据是如何输入和输出的? Caffe中的数据流以Blobs进行传输,在<Caffe学习笔记(一):Caffe架构及其模型解析>中已经对Blobs进行了简 ...
- Caffe学习笔记(一):Caffe架构及其模型解析
Caffe学习笔记(一):Caffe架构及其模型解析 写在前面:关于caffe平台如何快速搭建以及如何在caffe上进行训练与预测,请参见前面的文章<caffe平台快速搭建:caffe+wind ...
- Caffe学习系列(3):视觉层(Vision Layers)及参数
所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...
- Caffe学习系列(23):如何将别人训练好的model用到自己的数据上
caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model.这个model将图片分为1000类,应该是目前为止最好的图片分类model了. 假设我现在有一些自己的图片想进行分 ...
- Caffe学习系列(12):训练和测试自己的图片
学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...
- 转 Caffe学习系列(12):训练和测试自己的图片
学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...
随机推荐
- 更博不能忘——webpack学习笔记
webpack是前端构建系统就像grunt和gulp(之前有学习过grunt所以也就大概明白webpack是个什么东西),所以说前端技术大部分还真是相通的,现在觉得当时多看的东西并不白费,虽然长时间不 ...
- ZBrush软件特性之Layers
ZBrush®中的Layers层调控板可以在单个文档工作中添加多个层,实际上是把新建的层作为一个分离的文档,层之间可以相互影响. 使用层工作 Layers调控板为每个层都有预置存放的空间,刚启动ZBr ...
- node——underscore的使用
我在做新闻页面时,需要将之前存好点的data.json里的数据显示在首页上,而首页的每条新闻数据不能直接写定在上面,所以我们要将data里面的数据传递进去.我们需要使用underscore的templ ...
- python的基础及练习
1.变量变是指变化,量是指反映某种状态例:level =1 或 2 username = ‘xuanxuan’password = ‘123’python里的“=”是赋值的意思,并不是真的等于 变量有 ...
- 小试牛刀之sort()排序的实现
受大学室友的鼓动,我也打算利用公众平台来记录自己的前端知识积累,同时呢,自己总结的东西,总归会有局限性,希望小伙伴能给我指点迷津.知识就是一张巨大的网,作为一名摸不清头绪的入学者,唯一能做的事情就是吐 ...
- JavaScript div 上下运动实例
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- mybatis中sql标签和include标签
1.首先定义一个sql标签,一定要定义唯一id.(name,age是要查询的字段) <sql id="Base_Column_List" >name,age</s ...
- POJ 2084
第一题组合数学题.可以使用递推,设1与其他各数分别连边,假设N=3;若1-4,则圆分成两部分计数,此时可以利用乘法原理.(高精度) #include <cstdio> #include & ...
- android 联系人中,在超大字体下,加入至联系人界面(ConfirmAddDetailActivity)上有字体显示不全的问题
联系人(Contacts)中,在超大字体下.加入至联系人界面 (ConfirmAddDetailActivity)上有字母显示不全,如"j"等 这是android布局比較紧凑引起的 ...
- 【HDOJ 5407】 CRB and Candies (大犇推导
pid=5407">[HDOJ 5407] CRB and Candies 赛后看这题题解仅仅有满眼的迷茫------ g(N) = LCM(C(N,0),C(N,1),...,C(N ...