NMSIS-NN
Version 1.3.1
NMSIS NN Software Library
|
Functions | |
void | riscv_softmax_q15 (const q15_t *vec_in, const uint16_t dim_vec, q15_t *p_out) |
Q15 softmax function. More... | |
void | riscv_softmax_q7 (const q7_t *vec_in, const uint16_t dim_vec, q7_t *p_out) |
Q7 softmax function. More... | |
riscv_nmsis_nn_status | riscv_softmax_s16 (const int16_t *input, const int32_t num_rows, const int32_t row_size, const int32_t mult, const int32_t shift, const nmsis_nn_softmax_lut_s16 *softmax_params, int16_t *output) |
S16 softmax function. More... | |
void | riscv_softmax_s8 (const int8_t *input, const int32_t num_rows, const int32_t row_size, const int32_t mult, const int32_t shift, const int32_t diff_min, int8_t *output) |
S8 softmax function. More... | |
void | riscv_softmax_s8_s16 (const int8_t *input, const int32_t num_rows, const int32_t row_size, const int32_t mult, const int32_t shift, const int32_t diff_min, int16_t *output) |
S8 to s16 softmax function. More... | |
void | riscv_softmax_u8 (const uint8_t *input, const int32_t num_rows, const int32_t row_size, const int32_t mult, const int32_t shift, const int32_t diff_min, uint8_t *output) |
U8 softmax function. More... | |
void | riscv_softmax_with_batch_q7 (const q7_t *vec_in, const uint16_t nb_batches, const uint16_t dim_vec, q7_t *p_out) |
Q7 softmax function with batch parameter. More... | |
void riscv_softmax_q15 | ( | const q15_t * | vec_in, |
const uint16_t | dim_vec, | ||
q15_t * | p_out | ||
) |
Q15 softmax function.
[in] | vec_in | pointer to input vector |
[in] | dim_vec | input vector dimention |
[out] | p_out | pointer to output vector |
Here, instead of typical e based softmax, we use 2-based softmax, i.e.,:
y_i = 2^(x_i) / sum(2^x_j)
The relative output will be different here. But mathematically, the gradient will be the same with a log(2) scaling factor.
void riscv_softmax_q7 | ( | const q7_t * | vec_in, |
const uint16_t | dim_vec, | ||
q7_t * | p_out | ||
) |
Q7 softmax function.
[in] | vec_in | pointer to input vector |
[in] | dim_vec | input vector dimention |
[out] | p_out | pointer to output vector |
Here, instead of typical natural logarithm e based softmax, we use 2-based softmax here, i.e.,:
y_i = 2^(x_i) / sum(2^x_j)
The relative output will be different here. But mathematically, the gradient will be the same with a log(2) scaling factor.
riscv_nmsis_nn_status riscv_softmax_s16 | ( | const int16_t * | input, |
const int32_t | num_rows, | ||
const int32_t | row_size, | ||
const int32_t | mult, | ||
const int32_t | shift, | ||
const nmsis_nn_softmax_lut_s16 * | softmax_params, | ||
int16_t * | output | ||
) |
S16 softmax function.
[in] | input | Pointer to the input tensor |
[in] | num_rows | Number of rows in the input tensor |
[in] | row_size | Number of elements in each input row |
[in] | mult | Input quantization multiplier |
[in] | shift | Input quantization shift within the range [0, 31] |
[in] | softmax_params | Softmax s16 layer parameters with two pointers to LUTs speficied below. For indexing the high 9 bits are used and 7 remaining for interpolation. That means 512 entries for the 9-bit indexing and 1 extra for interpolation, i.e. 513 values for each LUT.
|
[out] | output | Pointer to the output tensor |
RISCV_NMSIS_NN_ARG_ERROR
Argument error check failed RISCV_NMSIS_NN_SUCCESS
- Successful operationvoid riscv_softmax_s8 | ( | const int8_t * | input, |
const int32_t | num_rows, | ||
const int32_t | row_size, | ||
const int32_t | mult, | ||
const int32_t | shift, | ||
const int32_t | diff_min, | ||
int8_t * | output | ||
) |
S8 softmax function.
[in] | input | Pointer to the input tensor |
[in] | num_rows | Number of rows in the input tensor |
[in] | row_size | Number of elements in each input row |
[in] | mult | Input quantization multiplier |
[in] | shift | Input quantization shift within the range [0, 31] |
[in] | diff_min | Minimum difference with max in row. Used to check if the quantized exponential operation can be performed |
[out] | output | Pointer to the output tensor |
void riscv_softmax_s8_s16 | ( | const int8_t * | input, |
const int32_t | num_rows, | ||
const int32_t | row_size, | ||
const int32_t | mult, | ||
const int32_t | shift, | ||
const int32_t | diff_min, | ||
int16_t * | output | ||
) |
S8 to s16 softmax function.
[in] | input | Pointer to the input tensor |
[in] | num_rows | Number of rows in the input tensor |
[in] | row_size | Number of elements in each input row |
[in] | mult | Input quantization multiplier |
[in] | shift | Input quantization shift within the range [0, 31] |
[in] | diff_min | Minimum difference with max in row. Used to check if the quantized exponential operation can be performed |
[out] | output | Pointer to the output tensor |
void riscv_softmax_u8 | ( | const uint8_t * | input, |
const int32_t | num_rows, | ||
const int32_t | row_size, | ||
const int32_t | mult, | ||
const int32_t | shift, | ||
const int32_t | diff_min, | ||
uint8_t * | output | ||
) |
U8 softmax function.
[in] | input | Pointer to the input tensor |
[in] | num_rows | Number of rows in the input tensor |
[in] | row_size | Number of elements in each input row |
[in] | mult | Input quantization multiplier |
[in] | shift | Input quantization shift within the range [0, 31] |
[in] | diff_min | Minimum difference with max in row. Used to check if the quantized exponential operation can be performed |
[out] | output | Pointer to the output tensor |
void riscv_softmax_with_batch_q7 | ( | const q7_t * | vec_in, |
const uint16_t | nb_batches, | ||
const uint16_t | dim_vec, | ||
q7_t * | p_out | ||
) |
Q7 softmax function with batch parameter.
[in] | vec_in | pointer to input vector |
[in] | nb_batches | number of batches |
[in] | dim_vec | input vector dimention |
[out] | p_out | pointer to output vector |
Here, instead of typical natural logarithm e based softmax, we use 2-based softmax here, i.e.,:
y_i = 2^(x_i) / sum(2^x_j)
The relative output will be different here. But mathematically, the gradient will be the same with a log(2) scaling factor.