#include #include #include "caffe/layers/elu_layer.hpp" namespace caffe { template void ELULayer::Forward_cpu(const vector*>& bottom, const vector*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = top[0]->mutable_cpu_data(); const int count = bottom[0]->count(); Dtype alpha = this->layer_param_.elu_param().alpha(); for (int i = 0; i < count; ++i) { top_data[i] = std::max(bottom_data[i], Dtype(0)) + alpha * (exp(std::min(bottom_data[i], Dtype(0))) - Dtype(1)); } } template void ELULayer::Backward_cpu(const vector*>& top, const vector& propagate_down, const vector*>& bottom) { if (propagate_down[0]) { const Dtype* bottom_data = bottom[0]->cpu_data(); 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 alpha = this->layer_param_.elu_param().alpha(); for (int i = 0; i < count; ++i) { bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0) + (alpha + top_data[i]) * (bottom_data[i] <= 0)); } } } #ifdef CPU_ONLY STUB_GPU(ELULayer); #endif INSTANTIATE_CLASS(ELULayer); REGISTER_LAYER_CLASS(ELU); } // namespace caffe