19#include "kernels/Utils.h"
21#include "PALFullyConnected.h"
39 if (
weights()->element_type() == DataType::U8)
45 else if (
weights()->element_type() == DataType::FLOAT32)
51 else if (
weights()->element_type() == DataType::S8)
57 else if (
weights()->element_type() == DataType::S4)
64 else if (
weights()->element_type() == DataType::U4)
73 throw std::runtime_error(
"luci-intp FullyConnected(1) Unsupported type.");
87 if (
params().keep_num_dims ==
false)
119 throw std::runtime_error(
"luci-intp FullyConnected(3) Unsupported type.");
124 switch (
input()->element_type())
132 case DataType::FLOAT32:
136 throw std::runtime_error(
"luci-intp FullyConnected(2) Unsupported type.");
141void FullyConnected::evalFloat()
const
143 float activation_min{};
144 float activation_max{};
147 tflite::FullyConnectedParams
params{};
148 params.float_activation_min = activation_min;
149 params.float_activation_max = activation_max;
150 params.weights_format = tflite::FullyConnectedWeightsFormat::kDefault;
152 tflite::reference_ops::FullyConnected(
158void FullyConnected::evalQuantized()
const
164 int32_t output_multiplier;
175 tflite::FullyConnectedParams
op_params{};
179 op_params.output_multiplier = output_multiplier;
185 tflite::reference_ops::FullyConnected(
191void FullyConnected::evalQuantizedS8()
const
197 int32_t output_multiplier;
208 tflite::FullyConnectedParams
op_params{};
212 op_params.output_multiplier = output_multiplier;
224void FullyConnected::evalHybridWI4AF32()
const
226 float activation_min{};
227 float activation_max{};
230 tflite::FullyConnectedParams
params{};
231 params.float_activation_min = activation_min;
232 params.float_activation_max = activation_max;
233 params.weights_format = tflite::FullyConnectedWeightsFormat::kDefault;
243 if (weights_scales.size() == 1)
267 float scale = weights_scales[channel];
279 tflite::reference_ops::FullyConnected(
285void FullyConnected::evalHybridWU4AF32()
const
287 float activation_min{};
288 float activation_max{};
291 tflite::FullyConnectedParams
params{};
292 params.float_activation_min = activation_min;
293 params.float_activation_max = activation_max;
294 params.weights_format = tflite::FullyConnectedWeightsFormat::kDefault;
303 if (weights_scales.size() == 1)
332 float scale = weights_scales[channel];
343 tflite::reference_ops::FullyConnected(
const FullyConnectedParams _params
const FullyConnectedParams & params() const
void resize(const Shape &new_shape)
const Shape & shape() const
const std::vector< float > & scales() const
const std::vector< int32_t > & zero_points() const
DataType element_type() const
int32_t quantized_dimension() const
int32_t zero_point() const
void configure() override
const Tensor * weights() const
FullyConnected(const Tensor *input, const Tensor *weights, const Tensor *bias, Tensor *output, const FullyConnectedParams ¶ms)
void execute() const override
const Tensor * input() const
const Tensor * bias() const
#define LUCI_INTERPRETER_CHECK(cond)
__global uchar * offset(const Image *img, int x, int y)
const luci_interpreter::RuntimeShape output_shape
tflite::RuntimeShape getTensorShape(const Tensor *tensor)
void calculateActivationRange(Activation activation, T *activation_min, T *activation_max)
void calculateActivationRangeQuantized(Activation activation, const Tensor *output, int32_t *activation_min, int32_t *activation_max)
double getQuantizedConvolutionMultipler(float input_scale, float filter_scale, float output_scale)
void quantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift)
void FullyConnected< int8_t >(const tflite::FullyConnectedParams ¶ms, const tflite::RuntimeShape &input_shape, const int8_t *input_data, const tflite::RuntimeShape &filter_shape, const int8_t *filter_data, const tflite::RuntimeShape &bias_shape, const int32_t *bias_data, const tflite::RuntimeShape &output_shape, int8_t *output_data)
T must_cast(loco::Node *node)