Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dnn/nnet_arch.h')
-rw-r--r--dnn/nnet_arch.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/dnn/nnet_arch.h b/dnn/nnet_arch.h
index 00198579..4d577f8d 100644
--- a/dnn/nnet_arch.h
+++ b/dnn/nnet_arch.h
@@ -38,6 +38,61 @@
#define RTCD_SUF(name) CAT_SUFFIX(name, RTCD_ARCH)
+
+#define MAX_ACTIVATIONS (4096)
+
+static OPUS_INLINE void vec_swish(float *y, const float *x, int N)
+{
+ int i;
+ float tmp[MAX_ACTIVATIONS];
+ celt_assert(N <= MAX_ACTIVATIONS);
+ vec_sigmoid(tmp, x, N);
+ for (i=0;i<N;i++)
+ y[i] = x[i]*tmp[i];
+}
+
+static OPUS_INLINE float relu(float x)
+{
+ return x < 0 ? 0 : x;
+}
+
+void RTCD_SUF(compute_activation_)(float *output, const float *input, int N, int activation)
+{
+ int i;
+ if (activation == ACTIVATION_SIGMOID) {
+ vec_sigmoid(output, input, N);
+ } else if (activation == ACTIVATION_TANH) {
+ vec_tanh(output, input, N);
+ } else if (activation == ACTIVATION_SWISH) {
+ vec_swish(output, input, N);
+ } else if (activation == ACTIVATION_RELU) {
+ for (i=0;i<N;i++)
+ output[i] = relu(input[i]);
+ } else if (activation == ACTIVATION_SOFTMAX) {
+#ifdef SOFTMAX_HACK
+ OPUS_COPY(output, input, N);
+ /*for (i=0;i<N;i++)
+ output[i] = input[i];*/
+#else
+ float sum = 0;
+ softmax(output, input, N);
+ for (i=0;i<N;i++) {
+ sum += output[i];
+ }
+ sum = 1.f/(sum+1e-30);
+ for (i=0;i<N;i++)
+ output[i] = sum*output[i];
+#endif
+ } else {
+ celt_assert(activation == ACTIVATION_LINEAR);
+ if (input != output) {
+ for (i=0;i<N;i++)
+ output[i] = input[i];
+ }
+ }
+}
+
+
void RTCD_SUF(compute_linear_) (const LinearLayer *linear, float *out, const float *in)
{
int i, M, N;