| 37 | { |
| 38 | template <typename T> |
| 39 | inline T activate_float(T x, T a, T b, ActivationLayerInfo::ActivationFunction activation) |
| 40 | { |
| 41 | T ret; |
| 42 | |
| 43 | switch (activation) |
| 44 | { |
| 45 | case ActivationLayerInfo::ActivationFunction::ABS: |
| 46 | ret = std::abs(x); |
| 47 | break; |
| 48 | case ActivationLayerInfo::ActivationFunction::LINEAR: |
| 49 | ret = a * x + b; |
| 50 | break; |
| 51 | case ActivationLayerInfo::ActivationFunction::LOGISTIC: |
| 52 | ret = static_cast<T>(1) / (static_cast<T>(1) + std::exp(-x)); |
| 53 | break; |
| 54 | case ActivationLayerInfo::ActivationFunction::RELU: |
| 55 | ret = std::max<T>(static_cast<T>(0), x); |
| 56 | break; |
| 57 | case ActivationLayerInfo::ActivationFunction::BOUNDED_RELU: |
| 58 | ret = std::min<T>(a, std::max(static_cast<T>(0), x)); |
| 59 | break; |
| 60 | case ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU: |
| 61 | ret = std::min<T>(a, std::max<T>(b, x)); |
| 62 | break; |
| 63 | case ActivationLayerInfo::ActivationFunction::LEAKY_RELU: |
| 64 | ret = x > static_cast<T>(0) ? x : static_cast<T>(a * x); |
| 65 | break; |
| 66 | case ActivationLayerInfo::ActivationFunction::SOFT_RELU: |
| 67 | ret = std::log(static_cast<T>(1) + std::exp(static_cast<double>(x))); |
| 68 | break; |
| 69 | case ActivationLayerInfo::ActivationFunction::ELU: |
| 70 | ret = x > static_cast<T>(0) ? x : static_cast<T>(a * (std::exp(x) - static_cast<T>(1))); |
| 71 | break; |
| 72 | case ActivationLayerInfo::ActivationFunction::SQRT: |
| 73 | ret = std::sqrt(x); |
| 74 | break; |
| 75 | case ActivationLayerInfo::ActivationFunction::SQUARE: |
| 76 | ret = x * x; |
| 77 | break; |
| 78 | case ActivationLayerInfo::ActivationFunction::TANH: |
| 79 | ret = a * std::tanh(b * x); |
| 80 | break; |
| 81 | case ActivationLayerInfo::ActivationFunction::IDENTITY: |
| 82 | ret = x; |
| 83 | break; |
| 84 | case ActivationLayerInfo::ActivationFunction::HARD_SWISH: |
| 85 | ret = x * ((std::min(std::max(static_cast<T>(x + 3), static_cast<T>(0.0f)), static_cast<T>(6.0f))) * |
| 86 | 0.166666667f); |
| 87 | break; |
| 88 | case ActivationLayerInfo::ActivationFunction::SWISH: |
| 89 | ret = static_cast<T>(x) / (static_cast<T>(1) + std::exp(-a * x)); |
| 90 | break; |
| 91 | case ActivationLayerInfo::ActivationFunction::GELU: |
| 92 | ret = x * 0.5f * (1 + erf(x / std::sqrt(2.0f))); |
| 93 | break; |
| 94 | default: |
| 95 | ARM_COMPUTE_ERROR("Unsupported activation function"); |
| 96 | break; |