Caffe_Activation

一般来说,激励层的输入输出尺寸一致,为非线性函数,完成非线性映射,从而能够拟合更为复杂的函数表达式激励层都派生于NeuronLayer: class XXXlayer : public NeuronLayer

1.基本函数

激励层的基本函数较为简单,主要包含构造函数和前向、后向函数

  explicit XXXLayer(const LayerParameter& param):NeuronLayer<Dtype>(param){}virtual inline const char* type() const { return "layerNane"; }virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top);virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top);virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);

2.常用激励函数

(1) Relu/PRelu Rectufied Linear Units

ReLU的函数表达式为\(f(x) = x*(x>0) + negative\_slope*x*(x <= 0)\) 具体实现如下

  //forward_cputemplate <typename Dtype>void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,vector<Blob<Dtype>*>& top){ // 根据bottom求解topconst Dtype* bottom_data = bottom[0]->cpu_data();//const 不可修饰Dtype* top_data = top[0]->mutable_cpu_data();//可修饰const int count = bottom[0]->count();//因为count_一致,也可用topDtype negative_slope = this->layer_param_.relu_param().negative_slope();for (size_t i = 0; i < count; i++) {top_data[i] = bottom_data[i]*(bottom_data[i] > 0)+ negative_slope*bottom_data[i]*(bottom_data[i] <= 0);}}//Backward_cpu// 导数形式 f'(x) = 1 x>0 ; negative_slope*x x<0template <typename Dtype>void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down,const vector<Blob<Dtype>*>& bottom){const Dtype* top_diff = top[0].cpu_diff();//top diffconst Dtype* bottom_data = bottom[0].cpu_data();//用以判断x是否大于0Dtype* bottom_diff = bottom[0].cpu_diff();//bottom diffconst int count = bottom[0].count();for (size_t i = 0; i < count; i++) {bottom_diff[i] = top_diff[i]*(bottom_data[i] > 0)+negative_slope*(bottom_data[i] <= 0);}}// Relu 函数形式简单,导函数简单,能有效的解决梯度弥散问题,但是当x小于0时,易碎
// 但是网络多为多神经元,所以实际应用中不会影响到网络的正常训练。
(2) Sigmoid (S曲线)

Sigmoid函数表达式为\(f(x) = 1./(1+exp(-x))\);值域0-1,常作为BP神经网络的激活函数
由于输出为0-1,也作为logistic回归分析的概率输出函数。具体实现如下;

//定义一个sigmoid函数方便计算template <typename Dtype>inline Dtype sigmoid(Dtype x){return 1./(1.+exp(-x));}//前向 直接带入sigmoid函数即可template <typename Dtype>void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,vector<Blob<Dtype>*>& top){const Dtype* bottom_data = bottom[0]->cpu_data();Dtype* top_data = top[0]->mutable_cpu_data();//需要计算const int count = bottom[0]->count();//N*C*H*W;for (size_t i = 0; i < count; i++) {top_data[i] = sigmoid(bottom_data[i]);}}//Backward_cpu 由于f'(x) = f(x)*(1-f(x)),所以需要top_data// bottom_diff = top_diff*f'(bottom_data) = top_diff*top_data*(1-top_data)template <typename Dtype>void SigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down,vector<Blob<Dtype>*>& bottom){const Dtype* top_diff = top[0]->cpu_diff();const Dtype* top_data = top[0]->cpu_data();Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); //需要计算const int count = bottom[0]->count();for (size_t i = 0; i < count; i++) {//top_data[i] == sigmoid(bottom_data[i]);bottom_diff[i] = top_diff[i]*top_data[i]*(1.-top_data[i]);}}// Sigmoid函数可以作为二分类的概率输出,也可以作为激活函数完成非线性映射,但是网络
// 增加时,容易出现梯度弥散问题,目前在CNN中基本不使用

(3)TanH,双正切函数

TanH函数的表达式为 \(\frac{(1.-exp(-2x))}{(1.+exp(-2x))}\);值域0-1,与sigmoid函数有相同的问题,
但是TanH在RNN中使用较为广泛,理由参考,具体实现如下所示。

    //定义一个tanH的函数表达式,实际已经封装inline Dtype TanH(Dtype x){return (1.-exp(-2*x))/(1.+exp(-2*x));}//Forward_cputemplate <typename Dtype>void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,vector<Blob<Dtype>*>& top){const Dtype* bottom_data = bottom[0]->cpu_data();Dtype* top_data = top[0]->mutable_cpu_data();const int count = bottom[0]->count();for (size_t i = 0; i < count; i++) {top[i] = TanH(bottom_data[i]);}}//Backward_cpu f'(x) = 1-f(x)*f(x);// bottom_diff = top_diff(1-top_data*top_data);template <typename Dtype>void TanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down,vector<Blob<Dtype>*>& bottom){const Dtype* top_diff = top[0]->cpu_diff();const Dtype* top_data = top[0]->cpu_data();Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); //需要计算const int count = bottom[0]->count();for (size_t i = 0; i < count; i++) {//top_data[i] == TanH(bottom_data[i]);bottom_diff[i] = top_diff[i]*(1.-top_data[i]*top_data[i]);}}
其他的激励函数就不在枚举,可以查看具体的caffe源码,实现大致相同

3.说明

(1) 梯度弥散和梯度爆炸

网络方向传播时,loss经过激励函数会有\(loss*\partial{f(x)}\),而如sigmoid的函数,
max(\(\partial{f(x)}\))只有1/4因此深层网络传播时loss越来越小,则出现前层网络未完整学习而后层网络学习饱和的现象

(2) Caffe激励层的构建

如上述的代码所示,激励层主要完成forward和Bacward的函数实现即可,由构建的函数表达式推导出它的导函数形式,弄懂bottom_data,top_data,bottom_diff,top_diff即可

转载于:https://www.cnblogs.com/LaplaceAkuir/p/7702322.html

Caffe 激励层(Activation)分析相关推荐

  1. 三:Sensor SLPI层代码分析---

    三:Sensor SLPI层代码分析 在学习SLPI侧代码前我们先了解下SEE的registry&config. registry 放在/persist/sensors/registry/re ...

  2. 咖说 | 激励层:区块链生态建设的驱动力量

    在区块链的层级架构下,我们可以看到借由数据层.网络层.共识层,区块链保证了有数据.有网络,以及在网络上更新数据的规则.但潜在的挑战是,在区块链P2P网络中,我们如何让参与者积极踊跃为网络作贡献?这里就 ...

  3. 区块链激励层——区块链生态建设的驱动力量

    在区块链的层级架构下,我们可以看到借由区块链数据层.区块链网络层.区块链共识层.区块链合约层,保证了有数据.有网络,以及在网络上更新数据和自动化执行的规则.但潜在的挑战是,在区块链P2P网络中,我们如 ...

  4. 深度学习库 caffe使用 源码分析 依赖库分析 caffe glog gflags openBlas prototxt yolo_darknet 转 caffe

    深度学习库 caffe使用 源码分析 依赖库分析 caffe glog gflags openBlas 本文github链接 yolo_darknet 转 caffe caffe 安装 Caffe代码 ...

  5. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  6. caffe caffe.cpp 程序入口分析

    from:https://blog.csdn.net/u014114990/article/details/47747025 caffe.cpp  程序入口分析,   (1)main()函数中,输入的 ...

  7. HyperLynx(二十八)板层噪声分析和SI/PI联合仿真实例

    板层噪声分析和SI/PI联合仿真实例 1.前仿真噪声分析 2.后仿真噪声分析 3.设置和运行SI/PI联合仿真 4.执行信号过孔旁路分析 1.前仿真噪声分析 (1)从"开始"菜单中 ...

  8. 计算机网络-应用层和传输层协议分析实验(PacketTracer)

    实验三.应用层和传输层协议分析实验 一.实验目的 通过本实验,熟悉PacketTracer的使用,学习在PacketTracer中仿真分析应用层和传输层协议,进一步加深对协议工作过程的理解. 二.实验 ...

  9. 卷积神经网络---卷积层、激励层、池化层以及全连接层

    文章目录 概述 卷积神经网络 局部连接+权值共享** 输入层 卷积层 激励层 池化层 全连接层 参考资料 概述 这两天在看论文,涉及到卷积神经网络的知识,之前一直对这块迷迷糊糊.看到了一篇博文写的很好 ...

最新文章

  1. 每日一皮:爸爸你听我解释...
  2. python【蓝桥杯vip练习题库】BASIC-3字母图形
  3. Cloud Native Computing Foundation Welcomes the NATS Messaging Protocol into the Fold
  4. linux克隆的虚拟,linux(CentOS7)下克隆虚拟机并配置网络(固定ip)
  5. 【数字信号处理】复数的另一种思考之平均风向测量(Python实现)
  6. C#多线程之旅(3)——线程池
  7. python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营
  8. c++ 走向高级之日积月累
  9. iOS UIDatePicker设置为中文的方法
  10. git与gitk查看某个文件的历史提交记录
  11. Python 学习博客地址
  12. Python标准库映射类型与可散列数据类型的关系
  13. 单片机编程软件IAR和烧写软件SmartRF安装教程(超详细)
  14. 第三章 机器人系统的动力学模型
  15. 【图神经网络】蛋白质设计proteinsolver跑源码记录
  16. 数据中台到底是什么?
  17. Windows 7 通用 CDC 串口驱动程序
  18. 双飞燕G3-200N鼠标修理
  19. 网站被K多种情况解析 怎么做才能快速恢复?
  20. 腾讯Java后端开发实习生(一面)

热门文章

  1. JavaJSP调用JavaScript方法
  2. 在word中粘贴图片显示出现问题
  3. 学完计算机的感想300,计算机培训的心得体会
  4. 德芙网络营销策略ppt_德芙的网络整合营销分析
  5. 做网络营销必看干货:月薪3000与月薪30000文案区别
  6. MFC如何添加系统菜单(菜单添加小图标)
  7. sqlserver查看表结构
  8. 手机验证短信设计与代码实现
  9. 解决高分辨率屏幕老版软件适配问题
  10. CAD面积周长同步测量