20#include "kernels/Utils.h"
22#include <tensorflow/lite/kernels/internal/reference/transpose_conv.h>
49 assert(
input()->shape().num_dims() == 4);
50 assert(
filter()->shape().num_dims() == 4);
51 assert(
input()->element_type() == DataType::FLOAT32 ||
input()->element_type() == DataType::U8 ||
52 input()->element_type() == DataType::S16);
53 assert(
input()->element_type() ==
output()->element_type());
54 assert(
input()->shape().dim(3) ==
filter()->shape().dim(3));
59 for (
int i = 0;
i < num_dims;
i++)
65 const int32_t output_height =
out_shape.dim(1);
66 const int32_t output_width =
out_shape.dim(2);
78 if (
input()->element_type() == DataType::U8 ||
input()->element_type() == DataType::S16)
96 switch (
input()->element_type())
98 case DataType::FLOAT32:
110 static_cast<size_t>(
filter()->shape().dim(0)));
111 evalQuantizedPerChannel();
118 throw std::runtime_error(
"luci-intp TransposeConv Unsupported type.");
122void TransposeConv::evalFloat()
const
124 float activation_min{};
125 float activation_max{};
131 op_params.padding_type = tflite::PaddingType::kSame;
132 op_params.padding_values.height = _padding_height;
133 op_params.padding_values.width = _padding_width;
136 op_params.float_activation_min = activation_min;
137 op_params.float_activation_max = activation_max;
138 tflite::reference_ops::TransposeConv(
op_params,
143 tflite::RuntimeShape(),
nullptr);
146void TransposeConv::evalQuantized()
const
149 op_params.padding_type = tflite::PaddingType::kSame;
150 op_params.padding_values.height = _padding_height;
151 op_params.padding_values.width = _padding_width;
158 op_params.output_multiplier = _quant_multipliers[0].multiplier;
159 op_params.output_shift = _quant_multipliers[0].shift;
160 op_params.quantized_activation_min = std::numeric_limits<uint8_t>::min();
161 op_params.quantized_activation_max = std::numeric_limits<uint8_t>::max();
165 tflite::reference_ops::TransposeConv(
op_params,
170 tflite::RuntimeShape(),
nullptr,
174void TransposeConv::evalQuantizedPerChannel()
const
201 int32_t activation_min{};
202 int32_t activation_max{};
205 std::memset(scratch_data, 0,
scratch_tensor->shape().num_elements() *
sizeof(int32_t));
208 for (int32_t batch = 0; batch <
batches; ++batch)
254 int32_t
scaled_acc = tflite::MultiplyByQuantizedMultiplier(
268void TransposeConv::evalQuantizedS16()
const
295 int32_t activation_min{};
296 int32_t activation_max{};
302 for (int32_t batch = 0; batch <
batches; ++batch)
346 int32_t
scaled_acc = tflite::MultiplyByQuantizedMultiplier(
const std::vector< Tensor * > & getOutputTensors() const
const TransposeConvParams _params
const TransposeConvParams & params() const
void resize(const Shape &new_shape)
const Shape & shape() const
static int32_t dim(const circle::Tensor *circle_tensor, int i)
const std::vector< int32_t > & zero_points() const
int32_t zero_point() const
void configure() override
const Tensor * filter() const
void execute() const override
const Tensor * output_shape() const
TransposeConv(const Tensor *output_shape, const Tensor *filter, const Tensor *input, const Tensor *bias, Tensor *output, Tensor *scratch_tensor, const TransposeConvParams ¶ms)
const Tensor * bias() const
const Tensor * input() const
#define LUCI_INTERPRETER_CHECK(cond)
const luci_interpreter::RuntimeShape output_shape
int32_t computePadding(int32_t stride, int32_t dilation_rate, int32_t in_size, int32_t filter_size, int32_t out_size)
int32_t calcOffset(const Shape &shape, int32_t d0, int32_t d1, int32_t d2, int32_t d3)
std::vector< ChannelQuantMultipliers > quantizeMultipliers(const std::vector< double > &effective_scale)
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)
int32_t computeOutputSize(Padding padding, int32_t image_size, int32_t filter_size, int32_t stride, int32_t dilation_rate=1)
std::vector< double > getQuantizedConvolutionMultiplers(float input_scale, const std::vector< float > &filter_scale, float output_scale)
T must_cast(loco::Node *node)