|
|
|
@@ -60,16 +60,22 @@ int Sigmoid(const float *src, int length, float *dst) { |
|
|
|
return NNACL_OK; |
|
|
|
} |
|
|
|
|
|
|
|
float TanhOpt(float src) { |
|
|
|
if (src > 5.0) { |
|
|
|
return 1.0f; |
|
|
|
} else if (src < -5.0) { |
|
|
|
return -1.0f; |
|
|
|
} else { |
|
|
|
float square = src * src; |
|
|
|
float a = (((square + 378.0f) * square + 17325.0f) * square + 135135.0f) * src; |
|
|
|
float b = ((28.0f * square + 3150.0f) * square + 62370.0f) * square + 135135.0f; |
|
|
|
return a / b; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int Tanh(const float *src, int length, float *dst) { |
|
|
|
for (int i = 0; i < length; ++i) { |
|
|
|
float tmp_in = src[i]; |
|
|
|
if (tmp_in > 5.0) { |
|
|
|
dst[i] = 1.0f; |
|
|
|
} else if (tmp_in < -5.0) { |
|
|
|
dst[i] = -1.0f; |
|
|
|
} else { |
|
|
|
dst[i] = 1.0f - 2.0f / (exp(2 * tmp_in) + 1); |
|
|
|
} |
|
|
|
dst[i] = TanhOpt(src[i]); |
|
|
|
} |
|
|
|
return NNACL_OK; |
|
|
|
} |
|
|
|
|