diff options
author | Manuel Bottini <manuel.bottini@arm.com> | 2019-10-17 18:37:26 +0100 |
---|---|---|
committer | Pablo Marquez <pablo.tello@arm.com> | 2019-10-24 09:11:40 +0000 |
commit | 07263980e66059a91ce57612e4ca8f4b2a2a206a (patch) | |
tree | 138dc3ecf835df9f38a60959379a52eca08f8b0f /tests/validation/CL/LSTMLayerQuantized.cpp | |
parent | 05069f07bcf95676597698a79926327555276362 (diff) | |
download | ComputeLibrary-07263980e66059a91ce57612e4ca8f4b2a2a206a.tar.gz |
COMPMID-2501: Support multiplier > 1 during QASYMM8 requantization for Quantized LSTM
Change-Id: I7eddbdf77881f313b707b9e59428245f1330a2cf
Signed-off-by: Manuel Bottini <manuel.bottini@arm.com>
Reviewed-on: https://review.mlplatform.org/c/2119
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Pablo Marquez <pablo.tello@arm.com>
Diffstat (limited to 'tests/validation/CL/LSTMLayerQuantized.cpp')
-rw-r--r-- | tests/validation/CL/LSTMLayerQuantized.cpp | 152 |
1 files changed, 148 insertions, 4 deletions
diff --git a/tests/validation/CL/LSTMLayerQuantized.cpp b/tests/validation/CL/LSTMLayerQuantized.cpp index 1fc0af1ecb..686d6bcef8 100644 --- a/tests/validation/CL/LSTMLayerQuantized.cpp +++ b/tests/validation/CL/LSTMLayerQuantized.cpp @@ -72,13 +72,14 @@ TEST_SUITE(LSTMLayerQuantized) // *INDENT-OFF* // clang-format off -TEST_CASE(IntegrationTestCaseSmall, framework::DatasetMode::PRECOMMIT) +TEST_SUITE(IntegrationTestCase) +TEST_SUITE(MultSmallerEq1) +TEST_CASE(RunSmall, framework::DatasetMode::PRECOMMIT) { const int batch_size = 2; const int input_size = 2; const int output_size = 4; - QuantizationInfo qasymm(1.f / 128.f, 128); QuantizationInfo qweights(1.f / 128.f, 128); QuantizationInfo qsymm_3(8.f / 32768.f, 0); @@ -211,7 +212,7 @@ TEST_CASE(IntegrationTestCaseSmall, framework::DatasetMode::PRECOMMIT) validate(CLAccessor(output_state), expected_output); } -TEST_CASE(IntegrationTestCaseLarge, framework::DatasetMode::PRECOMMIT) +TEST_CASE(RunLarge, framework::DatasetMode::PRECOMMIT) { const int batch_size = 16; const int input_size = 8; @@ -448,11 +449,154 @@ TEST_CASE(IntegrationTestCaseLarge, framework::DatasetMode::PRECOMMIT) lstmq.run(); validate(CLAccessor(output_state), expected_output); } +TEST_SUITE_END() // MultSmallerEq1 + +TEST_SUITE(MultGreater1) +TEST_CASE(RunSmall, framework::DatasetMode::PRECOMMIT) +{ + //Input sequence length is 1 + const int batch_size = 2; + const int input_size = 2; + const int output_size = 4; + + QuantizationInfo qasymm(1.f / 128.f, 128); + QuantizationInfo qweights(1.f / 16.f, 16); + QuantizationInfo qsymm_3(8.f / 32768.f, 0); + QuantizationInfo qsymm_4(16.f / 32768.f, 0); + + TensorShape input_shape{ input_size, batch_size }; + TensorShape input_weights_shape{ input_size, output_size }; + TensorShape recurrent_weights_shape{ output_size, output_size }; + TensorShape output_shape{ output_size, batch_size}; + TensorShape bias_shape{ output_size }; + + auto input_to_input_weights = create_tensor<CLTensor>(input_weights_shape, DataType::QASYMM8, 1, qweights); + auto input_to_forget_weights = create_tensor<CLTensor>(input_weights_shape, DataType::QASYMM8, 1, qweights); + auto input_to_cell_weights = create_tensor<CLTensor>(input_weights_shape, DataType::QASYMM8, 1, qweights); + auto input_to_output_weights = create_tensor<CLTensor>(input_weights_shape, DataType::QASYMM8, 1, qweights); + auto recurrent_to_input_weights = create_tensor<CLTensor>(recurrent_weights_shape, DataType::QASYMM8, 1, qweights); + auto recurrent_to_forget_weights = create_tensor<CLTensor>(recurrent_weights_shape, DataType::QASYMM8, 1, qweights); + auto recurrent_to_cell_weights = create_tensor<CLTensor>(recurrent_weights_shape, DataType::QASYMM8, 1, qweights); + auto recurrent_to_output_weights = create_tensor<CLTensor>(recurrent_weights_shape, DataType::QASYMM8, 1, qweights); + auto input_gate_bias = create_tensor<CLTensor>(bias_shape, DataType::S32); + auto forget_gate_bias = create_tensor<CLTensor>(bias_shape, DataType::S32); + auto cell_gate_bias = create_tensor<CLTensor>(bias_shape, DataType::S32); + auto output_gate_bias = create_tensor<CLTensor>(bias_shape, DataType::S32); + + // LSTM input + auto input = create_tensor<CLTensor>(input_shape, DataType::QASYMM8, 1, qasymm); + + // LSTM output state + auto output_state = create_tensor<CLTensor>(output_shape, DataType::QASYMM8, 1, qasymm); + + // LSTM cell state + auto cell_state = create_tensor<CLTensor>(output_shape, DataType::QSYMM16, 1, qsymm_4); + + CLLSTMLayerQuantized lstmq; + + lstmq.configure(&input, &input_to_input_weights, &input_to_forget_weights, &input_to_cell_weights, &input_to_output_weights, + &recurrent_to_input_weights, &recurrent_to_forget_weights, &recurrent_to_cell_weights, &recurrent_to_output_weights, + &input_gate_bias, &forget_gate_bias, &cell_gate_bias, &output_gate_bias, &cell_state, &output_state, &cell_state, &output_state); + + input.allocator()->allocate(); + input_to_input_weights.allocator()->allocate(); + input_to_forget_weights.allocator()->allocate(); + input_to_cell_weights.allocator()->allocate(); + input_to_output_weights.allocator()->allocate(); + recurrent_to_input_weights.allocator()->allocate(); + recurrent_to_forget_weights.allocator()->allocate(); + recurrent_to_cell_weights.allocator()->allocate(); + recurrent_to_output_weights.allocator()->allocate(); + input_gate_bias.allocator()->allocate(); + forget_gate_bias.allocator()->allocate(); + cell_gate_bias.allocator()->allocate(); + output_gate_bias.allocator()->allocate(); + cell_state.allocator()->allocate(); + output_state.allocator()->allocate(); + + // Fill weights and biases + fill_tensor(input_to_input_weights, std::vector<uint8_t>{ 122, 130, + 124, 134, + 120, 122, + 134, 134 }); + + fill_tensor(input_to_forget_weights, std::vector<uint8_t> { 204, 193, + 148, 59, + 113, 17, + 66, 197 }); + + fill_tensor(input_to_cell_weights, std::vector<uint8_t> { 172, 101, + 184, 209, + 165, 82, + 108, 209 }); + + fill_tensor(input_to_output_weights, std::vector<uint8_t> { 203, 244, + 219, 114, + 130, 16, + 163, 222 }); + + fill_tensor(recurrent_to_input_weights, std::vector<uint8_t> { 162, 168, 7, 95, + 91, 155, 108, 216, + 255, 100, 48, 188, + 58, 37, 186, 147 }); + + fill_tensor(recurrent_to_forget_weights, std::vector<uint8_t> { 46, 58, 47, 170, + 246, 96, 12, 99, + 68, 23, 186, 161, + 237, 164, 89, 6 }); + + fill_tensor(recurrent_to_cell_weights, std::vector<uint8_t> { 234, 99, 71, 206, + 205, 159, 64, 253, + 191, 148, 116, 8, + 209, 136, 59, 138 }); + + fill_tensor(recurrent_to_output_weights, std::vector<uint8_t> { 23, 241, 137, 36, + 206, 5, 227, 56, + 254, 176, 231, 47, + 18, 201, 161, 11 }); + + fill_tensor(input_gate_bias, std::vector<int> {-103038, 30525, 115255, -38154 }); + fill_tensor(forget_gate_bias, std::vector<int> { -23428, 126970, 116806, 46307 }); + fill_tensor(cell_gate_bias, std::vector<int> { 128006, 69949, -42808, 42568 }); + fill_tensor(output_gate_bias, std::vector<int> { -67066, -53607, 47233, 7300 }); + + SimpleTensor<uint8_t> expected_output(output_shape, DataType::QASYMM8, 1, qasymm); + + // Initialize state + fill_tensor(output_state, std::vector<uint8_t> { 128, 128, 128, 128, + 128, 128, 128, 128 }); + fill_tensor(cell_state, std::vector<int16_t> { 0, 0, 0, 0, + 0, 0, 0, 0 }); + + // First input + fill_tensor(input, std::vector<uint8_t> { 106, 193, + 155, 150 }); + + fill_tensor(expected_output, std::vector<uint8_t> { 128, 128, 31, 128, + 128, 128, 31, 128 }); + + lstmq.run(); + validate(CLAccessor(output_state), expected_output); + + // Second input + fill_tensor(expected_output, std::vector<uint8_t> { 128, 128, 5, 128, + 128, 128, 5, 128 }); + lstmq.run(); + validate(CLAccessor(output_state), expected_output); + + // Third input + fill_tensor(expected_output, std::vector<uint8_t> { 128, 128, 1, 128, + 128, 128, 1, 128, }); + lstmq.run(); + validate(CLAccessor(output_state), expected_output); +} +TEST_SUITE_END() // MultGreater1 +TEST_SUITE_END() // IntegrationTestCase // clang-format on // *INDENT-ON* TEST_SUITE_END() // LSTMLayerQuantized -TEST_SUITE_END() // NEON +TEST_SUITE_END() // CL } // namespace validation } // namespace test } // namespace arm_compute |