AIfES 2  2.0.0
ailayer_dense_cmsis.h File Reference

Arm CMSIS implementation of the Dense layer for Arm Cortex processors. More...

Go to the source code of this file.

Functions

ailayer_tailayer_dense_f32_cmsis (ailayer_dense_t *layer, ailayer_t *input_layer)
 Initializes and connect a Dense layer with the F32 CMSIS implementation. More...
 
ailayer_tailayer_dense_wt_q7_cmsis (ailayer_dense_t *layer, ailayer_t *input_layer)
 Initializes and connect a Dense layer with the Q7 AMR CMSIS implementation for transposed weights tensor. More...
 

Detailed Description

Arm CMSIS implementation of the Dense layer for Arm Cortex processors.

Version
2.2.0

Arm CMSIS implementations of the Dense layer in F32 , Q31 and Q7 data-type. These implementations are specifically designed for the Arm Cortex processors and take advantage of SIMD instructions. For more information about the Dense layer refer to ailayer_dense.h.

Function Documentation

◆ ailayer_dense_f32_cmsis()

ailayer_t* ailayer_dense_f32_cmsis ( ailayer_dense_t layer,
ailayer_t input_layer 
)

Initializes and connect a Dense layer with the F32 CMSIS implementation.

Example: Create the layer structure with pretrained weights:

// Use constant data only for inference. For training remove the const qualifier!!
const float weights_data_dense[] = {-10.1164f, -8.4212f, 5.4396f, 7.297f, -7.6482f, -9.0155f};
const float bias_data_dense[] = {-2.9653f, 2.3677f, -1.5968f};
ailayer_dense_f32_t dense_layer = {
.neurons = 3,
.weights.data = (float *) weights_data_dense,
.bias.data = (float *) bias_data_dense
};
General Dense layer structure.
Definition: ailayer_dense.h:71
uint32_t neurons
Layer neurons count (number of outputs).
Definition: ailayer_dense.h:80

Example: Create the layer structure for training:

ailayer_dense_f32_t dense_layer = {
.neurons = 3
};

Example: Initialize and connect the layer:

x = ailayer_dense_f32_cmsis(&dense_layer, x);
ailayer_t * ailayer_dense_f32_cmsis(ailayer_dense_t *layer, ailayer_t *input_layer)
Initializes and connect a Dense layer with the F32 CMSIS implementation.
Parameters
*layerThe layer structure to initialize.
*input_layerThe prior layer.
Returns
The (successfully) initialized layer structure.

◆ ailayer_dense_wt_q7_cmsis()

ailayer_t* ailayer_dense_wt_q7_cmsis ( ailayer_dense_t layer,
ailayer_t input_layer 
)

Initializes and connect a Dense layer with the Q7 AMR CMSIS implementation for transposed weights tensor.

The weights tensor has to be transposed for this implementation, like in ailayer_dense_wt_q7_default().

Example: Create the layer structure with pretrained weights:
In C:

// Use constant data only for inference. For training remove the const qualifier!!
// Weights (8 bit quantized)
const aimath_q7_params_t weights_q_params_dense = { .shift = 3, .zero_point = 0 };
const int8_t weights_data_dense[] = {-81, 58, -67, -61, 44, -72};
// Bias (32 bit quantized)
const aimath_q31_params_t bias_q_params_dense = { .shift = 10, .zero_point = 0 };
const int32_t bias_data_dense[] = {-3036, 2425, -1635};
// Result (8 bit quantized)
const aimath_q7_params_t result_q_params_dense = { .shift = 3, .zero_point = 41 };
ailayer_dense_q7_t dense_layer = {
.neurons = 3,
.weights = {
.tensor_params = (aimath_q7_params_t *) &weights_q_params_dense,
.data = (int8_t *) weights_data_dense
},
.bias = {
.tensor_params = (aimath_q31_params_t *) &bias_q_params_dense,
.data = (int32_t *) bias_data_dense
},
.base.result.tensor_params = (aimath_q7_params_t *) &result_q_params_dense
};
Parameters used for the quantized Q31 values, used as property of a tensor.
Definition: aimath_q31.h:149
uint16_t shift
The scaling factor of the quantization (The total scale is calculated with )
Definition: aimath_q31.h:150
Parameters used for the quantized Q7 values, used as property of a tensor.
Definition: aimath_q7.h:148
uint16_t shift
The scaling factor of the quantization (The total scale is calculated with )
Definition: aimath_q7.h:149

In C, C++ and on Arduino:

// Use constant data only for inference. For training remove the const qualifier!!
// Weights (8 bit quantized)
const aimath_q7_params_t weights_q_params_dense = { .shift = 3, .zero_point = 0 };
const int8_t weights_data_dense[] = {-81, 58, -67, -61, 44, -72};
// Bias (32 bit quantized)
const aimath_q31_params_t bias_q_params_dense = { .shift = 10, .zero_point = 0 };
const int32_t bias_data_dense[] = {-3036, 2425, -1635};
// Result (8 bit quantized)
const aimath_q7_params_t result_q_params_dense = { .shift = 3, .zero_point = 41 };
ailayer_dense_q7_t dense_layer = AILAYER_DENSE_Q7_M(3,
weights_data_dense, &weights_q_params_dense,
bias_data_dense, &bias_q_params_dense,
&result_q_params_dense);

Example: Create the layer structure for automatic parameter distribution:
In C:

ailayer_dense_q7_t dense_layer = {
.neurons = 3
};

In C, C++ and on Arduino:

ailayer_dense_q7_t dense_layer = AILAYER_DENSE_Q7_A(3);

Example: Initialize and connect the layer:

x = ailayer_dense_wt_q7_cmsis(&dense_layer, x);
ailayer_t * ailayer_dense_wt_q7_cmsis(ailayer_dense_t *layer, ailayer_t *input_layer)
Initializes and connect a Dense layer with the Q7 AMR CMSIS implementation for transposed weights t...
Parameters
*layerThe layer structure to initialize.
*input_layerThe prior layer.
Returns
The (successfully) initialized layer structure.