caffe中对6种激活函数类的封装--TanH
来源:互联网 发布:乳源县网络问政 编辑:程序博客网 时间:2024/06/03 13:12
tanh_layer.hpp
#ifndef CAFFE_TANH_LAYER_HPP_#define CAFFE_TANH_LAYER_HPP_#include <vector>#include "caffe/blob.hpp"#include "caffe/layer.hpp"#include "caffe/proto/caffe.pb.h"#include "caffe/layers/neuron_layer.hpp"namespace caffe {/** * @brief TanH hyperbolic tangent non-linearity @f$ * y = \frac{\exp(2x) - 1}{\exp(2x) + 1} * @f$, popular in auto-encoders. * * Note that the gradient vanishes as the values move away from 0. * The ReLULayer is often a better choice for this reason. */template <typename Dtype>class TanHLayer : public NeuronLayer<Dtype> { public: explicit TanHLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual inline const char* type() const { return "TanH"; } protected: /** * @param bottom input Blob vector (length 1) * -# @f$ (N \times C \times H \times W) @f$ * the inputs @f$ x @f$ * @param top output Blob vector (length 1) * -# @f$ (N \times C \times H \times W) @f$ * the computed outputs @f$ * y = \frac{\exp(2x) - 1}{\exp(2x) + 1} * @f$ */ 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); /** * @brief Computes the error gradient w.r.t. the sigmoid inputs. * * @param top output Blob vector (length 1), providing the error gradient with * respect to the outputs * -# @f$ (N \times C \times H \times W) @f$ * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ * with respect to computed outputs @f$ y @f$ * @param propagate_down see Layer::Backward. * @param bottom input Blob vector (length 1) * -# @f$ (N \times C \times H \times W) @f$ * the inputs @f$ x @f$; Backward fills their diff with * gradients @f$ * \frac{\partial E}{\partial x} * = \frac{\partial E}{\partial y} * \left(1 - \left[\frac{\exp(2x) - 1}{exp(2x) + 1} \right]^2 \right) * = \frac{\partial E}{\partial y} (1 - y^2) * @f$ if propagate_down[0] */ 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);};} // namespace caffe#endif // CAFFE_TANH_LAYER_HPP_
tanh_layer.cpp
// TanH neuron activation function layer.// Adapted from ReLU layer code written by Yangqing Jia#include <vector>#include "caffe/layers/tanh_layer.hpp"namespace caffe {template <typename Dtype>void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const 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 (int i = 0; i < count; ++i) { top_data[i] = tanh(bottom_data[i]); }}template <typename Dtype>void TanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); const int count = bottom[0]->count(); Dtype tanhx; for (int i = 0; i < count; ++i) { tanhx = top_data[i]; bottom_diff[i] = top_diff[i] * (1 - tanhx * tanhx); } }}#ifdef CPU_ONLYSTUB_GPU(TanHLayer);#endifINSTANTIATE_CLASS(TanHLayer);} // namespace caffe
0 0
- caffe中对6种激活函数类的封装--TanH
- caffe中对6种激活函数类的封装--ReLu
- caffe中对6种激活函数类的封装--Sigmod
- caffe中对6种激活函数类的封装--Absval
- 激活函数之tanh
- 四种激活函数(Relu Linear Sigmoid Tanh)
- 激活函数实现--3 Tanh函数实现
- 人工神经网络之激活函数 -tanh函数
- 常用的激活函数总结(Sigmoid函数、Tanh函数、ReLu函数、Softmax函数)
- sigmoid、tanh、softplus和ReLu激活函数
- 神经网络之激活函数(sigmoid、tanh、ReLU)
- 激活函数-Sigmoid,Tanh,ReLu,softplus,softmax
- 神经网络之激活函数(sigmoid、tanh、ReLU)
- 机器学习笔记-神经网络中激活函数(activation function)对比--Sigmoid、ReLu,tanh
- 一次面试引发的问题:激活函数Relu,sigmoid ,tanh的角逐
- 4用于cifar10的卷积神经网络-4.19tanh和softsign激活函数的输出汇总分析
- 神经网络激活函数--tanh双曲正切函数
- 深度学习——激活函数Sigmoid/Tanh/ReLU
- 数学老师必备的一款五星级几何绘图软件!
- JAVA多线程笔记总结.
- Spring整合JMS(四)——事务管理
- C++检测和定位内存泄漏的技巧
- 冒泡排序 - Bubble Sort
- caffe中对6种激活函数类的封装--TanH
- C++临时对象
- classloader加载的双亲委托模式
- 第5周项目2-游戏中的角色类(1)
- 2016.4.06Test:problem1:异或树:动态树的点分治
- TCP与UDP在概念上的区别
- iOS开发---当tableview滚到视图底部展开列表后看不到数据
- 查看Android应用包名package和入口activity名称
- 高精度codevs 3115-3118