|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|