| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- /* Copyright 2020 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_LSTM_EVAL_H_
- #define TENSORFLOW_LITE_MICRO_KERNELS_LSTM_EVAL_H_
- #include <cstdint>
- #include <memory>
- #include "tensorflow/lite/c/builtin_op_data.h"
- #include "tensorflow/lite/c/common.h"
- namespace tflite {
- // Pamameters for integer LSTM.
- // Consider split this into two Integer Parameters if more fields are added.
- struct IntegerLstmParameter {
- int32_t effective_input_to_input_scale_a;
- int32_t effective_input_to_input_scale_b;
- int32_t effective_recurrent_to_input_scale_a;
- int32_t effective_recurrent_to_input_scale_b;
- int32_t effective_cell_to_input_scale_a;
- int32_t effective_cell_to_input_scale_b;
- int32_t effective_input_to_forget_scale_a;
- int32_t effective_input_to_forget_scale_b;
- int32_t effective_recurrent_to_forget_scale_a;
- int32_t effective_recurrent_to_forget_scale_b;
- int32_t effective_cell_to_forget_scale_a;
- int32_t effective_cell_to_forget_scale_b;
- int32_t effective_input_to_cell_scale_a;
- int32_t effective_input_to_cell_scale_b;
- int32_t effective_recurrent_to_cell_scale_a;
- int32_t effective_recurrent_to_cell_scale_b;
- int32_t effective_input_to_output_scale_a;
- int32_t effective_input_to_output_scale_b;
- int32_t effective_recurrent_to_output_scale_a;
- int32_t effective_recurrent_to_output_scale_b;
- int32_t effective_cell_to_output_scale_a;
- int32_t effective_cell_to_output_scale_b;
- int32_t effective_proj_scale_a;
- int32_t effective_proj_scale_b;
- int32_t effective_hidden_scale_a;
- int32_t effective_hidden_scale_b;
- int32_t layer_norm_input_scale_a;
- int32_t layer_norm_input_scale_b;
- int32_t layer_norm_forget_scale_a;
- int32_t layer_norm_forget_scale_b;
- int32_t layer_norm_cell_scale_a;
- int32_t layer_norm_cell_scale_b;
- int32_t layer_norm_output_scale_a;
- int32_t layer_norm_output_scale_b;
- // Quantized clip value for cell and projection. Zero value means no clipping.
- int16_t quantized_cell_clip;
- int8_t quantized_proj_clip;
- int32_t hidden_zp;
- int32_t cell_scale;
- int32_t input_variance_guard;
- int32_t forget_variance_guard;
- int32_t cell_variance_guard;
- int32_t output_variance_guard;
- // Pre-calculate bias + zero_point * weight.
- int32_t* input_to_forget_effective_bias;
- int32_t* recurrent_to_forget_effective_bias;
- int32_t* input_to_cell_effective_bias;
- int32_t* recurrent_to_cell_effective_bias;
- int32_t* input_to_output_effective_bias;
- int32_t* recurrent_to_output_effective_bias;
- int32_t* input_to_input_effective_bias;
- int32_t* recurrent_to_input_effective_bias;
- int32_t* projection_effective_bias;
- // Scale and zero point for intermediate tensors.
- // Used only in the 8x8_8 case.
- int32_t intermediate_scale_a[8];
- int32_t intermediate_scale_b[8];
- int32_t intermediate_zp[12];
- };
- // Scales for hybrid op with integer inputs and float weights
- struct HybridLstmScales {
- float input_to_input_weights_scale;
- float input_to_forget_weights_scale;
- float input_to_cell_weights_scale;
- float input_to_output_weights_scale;
- float aux_input_to_input_weights_scale;
- float aux_input_to_forget_weights_scale;
- float aux_input_to_cell_weights_scale;
- float aux_input_to_output_weights_scale;
- float recurrent_to_input_weights_scale;
- float recurrent_to_forget_weights_scale;
- float recurrent_to_cell_weights_scale;
- float recurrent_to_output_weights_scale;
- float cell_to_input_weights_scale;
- float cell_to_forget_weights_scale;
- float cell_to_output_weights_scale;
- float projection_weights_scale;
- };
- TfLiteStatus EvalFloatLstm(
- const TfLiteEvalTensor* input,
- const TfLiteEvalTensor* input_to_input_weights,
- const TfLiteEvalTensor* input_to_forget_weights,
- const TfLiteEvalTensor* input_to_cell_weights,
- const TfLiteEvalTensor* input_to_output_weights,
- const TfLiteEvalTensor* recurrent_to_input_weights,
- const TfLiteEvalTensor* recurrent_to_forget_weights,
- const TfLiteEvalTensor* recurrent_to_cell_weights,
- const TfLiteEvalTensor* recurrent_to_output_weights,
- const TfLiteEvalTensor* cell_to_input_weights,
- const TfLiteEvalTensor* cell_to_forget_weights,
- const TfLiteEvalTensor* cell_to_output_weights,
- const TfLiteEvalTensor* input_layer_norm_coefficients,
- const TfLiteEvalTensor* forget_layer_norm_coefficients,
- const TfLiteEvalTensor* cell_layer_norm_coefficients,
- const TfLiteEvalTensor* output_layer_norm_coefficients,
- const TfLiteEvalTensor* aux_input,
- const TfLiteEvalTensor* aux_input_to_input_weights,
- const TfLiteEvalTensor* aux_input_to_forget_weights,
- const TfLiteEvalTensor* aux_input_to_cell_weights,
- const TfLiteEvalTensor* aux_input_to_output_weights,
- const TfLiteEvalTensor* input_gate_bias,
- const TfLiteEvalTensor* forget_gate_bias,
- const TfLiteEvalTensor* cell_gate_bias,
- const TfLiteEvalTensor* output_gate_bias,
- const TfLiteEvalTensor* projection_weights,
- const TfLiteEvalTensor* projection_bias, const TfLiteLSTMParams* params,
- bool forward_sequence, bool time_major, int output_offset,
- float* scratch_buffer, TfLiteEvalTensor* output_state,
- TfLiteEvalTensor* cell_state, TfLiteEvalTensor* output);
- TfLiteStatus EvalHybridLstm(
- const HybridLstmScales* hybrid_lstm_scales, const TfLiteEvalTensor* input,
- const TfLiteEvalTensor* input_to_input_weights,
- const TfLiteEvalTensor* input_to_input_weights_ledger,
- const TfLiteEvalTensor* input_to_forget_weights,
- const TfLiteEvalTensor* input_to_forget_weights_ledger,
- const TfLiteEvalTensor* input_to_cell_weights,
- const TfLiteEvalTensor* input_to_cell_weights_ledger,
- const TfLiteEvalTensor* input_to_output_weights,
- const TfLiteEvalTensor* input_to_output_weights_ledger,
- const TfLiteEvalTensor* recurrent_to_input_weights,
- const TfLiteEvalTensor* recurrent_to_input_weights_ledger,
- const TfLiteEvalTensor* recurrent_to_forget_weights,
- const TfLiteEvalTensor* recurrent_to_forget_weights_ledger,
- const TfLiteEvalTensor* recurrent_to_cell_weights,
- const TfLiteEvalTensor* recurrent_to_cell_weights_ledger,
- const TfLiteEvalTensor* recurrent_to_output_weights,
- const TfLiteEvalTensor* recurrent_to_output_weights_ledger,
- const TfLiteEvalTensor* cell_to_input_weights,
- const TfLiteEvalTensor* cell_to_forget_weights,
- const TfLiteEvalTensor* cell_to_output_weights,
- const TfLiteEvalTensor* input_layer_norm_coefficients,
- const TfLiteEvalTensor* forget_layer_norm_coefficients,
- const TfLiteEvalTensor* cell_layer_norm_coefficients,
- const TfLiteEvalTensor* output_layer_norm_coefficients,
- const TfLiteEvalTensor* aux_input,
- const TfLiteEvalTensor* aux_input_to_input_weights,
- const TfLiteEvalTensor* aux_input_to_forget_weights,
- const TfLiteEvalTensor* aux_input_to_cell_weights,
- const TfLiteEvalTensor* aux_input_to_output_weights,
- const TfLiteEvalTensor* input_gate_bias,
- const TfLiteEvalTensor* forget_gate_bias,
- const TfLiteEvalTensor* cell_gate_bias,
- const TfLiteEvalTensor* output_gate_bias,
- const TfLiteEvalTensor* projection_weights,
- const TfLiteEvalTensor* projection_weights_ledger,
- const TfLiteEvalTensor* projection_bias, const TfLiteLSTMParams* params,
- bool forward_sequence, bool time_major, int output_offset,
- float* scratch_buffer, float* input_sf, float* aux_input_sf,
- float* output_state_sf, float* prod_scaling_factors,
- float* recovered_cell_weights, int8_t* input_quantized,
- int8_t* aux_input_quantized, int8_t* output_state_quantized,
- int8_t* cell_state_quantized, float* scales, TfLiteEvalTensor* output_state,
- TfLiteEvalTensor* cell_state, int32_t* output_scratch_buffer,
- TfLiteEvalTensor* output, int32_t* input_zp, int32_t* aux_input_zp,
- int32_t* output_state_zp, int32_t* row_sums, int row_sums_size,
- bool* compute_row_sums);
- TfLiteStatus EvalInteger8x8_16Lstm(
- const TfLiteEvalTensor* input,
- const TfLiteEvalTensor* input_to_input_weights,
- const TfLiteEvalTensor* input_to_forget_weights,
- const TfLiteEvalTensor* input_to_cell_weights,
- const TfLiteEvalTensor* input_to_output_weights,
- const TfLiteEvalTensor* recurrent_to_input_weights,
- const TfLiteEvalTensor* recurrent_to_forget_weights,
- const TfLiteEvalTensor* recurrent_to_cell_weights,
- const TfLiteEvalTensor* recurrent_to_output_weights,
- const TfLiteEvalTensor* cell_to_input_weights,
- const TfLiteEvalTensor* cell_to_forget_weights,
- const TfLiteEvalTensor* cell_to_output_weights,
- const TfLiteEvalTensor* input_layer_norm_coefficients,
- const TfLiteEvalTensor* forget_layer_norm_coefficients,
- const TfLiteEvalTensor* cell_layer_norm_coefficients,
- const TfLiteEvalTensor* output_layer_norm_coefficients,
- const TfLiteEvalTensor* input_gate_bias,
- const TfLiteEvalTensor* forget_gate_bias,
- const TfLiteEvalTensor* cell_gate_bias,
- const TfLiteEvalTensor* output_gate_bias,
- const TfLiteEvalTensor* projection_weights,
- const TfLiteEvalTensor* projection_bias, const TfLiteLSTMParams* params,
- bool forward_sequence, bool time_major,
- const IntegerLstmParameter* integer_lstm_param, int32_t output_state_zp,
- TfLiteEvalTensor* output_state, TfLiteEvalTensor* cell_state,
- TfLiteEvalTensor* output, int16_t* scratch0, int16_t* scratch1,
- int16_t* scratch2, int16_t* scratch3, int8_t* scratch4, int32_t* scratch5);
- TfLiteStatus EvalInteger8x8_8Lstm(
- const TfLiteEvalTensor* input,
- const TfLiteEvalTensor* input_to_input_weights,
- const TfLiteEvalTensor* input_to_forget_weights,
- const TfLiteEvalTensor* input_to_cell_weights,
- const TfLiteEvalTensor* input_to_output_weights,
- const TfLiteEvalTensor* recurrent_to_input_weights,
- const TfLiteEvalTensor* recurrent_to_forget_weights,
- const TfLiteEvalTensor* recurrent_to_cell_weights,
- const TfLiteEvalTensor* recurrent_to_output_weights,
- const TfLiteEvalTensor* cell_to_input_weights,
- const TfLiteEvalTensor* cell_to_forget_weights,
- const TfLiteEvalTensor* cell_to_output_weights,
- const TfLiteEvalTensor* input_layer_norm_coefficients,
- const TfLiteEvalTensor* forget_layer_norm_coefficients,
- const TfLiteEvalTensor* cell_layer_norm_coefficients,
- const TfLiteEvalTensor* output_layer_norm_coefficients,
- const TfLiteEvalTensor* input_gate_bias,
- const TfLiteEvalTensor* forget_gate_bias,
- const TfLiteEvalTensor* cell_gate_bias,
- const TfLiteEvalTensor* output_gate_bias,
- const TfLiteEvalTensor* projection_weights,
- const TfLiteEvalTensor* projection_bias, const TfLiteLSTMParams* params,
- TfLiteEvalTensor* output_state, TfLiteEvalTensor* cell_state,
- TfLiteEvalTensor* output, const IntegerLstmParameter* integer_lstm_param,
- int8_t* scratch0, int8_t* scratch1, int16_t* scratch2, int16_t* scratch3,
- int16_t* scratch4, int16_t* scratch5, int16_t* scratch6, int16_t* scratch7);
- } // namespace tflite
- #endif // TENSORFLOW_LITE_MICRO_KERNELS_LSTM_EVAL_H_
|