Caffe源码:relu_layer.cpp

本文详细解析了ReLU层的正向传播与反向传播过程,重点介绍了如何根据输入值的正负决定反向传播时的梯度计算方式。ReLU激活函数在正向传播时保留大于0的输入值,而在反向传播时对于大于0的输入值传递完整的梯度,对于小于等于0的输入值则将梯度置0。
摘要由CSDN通过智能技术生成

@brief ReluLayer层反向传播


Relu激活函数: f(x)=max(0,x)

这里写图片描述

top_data={bottom_data,0,if bottom_data>0if bottom_data0

反向传导时,
lossbottom_data=top_databottom_data{top_diff,0,if bottom_data>0if bottom_data0

#include <algorithm>
#include <vector>

#include "caffe/layers/relu_layer.hpp"

namespace caffe {

template <typename Dtype>
void ReLULayer<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();
  Dtype negative_slope = this->layer_param_.relu_param().negative_slope();
  for (int i = 0; i < count; ++i) {
    top_data[i] = std::max(bottom_data[i], Dtype(0))
        + negative_slope * std::min(bottom_data[i], Dtype(0));//proto中设置为0
  }
}

template <typename Dtype>
void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
    const vector<bool>& propagate_down,
    const vector<Blob<Dtype>*>& bottom) {
  if (propagate_down[0]) {
    const Dtype* bottom_data = bottom[0]->cpu_data();//拿到ReluLayer的输入值
    const Dtype* top_diff = top[0]->cpu_diff();//拿到ReluLayer输入梯度
    Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();//要从ReluLayer反向传播的梯度
    const int count = bottom[0]->count();//该层具有神经元的个数
    Dtype negative_slope = this->layer_param_.relu_param().negative_slope();
    for (int i = 0; i < count; ++i) {
      bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0)//如果输入激活值>0 要反向传播的梯度=该层传进的梯度值*输入的值
          + negative_slope * (bottom_data[i] <= 0));//如果输入激活值<=0 梯度为0
    }
  }
}


#ifdef CPU_ONLY
STUB_GPU(ReLULayer);
#endif

INSTANTIATE_CLASS(ReLULayer);

}  // namespace caffe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值