| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ |
| #define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ |
|
|
| #include <limits.h> |
|
|
| #include <vector> |
|
|
| #include "edge-impulse-sdk/tensorflow/lite/kernels/internal/common.h" |
| #include "edge-impulse-sdk/tensorflow/lite/kernels/internal/types.h" |
|
|
| namespace tflite { |
|
|
| namespace reference_ops { |
|
|
| |
| template <typename InputT, typename OutputT> |
| inline void Dequantize(const tflite::DequantizationParams& op_params, |
| const RuntimeShape& input_shape, |
| const InputT* input_data, |
| const RuntimeShape& output_shape, OutputT* output_data) { |
| int32_t zero_point = op_params.zero_point; |
| const double scale = op_params.scale; |
| const int flat_size = MatchingFlatSize(input_shape, output_shape); |
|
|
| for (int i = 0; i < flat_size; i++) { |
| const int32_t val = input_data[i]; |
| const OutputT result = static_cast<OutputT>(scale * (val - zero_point)); |
| output_data[i] = result; |
| } |
| } |
|
|
| |
| template <typename T> |
| inline void PerChannelDequantize( |
| const tflite::PerChannelDequantizationParams& op_params, |
| const RuntimeShape& input_shape, const T* input_data, |
| const RuntimeShape& output_shape, float* output_data) { |
| |
| MatchingFlatSize(input_shape, output_shape); |
|
|
| const int32_t* zero_point = op_params.zero_point; |
| const float* scale = op_params.scale; |
| const int32_t quantized_dimension = op_params.quantized_dimension; |
| const int32_t num_dims = input_shape.DimensionsCount(); |
| const int32_t* dims_data = input_shape.DimsData(); |
| std::vector<int> current_dim(num_dims, 0); |
|
|
| do { |
| size_t offset = |
| ReducedOutputOffset(num_dims, reinterpret_cast<const int*>(dims_data), |
| current_dim.data(), 0, nullptr); |
| const int channel = current_dim[quantized_dimension]; |
| const int32_t val = input_data[offset]; |
| const float result = |
| static_cast<float>(scale[channel] * (val - zero_point[channel])); |
| output_data[offset] = result; |
| } while (NextIndex(num_dims, reinterpret_cast<const int*>(dims_data), |
| current_dim.data())); |
| } |
|
|
| } |
|
|
| } |
| #endif |
|
|