17#ifndef LUCI_INTERPRETER_PAL_SOFTMAX_H
18#define LUCI_INTERPRETER_PAL_SOFTMAX_H
20#include <tensorflow/lite/kernels/internal/reference/softmax.h>
21#include <arm_nnfunctions.h>
34static inline void InitializeParams(tflite::SoftmaxParams *params,
float input_scale,
float beta)
36 int32 input_beta_multiplier;
37 int input_beta_left_shift;
38 static const int kScaledDiffIntegerBits = 5;
39 tflite::PreprocessSoftmaxScaling(beta, input_scale, kScaledDiffIntegerBits,
40 &input_beta_multiplier, &input_beta_left_shift);
42 params->input_multiplier = input_beta_multiplier;
43 params->input_left_shift = input_beta_left_shift;
45 -tflite::CalculateInputRadius(kScaledDiffIntegerBits, params->input_left_shift);
49static inline void Softmax(
const tflite::SoftmaxParams ¶ms,
50 const tflite::RuntimeShape &input_shape,
const T *input_data,
51 const tflite::RuntimeShape &
output_shape, T *output_data)
54 assert(
false &&
"Softmax NYI");
64 const tflite::RuntimeShape &input_shape,
const int8_t *input_data,
65 const tflite::RuntimeShape &
output_shape, int8_t *output_data)
67 const int trailing_dim = input_shape.DimensionsCount() - 1;
68 const int outer_size = tflite::MatchingFlatSizeSkipDim(input_shape, trailing_dim,
output_shape);
69 const int depth = tflite::MatchingDim(input_shape, trailing_dim,
output_shape, trailing_dim);
70 const int32_t mult = params.input_multiplier;
71 const int32_t shift = params.input_left_shift;
72 const int32_t diff_min = params.diff_min;
74 arm_softmax_s8(input_data, outer_size, depth, mult, shift, diff_min, output_data);
const luci_interpreter::RuntimeShape output_shape
void Softmax< int8_t >(const tflite::SoftmaxParams ¶ms, const tflite::RuntimeShape &input_shape, const int8_t *input_data, const tflite::RuntimeShape &output_shape, int8_t *output_data)
void Softmax(const SoftmaxParams ¶ms, const Shape &input_shape, const float *input_data, const Shape &output_shape, float *output_data)
void PopulateSoftmaxLookupTable(float *table, float input_scale, float beta)