| #ifndef TH_GENERIC_FILE |
| #define TH_GENERIC_FILE "generic/ELU.c" |
| #else |
| |
| void THNN_(ELU_updateOutput)( |
| THNNState *state, |
| THTensor *input, |
| THTensor *output, |
| accreal alpha_, |
| bool inplace) |
| { |
| real alpha = TH_CONVERT_ACCREAL_TO_REAL(alpha_); |
| if(inplace) { |
| TH_TENSOR_APPLY(real, input, |
| if(*input_data <= 0) { |
| *input_data = (exp(*input_data) - 1) * alpha; |
| } |
| ); |
| THTensor_(set)(output, input); |
| } else { |
| THTensor_(resizeAs)(output, input); |
| TH_TENSOR_APPLY2(real, input, real, output, |
| *output_data = *input_data <= 0 ? (exp(*input_data)-1)*alpha : *input_data; |
| ); |
| } |
| } |
| |
| void THNN_(ELU_updateGradInput)( |
| THNNState *state, |
| THTensor *input, |
| THTensor *gradOutput, |
| THTensor *gradInput, |
| THTensor *output, |
| accreal alpha_, |
| bool inplace) |
| { |
| real alpha = TH_CONVERT_ACCREAL_TO_REAL(alpha_); |
| THNN_CHECK_NELEMENT(input, gradOutput); |
| if(inplace) { |
| TH_TENSOR_APPLY2(real, gradOutput, real, output, |
| if(*output_data <= 0) { |
| *gradOutput_data *= *output_data + alpha; |
| } |
| ); |
| THTensor_(set)(gradInput, gradOutput); |
| } else { |
| THTensor_(resizeAs)(gradInput, output); |
| TH_TENSOR_APPLY3(real, gradInput, real, gradOutput, real, output, |
| *gradInput_data = *output_data <= 0 ? *gradOutput_data * (*output_data + alpha) : *gradOutput_data; |
| ); |
| } |
| } |
| |
| #endif |