// Copyright 2014 BVLC and contributors.
#include <algorithm>
#include <vector>
#include "caffe/layer.hpp"
#include "caffe/vision_layers.hpp"
using std::max;
namespace caffe {
template <typename Dtype>
Dtype ReLULayer<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();
//对bottom中的每一个数据进行relu函数映射
for (int i = 0; i < count; ++i)
{
top_data[i] = max(bottom_data[i], Dtype(0));
}
return Dtype(0);
}
template <typename Dtype>
void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
const bool propagate_down,
vector<Blob<Dtype>*>* bottom)
{
if (propagate_down)
{
const Dtype* bottom_data = (*bottom)[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();
for (int i = 0; i < count; ++i)
{
bottom_diff[i] = top_diff[i] * (bottom_data[i] > 0);
}
}
}
INSTANTIATE_CLASS(ReLULayer);
} // namespace caffe
caffe深度学习网络relu层代码注释
最新推荐文章于 2021-09-02 19:39:39 发布