42 const QuantizationInfo
qasymm(1.f / 128.f, 128);
43 const QuantizationInfo
qsymm_3(8.f / 32768.f, 0);
44 const QuantizationInfo
qsymm_4(16.f / 32768.f, 0);
45 const QuantizationInfo qsymm_0(1.f / 32768.f, 0);
50 : _memory_group(std::move(memory_manager)),
54 _concat_input_weights(),
55 _concat_recurrent_weights(),
59 _sigmoid_forget_gate(),
60 _sigmoid_input_gate(),
61 _sigmoid_output_gate(),
62 _tanh_modulation_gate(),
69 _slice_input_tensor(),
70 _slice_forget_tensor(),
72 _slice_output_tensor(),
75 _input_to_input_weights(nullptr),
76 _input_to_forget_weights(nullptr),
77 _input_to_cell_weights(nullptr),
78 _input_to_output_weights(nullptr),
79 _recurrent_to_input_weights(nullptr),
80 _recurrent_to_forget_weights(nullptr),
81 _recurrent_to_cell_weights(nullptr),
82 _recurrent_to_output_weights(nullptr),
83 _input_gate_bias(nullptr),
84 _forget_gate_bias(nullptr),
86 _output_gate_bias(nullptr),
91 _weights_transposed(),
98 _input_modulation_gate_input(),
99 _forget_gate_output(),
100 _input_gate_output(),
101 _output_gate_output(),
102 _input_modulation_gate_output(),
106 _output_state_out_symm(),
107 _output_state_out_f32(),
126 const ITensor *output_state_in,
134 cell_state_out, output_state_out);
141 output_state_in->
info(), cell_state_out->
info(), output_state_out->
info()));
146 cell_bias,
output_gate_bias, cell_state_in, output_state_in, cell_state_out,
150 const int batch_size =
input->info()->dimension(1);
170 _cell_bias = cell_bias;
187 std::vector<const ITensor *> weights_vector{&_recurrent_weights, &_input_weights};
191 _transpose_weights.
configure(&_weights, &_weights_transposed);
194 std::vector<const ITensor *> input_vector{
input, output_state_in};
195 _memory_group.
manage(&_input);
211 _memory_group.
manage(&_output_highp);
213 _gemmlowp.
configure(&_input, &_weights_transposed,
nullptr, &_output_highp);
225 int32_t output_multiplier = 0;
226 int32_t output_shift = 0;
229 _memory_group.
manage(&_output_lowp);
233 info.gemmlowp_multiplier = output_multiplier;
234 info.gemmlowp_shift = output_shift;
236 _output_stage.
configure(&_output_highp, &_bias, &_output_lowp,
info);
243 _memory_group.
manage(&_input_gate_input);
244 _slice_input_tensor.
configure(&_output_lowp, &_input_gate_input, {0, 0}, {
output_size, batch_size});
245 _memory_group.
manage(&_forget_gate_input);
248 _memory_group.
manage(&_input_modulation_gate_input);
249 _slice_cell_tensor.
configure(&_output_lowp, &_input_modulation_gate_input, {2 *
output_size, 0},
251 _memory_group.
manage(&_output_gate_input);
258 _memory_group.
manage(&_input_gate_input);
260 _memory_group.
manage(&_forget_gate_input);
262 _memory_group.
manage(&_input_modulation_gate_input);
265 _memory_group.
manage(&_output_gate_input);
271 _memory_group.
manage(&_forget_gate_output);
274 _sigmoid_forget_gate.
configure(&_forget_gate_input, &_forget_gate_output,
279 _memory_group.
manage(&_input_gate_output);
282 _sigmoid_input_gate.
configure(&_input_gate_input, &_input_gate_output,
287 _memory_group.
manage(&_input_modulation_gate_output);
290 _tanh_modulation_gate.
configure(&_input_modulation_gate_input, &_input_modulation_gate_output,
295 _memory_group.
manage(&_output_gate_output);
298 _sigmoid_output_gate.
configure(&_output_gate_input, &_output_gate_output,
303 _memory_group.
manage(&_cell_state1);
310 _memory_group.
manage(&_cell_state2);
323 _memory_group.
manage(&_output_state_tmp);
326 _tanh_output_state.
configure(cell_state_out, &_output_state_tmp,
329 _memory_group.
manage(&_output_state_out_symm);
338 _memory_group.
manage(&_output_state_out_f32);
341 _dequantize.
configure(&_output_state_out_symm, &_output_state_out_f32);
344 _quantize.
configure(&_output_state_out_f32, output_state_out);
373 const int batch_size =
input->dimension(1);
393 .set_quantization_info(
qasymm));
397 .set_quantization_info(
qsymm_4));
432 std::vector<const ITensorInfo *> inputs_weights_vector;
442 std::vector<const ITensorInfo *> recurrent_weights_vector;
452 std::vector<const ITensorInfo *> weights_vector;
453 weights_vector.emplace_back(&recurrent_weights);
454 weights_vector.emplace_back(&input_weights);
459 TensorInfo weights_transposed = weights.
clone()->set_is_resizable(
true).set_tensor_shape(weights_transposed_shape);
463 std::vector<const ITensorInfo *> input_vector;
464 input_vector.emplace_back(
input);
465 input_vector.emplace_back(output_state_in);
470 std::vector<const ITensorInfo *> bias_vector;
473 bias_vector.emplace_back(cell_bias);
495 int32_t output_multiplier = 0;
496 int32_t output_shift = 0;
503 info.gemmlowp_multiplier = output_multiplier;
504 info.gemmlowp_shift = output_shift;
559 &input_gate_input, &input_gate_output,
ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LOGISTIC)));
631 _concat_inputs.
run();
638 _slice_input_tensor.
run();
639 _slice_forget_tensor.
run();
640 _slice_cell_tensor.
run();
641 _slice_output_tensor.
run();
645 _sigmoid_forget_gate.
run();
648 _sigmoid_input_gate.
run();
651 _tanh_modulation_gate.
run();
654 _sigmoid_output_gate.
run();
662 _tanh_output_state.
run();
675 _concat_input_weights.
run();
683 _concat_recurrent_weights.
run();
690 _concat_weights.
run();
698 _transpose_weights.
run();