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分析的更多相关文章

  1. Caffe学习--Blob分析

    Caffe_blob 1.基本数据结构 Blob为模板类,可以理解为四维数组,n * c * h * w的结构,Layer内为blob输入data和diff,Layer间的blob为学习的参数.内部封 ...

  2. Caffe学习--Net分析

    Caffe_Net 1.基本数据 vector<shared_ptr<Layer<Dtype> > > layers_; // 记录每一层的layer参数 vect ...

  3. caffe 学习(3)——Layer Catalogue

    layer是建模和计算的基本单元. caffe的目录包含各种state-of-the-art model的layers. 为了创建一个caffe model,我们需要定义模型架构在一个protocol ...

  4. Caffe学习笔记(三):Caffe数据是如何输入和输出的?

    Caffe学习笔记(三):Caffe数据是如何输入和输出的? Caffe中的数据流以Blobs进行传输,在<Caffe学习笔记(一):Caffe架构及其模型解析>中已经对Blobs进行了简 ...

  5. Caffe学习笔记(一):Caffe架构及其模型解析

    Caffe学习笔记(一):Caffe架构及其模型解析 写在前面:关于caffe平台如何快速搭建以及如何在caffe上进行训练与预测,请参见前面的文章<caffe平台快速搭建:caffe+wind ...

  6. Caffe学习系列(3):视觉层(Vision Layers)及参数

    所有的层都具有的参数,如name, type, bottom, top和transform_param请参看我的前一篇文章:Caffe学习系列(2):数据层及参数 本文只讲解视觉层(Vision La ...

  7. Caffe学习系列(23):如何将别人训练好的model用到自己的数据上

    caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model.这个model将图片分为1000类,应该是目前为止最好的图片分类model了. 假设我现在有一些自己的图片想进行分 ...

  8. Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

  9. 转 Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

随机推荐

  1. 2017.7.15清北夏令营精英班Day1解题报告

    成绩: 预计分数:20+10+40 实际分数:100+10+40. 一百三十多人的比赛全场rand7还水了个鼠标+键盘 unbelievable! 考试题目链接: https://www.luogu. ...

  2. Win10 UI入门 导航滑动条 求UWP工作

    借鉴了 段博琼 大哥写的导航滑动,自己实现了一个类似安卓 IOS 导航滑动条 支持等比例 分割 tabView 支持动画滑动 效果如下图 WYGrid 你可以想象一个GridView  itemsWr ...

  3. win7(32位)旗舰版共享HP1010打印机给WINXP专业版

    一.状况: 两台电脑,同一网段内,电脑A是WIN7系统(32位),电脑B是WINXP系统. ①电脑A(win7)已经安装完打印机驱动,能正常打印,对该打印机HP1010共享时,提示“无法保存打印机设置 ...

  4. C++下面关于字符串数组的一些操作

    今天在写一个搜索引擎的分词系统,是很简单的那种,但是居然费了我一天的时间还没完成,晚上估计还得弄一会了,但是在这个过程中,遇到了集中关于字符串数组的操作,值得和大家分享一下. 首先是关于统计字符串数组 ...

  5. Eclipse安装不了AXIS2 Tool插件,总是找不到axis2 wizards的问题找到解决答案(转载)

    http://blog.csdn.net/downmoon/article/details/7309485 最近在学习axis2工作需要,google一搜,网上到处都是装axis2插件的.根据网上的直 ...

  6. BZOJ 1856 [SCOI2010]生成字符串 (组合数)

    题目大意:给你n个1和m个0,你要用这些数字组成一个长度为n+m的串,对于任意一个位置k,要保证前k个数字中1的数量大于等于0的数量,求所有合法的串的数量 答案转化为所有方案数-不合法方案数 所有方案 ...

  7. LAMP 环境搭建备忘 -- Linux的安装(一)

    LAMP指的是 Linux + Apatch + MySQL / MariaDB + PHP/Perl/Python 一套搭建网站服务器的开源软件组合.工作原理图如下: 下面开始环境搭建 1 Linu ...

  8. STM32 关于HAL库硬件SPI要注意的问题总结

    利用STM32CUbeMx编写程序,大大方便了开发,最近做的项目利用到了 STM32CUbeMx的硬件SP,这里对SPI的使用做一个总结. HAL库里的硬件SPI主要有以下几个库函数: /* hspi ...

  9. linux svn命令具体解释

    检測是否安装svn:svnserve --version svn服务的关闭:killall svnserve 创建svn库:svnadmin create /opt/svn/repos 配置自己主动启 ...

  10. 安卓版微信自带浏览器和IE6浏览器ajax请求abort错误处理

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46419567 给页面元素绑定了一个click事件用来触发ajax请求.在安卓微信自 ...