mirror of
https://github.com/vee1e/tflite-micro.git
synced 2026-09-01 17:57:27 +00:00
Implement tensor decompression in op conv. Extend tests to validate operation on compressed tensors. BUG=part of #2636
134 lines
4.7 KiB
C++
134 lines
4.7 KiB
C++
/* Copyright 2024 The TensorFlow Authors. All Rights Reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
==============================================================================*/
|
|
|
|
#ifndef TENSORFLOW_LITE_MICRO_KERNELS_CONV_H_
|
|
#define TENSORFLOW_LITE_MICRO_KERNELS_CONV_H_
|
|
|
|
#include <cstdint>
|
|
|
|
#include "tensorflow/lite/c/builtin_op_data.h"
|
|
#include "tensorflow/lite/kernels/internal/types.h"
|
|
#include "tensorflow/lite/micro/micro_common.h"
|
|
|
|
namespace tflite {
|
|
|
|
struct OpDataConv {
|
|
TfLitePaddingValues padding;
|
|
|
|
// Cached tensor zero point values for quantized operations.
|
|
int32_t input_zero_point;
|
|
int32_t filter_zero_point;
|
|
int32_t output_zero_point;
|
|
|
|
// The scaling factor from input to output (aka the 'real multiplier') can
|
|
// be represented as a fixed point multiplier plus a left shift.
|
|
int32_t output_multiplier;
|
|
int output_shift;
|
|
|
|
// Per channel output multiplier and shift.
|
|
int32_t* per_channel_output_multiplier;
|
|
int32_t* per_channel_output_shift;
|
|
|
|
// The range of the fused activation layer. For example for kNone and
|
|
// uint8_t these would be 0 and 255.
|
|
int32_t output_activation_min;
|
|
int32_t output_activation_max;
|
|
|
|
// A buffer used to store unpacked filter values. This is used if the source
|
|
// tensor is of n-bit precision that cannot be easily processed by kernels.
|
|
int filter_buffer_index;
|
|
|
|
#ifdef USE_TFLM_COMPRESSION
|
|
|
|
// scratch buffers for compressed tensors
|
|
int weights_scratch_index;
|
|
int bias_scratch_index;
|
|
|
|
#endif // USE_TFLM_COMPRESSION
|
|
};
|
|
|
|
extern const int kConvInputTensor;
|
|
extern const int kConvWeightsTensor;
|
|
extern const int kConvBiasTensor;
|
|
extern const int kConvOutputTensor;
|
|
extern const int kConvQuantizedDimension;
|
|
|
|
// Returns a ConvParams struct with all the parameters needed for a
|
|
// float computation.
|
|
ConvParams ConvParamsFloat(const TfLiteConvParams& params,
|
|
const OpDataConv& data);
|
|
|
|
// Returns a ConvParams struct with all the parameters needed for a
|
|
// quantized computation.
|
|
ConvParams ConvParamsQuantized(const TfLiteConvParams& params,
|
|
const OpDataConv& data);
|
|
|
|
TfLiteStatus CalculateOpDataConv(TfLiteContext* context, TfLiteNode* node,
|
|
const TfLiteConvParams& params, int width,
|
|
int height, int filter_width,
|
|
int filter_height, int out_width,
|
|
int out_height, const TfLiteType data_type,
|
|
OpDataConv* data);
|
|
|
|
void* ConvInit(TfLiteContext* context, const char* buffer, size_t length);
|
|
|
|
TfLiteStatus ConvPrepare(TfLiteContext* context, TfLiteNode* node);
|
|
|
|
// This is the most generic TFLMRegistration. The actual supported types
|
|
// may still be target dependent. The only requirement is that every
|
|
// implementation (reference or optimized) must define this function.
|
|
TFLMRegistration Register_CONV_2D();
|
|
|
|
#if defined(XTENSA)
|
|
// Returns a TFLMRegistration struct for kernel variant that only supports
|
|
// int8 activations and int8 weights and always calls the reference
|
|
// implementation.
|
|
TFLMRegistration Register_CONV_2D_INT8REF();
|
|
|
|
#else
|
|
inline TFLMRegistration Register_CONV_2D_INT8REF() {
|
|
return Register_CONV_2D();
|
|
}
|
|
#endif // defined(XTENSA)
|
|
|
|
#if defined(CMSIS_NN)
|
|
// Returns a TFLMRegistration struct for kernel variant that only supports
|
|
// int8 activations and int4 weights and uses the latency optimized
|
|
// implementations.
|
|
TFLMRegistration Register_CONV_2D_INT4();
|
|
#else
|
|
inline TFLMRegistration Register_CONV_2D_INT4() { return Register_CONV_2D(); }
|
|
#endif // defined(CMSIS_NN)
|
|
|
|
#if defined(CMSIS_NN) || defined(XTENSA)
|
|
// Returns a TFLMRegistration struct for kernel variant that only supports
|
|
// int8 activations and int8 weights and uses the latency optimized
|
|
// implementations.
|
|
TFLMRegistration Register_CONV_2D_INT8();
|
|
|
|
// Returns a TFLMRegistration struct for kernel variant that only supports
|
|
// int16 activations and int8 weights and uses the latency optimized
|
|
// implementations.
|
|
TFLMRegistration Register_CONV_2D_INT16();
|
|
|
|
#else
|
|
inline TFLMRegistration Register_CONV_2D_INT8() { return Register_CONV_2D(); }
|
|
|
|
inline TFLMRegistration Register_CONV_2D_INT16() { return Register_CONV_2D(); }
|
|
#endif // defined(CMSIS_NN) || defined(XTENSA)
|
|
|
|
} // namespace tflite
|
|
|
|
#endif // TENSORFLOW_LITE_MICRO_KERNELS_CONV_H_
|