28 #include "tests/datasets/LSTMLayerDataset.h" 45 inline void fill_tensor(CLTensor &tensor,
const std::vector<T> &v)
49 TensorShape t_shape = tensor.info()->tensor_shape();
51 window.use_tensor_dimensions(t_shape);
52 Iterator out(&tensor, window);
55 *
reinterpret_cast<T *
>(out.ptr()) = v[
coord2index(t_shape,
id)];
62 inline void fill_tensor(SimpleTensor<T> &tensor,
const std::vector<T> &v)
64 std::memcpy(tensor.data(), v.data(),
sizeof(T) * v.size());
78 const int batch_size = 2;
118 &recurrent_to_input_weights, &recurrent_to_forget_weights, &recurrent_to_cell_weights, &recurrent_to_output_weights,
119 &input_gate_bias, &forget_gate_bias, &cell_gate_bias, &output_gate_bias, &cell_state, &output_state, &cell_state, &output_state);
121 input.allocator()->allocate();
123 input_to_forget_weights.allocator()->allocate();
124 input_to_cell_weights.allocator()->allocate();
125 input_to_output_weights.allocator()->allocate();
126 recurrent_to_input_weights.allocator()->allocate();
127 recurrent_to_forget_weights.allocator()->allocate();
128 recurrent_to_cell_weights.allocator()->allocate();
129 recurrent_to_output_weights.allocator()->allocate();
130 input_gate_bias.allocator()->allocate();
131 forget_gate_bias.allocator()->allocate();
132 cell_gate_bias.allocator()->allocate();
133 output_gate_bias.allocator()->allocate();
134 cell_state.allocator()->allocate();
135 output_state.allocator()->allocate();
143 fill_tensor(input_to_forget_weights, std::vector<uint8_t> { 204, 193,
148 fill_tensor(input_to_cell_weights, std::vector<uint8_t> { 172, 101,
153 fill_tensor(input_to_output_weights, std::vector<uint8_t> { 203, 244,
158 fill_tensor(recurrent_to_input_weights, std::vector<uint8_t> { 162, 168, 7, 95,
163 fill_tensor(recurrent_to_forget_weights, std::vector<uint8_t> { 46, 58, 47, 170,
168 fill_tensor(recurrent_to_cell_weights, std::vector<uint8_t> { 234, 99, 71, 206,
171 209, 136, 59, 138 });
173 fill_tensor(recurrent_to_output_weights, std::vector<uint8_t> { 23, 241, 137, 36,
178 fill_tensor(input_gate_bias, std::vector<int> {-103038, 30525, 115255, -38154 });
179 fill_tensor(forget_gate_bias, std::vector<int> { -23428, 126970, 116806, 46307 });
180 fill_tensor(cell_gate_bias, std::vector<int> { 128006, 69949, -42808, 42568 });
181 fill_tensor(output_gate_bias, std::vector<int> { -67066, -53607, 47233, 7300 });
186 fill_tensor(output_state, std::vector<uint8_t> { 128, 128, 128, 128,
187 128, 128, 128, 128 });
188 fill_tensor(cell_state, std::vector<int16_t> { 0, 0, 0, 0,
192 fill_tensor(input, std::vector<uint8_t> { 106, 193,
195 fill_tensor(expected_output, std::vector<uint8_t> { 128, 130, 36, 134,
196 128, 131, 35, 133 });
202 fill_tensor(expected_output, std::vector<uint8_t> { 128, 129, 12, 137,
203 128, 131, 10, 136 });
208 fill_tensor(expected_output, std::vector<uint8_t> { 128, 129, 8, 140,
216 const int batch_size = 16;
257 &recurrent_to_input_weights, &recurrent_to_forget_weights, &recurrent_to_cell_weights, &recurrent_to_output_weights,
258 &input_gate_bias, &forget_gate_bias, &cell_gate_bias, &output_gate_bias, &cell_state, &output_state, &cell_state, &output_state);
260 input.allocator()->allocate();
262 input_to_forget_weights.allocator()->allocate();
263 input_to_cell_weights.allocator()->allocate();
264 input_to_output_weights.allocator()->allocate();
265 recurrent_to_input_weights.allocator()->allocate();
266 recurrent_to_forget_weights.allocator()->allocate();
267 recurrent_to_cell_weights.allocator()->allocate();
268 recurrent_to_output_weights.allocator()->allocate();
269 input_gate_bias.allocator()->allocate();
270 forget_gate_bias.allocator()->allocate();
271 cell_gate_bias.allocator()->allocate();
272 output_gate_bias.allocator()->allocate();
273 cell_state.allocator()->allocate();
274 output_state.allocator()->allocate();
278 149, 227, 177, 187, 212, 229, 54, 111,
279 131, 116, 3, 58, 196, 26, 131, 255,
280 22, 106, 216, 69, 239, 12, 232, 207,
281 184, 56, 236, 172, 28, 143, 161, 124,
282 255, 33, 197, 122, 47, 197, 26, 229,
283 91, 79, 11, 160, 26, 80, 100, 36,
284 248, 186, 97, 61, 125, 46, 14, 100, });
286 fill_tensor(input_to_forget_weights, std::vector<uint8_t> { 237, 165, 141, 249, 72, 116, 36 , 115,
287 234, 213, 85, 84, 59, 62, 150, 246,
288 182, 102, 158, 214, 182, 183, 94, 11,
289 158, 192, 92, 189, 160, 219, 206, 249,
290 88, 213, 193, 244, 151, 72, 129, 49,
291 239, 83, 106, 9, 169, 187, 125, 171,
292 32, 141, 126, 92, 13, 36, 224, 150,
293 187, 250, 178, 169, 89, 214, 91, 173 });
295 fill_tensor(input_to_cell_weights, std::vector<uint8_t> { 93, 103, 226, 139, 185, 252, 129, 171,
296 159, 32, 25, 175, 224, 183, 165, 35,
297 207, 69, 238, 228, 149, 214, 79, 6,
298 5, 66, 102, 14, 19, 111, 36, 143,
299 22, 85, 13, 78, 236, 121, 122, 77,
300 249, 39, 88, 12, 205, 143, 93, 240,
301 167, 89, 188, 50, 73, 69, 201, 251,
302 59, 32, 203, 184, 139, 191, 199, 74});
304 fill_tensor(input_to_output_weights, std::vector<uint8_t> { 205, 7, 95, 104, 252, 143, 226, 73,
305 229, 114, 152, 171, 221, 153, 73, 229,
306 153, 165, 223, 239, 100, 38, 172, 211,
307 226, 133, 239, 207, 116, 230, 170, 100,
308 241, 95, 171, 124, 63, 115, 32, 127,
309 141, 239, 53, 193, 201, 53, 104, 178,
310 186, 212, 167, 107, 226, 230, 71, 213,
311 148, 217, 19, 248, 233, 195, 183, 156 });
313 fill_tensor(recurrent_to_input_weights, std::vector<uint8_t> { 147, 112, 140, 103, 3, 255, 17, 49,
314 84, 112, 144, 213, 138, 142, 112, 66,
315 117, 30, 101, 35, 25, 132, 211, 229,
316 183, 208, 102, 16, 38, 85, 101, 152,
317 226, 83, 132, 22, 161, 110, 157, 129,
318 184, 63, 168, 42, 220, 126, 209, 157,
319 5, 88, 243, 83, 249, 19, 226, 209,
320 173, 96, 185, 77, 146, 227, 238, 136 });
323 fill_tensor(recurrent_to_forget_weights, std::vector<uint8_t> { 52, 132, 92, 200, 213, 32, 213, 37,
324 116, 142, 116, 180, 4, 172, 158, 143,
325 110, 40, 99, 28, 221, 153, 133, 2,
326 247, 144, 198, 100, 20, 15, 221, 196,
327 159, 178, 188, 151, 171, 15, 25, 217,
328 178, 109, 110, 118, 128, 39, 232, 234,
329 184, 214, 177, 13, 56, 6, 28, 252,
330 89, 187, 242, 59, 146, 111, 132, 129});
332 fill_tensor(recurrent_to_cell_weights, std::vector<uint8_t> { 70, 44, 137, 29, 36, 127, 1, 241,
333 26, 241, 142, 114, 67, 181, 49, 57,
334 131, 152, 175, 77, 23, 63, 37, 124,
335 150, 113, 95, 103, 110, 201, 69, 97,
336 196, 242, 62, 214, 66, 19, 45, 135,
337 22, 168, 149, 104, 77, 101, 36, 68,
338 170, 116, 222, 100, 109, 1, 154, 18,
339 133, 215, 105, 93, 31, 57, 231, 112 });
342 fill_tensor(recurrent_to_output_weights, std::vector<uint8_t> { 45 , 181 , 220 , 219 , 49 , 63 , 49 , 129,
343 7 , 166 , 104 , 114 , 83 , 40 , 1 , 195,
344 245 , 142 , 82 , 232 , 104 , 245 , 82 , 196,
345 111 , 56 , 156 , 9 , 141 , 240 , 180 , 148,
346 247 , 198 , 234 , 137 , 13 , 210 , 161 , 192,
347 196 , 59 , 233 , 184 , 142 , 187 , 140 , 166,
348 2 , 95 , 152 , 46 , 71 , 46 , 113 , 32,
349 175 , 229 , 86 , 87 , 62 , 93 , 74 , 130});
351 fill_tensor(input_gate_bias, std::vector<int> { -40040, -106916, -92315, -79123, 45160, -17954, 50962, -63758 });
352 fill_tensor(forget_gate_bias, std::vector<int> { -128514, 8463, -57831, 116977, 106547, -28132, -124557, 44941 });
353 fill_tensor(cell_gate_bias, std::vector<int> { 88388 , 123601, -116148, -13022, 21619, 48926, 57523, 39332 });
354 fill_tensor(output_gate_bias, std::vector<int> { 59485 , -33070, 21386, -100633, -115959, 125768, -56407, 24897 });
359 fill_tensor(output_state, std::vector<uint8_t> { 128, 128, 128, 128, 128, 128, 128, 128,
360 128, 128, 128, 128, 128, 128, 128, 128,
361 128, 128, 128, 128, 128, 128, 128, 128,
362 128, 128, 128, 128, 128, 128, 128, 128,
363 128, 128, 128, 128, 128, 128, 128, 128,
364 128, 128, 128, 128, 128, 128, 128, 128,
365 128, 128, 128, 128, 128, 128, 128, 128,
366 128, 128, 128, 128, 128, 128, 128, 128,
367 128, 128, 128, 128, 128, 128, 128, 128,
368 128, 128, 128, 128, 128, 128, 128, 128,
369 128, 128, 128, 128, 128, 128, 128, 128,
370 128, 128, 128, 128, 128, 128, 128, 128,
371 128, 128, 128, 128, 128, 128, 128, 128,
372 128, 128, 128, 128, 128, 128, 128, 128,
373 128, 128, 128, 128, 128, 128, 128, 128,
374 128, 128, 128, 128, 128, 128, 128, 128 });
376 fill_tensor(cell_state, std::vector<int16_t> { 0, 0, 0, 0, 0, 0, 0, 0,
377 0, 0, 0, 0, 0, 0, 0, 0,
378 0, 0, 0, 0, 0, 0, 0, 0,
379 0, 0, 0, 0, 0, 0, 0, 0,
380 0, 0, 0, 0, 0, 0, 0, 0,
381 0, 0, 0, 0, 0, 0, 0, 0,
382 0, 0, 0, 0, 0, 0, 0, 0,
383 0, 0, 0, 0, 0, 0, 0, 0,
384 0, 0, 0, 0, 0, 0, 0, 0,
385 0, 0, 0, 0, 0, 0, 0, 0,
386 0, 0, 0, 0, 0, 0, 0, 0,
387 0, 0, 0, 0, 0, 0, 0, 0,
388 0, 0, 0, 0, 0, 0, 0, 0,
389 0, 0, 0, 0, 0, 0, 0, 0,
390 0, 0, 0, 0, 0, 0, 0, 0,
391 0, 0, 0, 0, 0, 0, 0, 0});
394 fill_tensor(input, std::vector<uint8_t> { 247, 203, 159, 131, 182, 114, 207, 195,
395 48 , 61 , 154, 16, 80, 101, 116, 255,
396 50 , 115 , 45, 186, 75, 212, 98, 48,
397 88 , 146 , 24, 143, 218, 174, 203, 200,
398 239 , 16 , 66, 136, 234, 54, 94, 51,
399 101 , 128 , 220, 213, 164, 82, 137, 255,
400 70 , 165 , 234, 220, 66, 35, 183, 206,
401 39 , 57 , 180, 202, 23, 172, 224, 109,
402 102 , 215 , 186, 82, 215, 147, 85, 187,
403 96 , 249 , 59, 116, 150, 44, 167, 128,
404 34 , 217 , 148, 193, 243, 38, 250, 208,
405 112 , 130 , 208, 29, 16, 122, 20, 92,
406 24 , 72 , 104, 29, 150, 233, 151, 19,
407 158 , 192 , 254, 70, 73, 142, 106, 152,
408 3 , 61 , 24, 135, 212, 9, 80, 234,
409 147 , 246 , 83, 249, 49, 14, 68, 50});
411 fill_tensor(expected_output, std::vector<uint8_t> {131, 128, 128, 128, 128, 180, 129, 133,
412 136, 128, 126, 128, 128, 173, 135, 130,
413 160, 128, 128, 128, 128, 138, 132, 129,
414 131, 128, 127, 128, 128, 169, 129, 131,
415 133, 128, 128, 128, 128, 182, 130, 129,
416 131, 128, 128, 128, 128, 163, 129, 130,
417 131, 128, 128, 128, 128, 149, 132, 129,
418 143, 128, 127, 128, 128, 150, 134, 131,
419 134, 128, 128, 128, 128, 167, 130, 130,
420 131, 128, 128, 128, 128, 152, 132, 129,
421 128, 128, 128, 128, 128, 169, 130, 130,
422 173, 128, 128, 128, 128, 148, 139, 130,
423 152, 128, 128, 128, 128, 168, 139, 132,
424 147, 128, 128, 128, 128, 161, 131, 132,
425 130, 128, 128, 128, 128, 159, 134, 128,
426 140, 128, 128, 128, 128, 133, 132, 128 });
432 fill_tensor(expected_output, std::vector<uint8_t> { 130, 128, 128, 128, 128, 205, 129, 137,
433 135, 128, 127, 128, 128, 190, 137, 132,
434 160, 128, 128, 128, 128, 142, 133, 131,
435 130, 128, 128, 128, 128, 185, 129, 133,
436 132, 128, 128, 128, 128, 198, 131, 130,
437 130, 128, 128, 128, 128, 178, 130, 131,
438 131, 128, 128, 128, 128, 158, 132, 131,
439 142, 128, 127, 128, 128, 158, 135, 134,
440 133, 128, 128, 128, 128, 178, 131, 132,
441 131, 128, 128, 128, 128, 160, 132, 130,
442 128, 128, 128, 128, 128, 190, 131, 131,
443 170, 128, 128, 128, 128, 157, 142, 131,
444 149, 128, 128, 128, 128, 178, 142, 135,
445 145, 128, 128, 128, 129, 173, 132, 135,
446 129, 128, 128, 128, 128, 171, 134, 129,
447 140, 128, 128, 128, 128, 135, 132, 129});
457 const int batch_size = 2;
500 input.allocator()->allocate();
550 209, 136, 59, 138 });
566 128, 128, 128, 128 });
574 fill_tensor(expected_output, std::vector<uint8_t> { 128, 128, 31, 128,
575 128, 128, 31, 128 });
581 fill_tensor(expected_output, std::vector<uint8_t> { 128, 128, 5, 128,
587 fill_tensor(expected_output, std::vector<uint8_t> { 128, 128, 1, 128,
588 128, 128, 1, 128, });
quantized, symmetric fixed-point 16-bit number
auto input_to_input_weights
QuantizationInfo qweights(1.f/16.f, 16)
auto recurrent_to_forget_weights
SimpleTensor< uint8_t > expected_output(output_shape, DataType::QASYMM8, 1, qasymm)
TensorShape recurrent_weights_shape
Copyright (c) 2017-2021 Arm Limited.
int coord2index(const TensorShape &shape, const Coordinates &coord)
Linearise the given coordinate.
void configure(const ICLTensor *input, const ICLTensor *input_to_input_weights, const ICLTensor *input_to_forget_weights, const ICLTensor *input_to_cell_weights, const ICLTensor *input_to_output_weights, const ICLTensor *recurrent_to_input_weights, const ICLTensor *recurrent_to_forget_weights, const ICLTensor *recurrent_to_cell_weights, const ICLTensor *recurrent_to_output_weights, const ICLTensor *input_gate_bias, const ICLTensor *forget_gate_bias, const ICLTensor *cell_bias, const ICLTensor *output_gate_bias, ICLTensor *cell_state_in, const ICLTensor *output_state_in, ICLTensor *cell_state_out, ICLTensor *output_state_out)
Initialize function's tensors.
auto input_to_cell_weights
QuantizationInfo qsymm_3(8.f/32768.f, 0)
TensorShape input_weights_shape
auto recurrent_to_output_weights
1 channel, 1 S32 per channel
auto input_to_output_weights
Basic function to run CLLSTMLayerQuantized.
Quantization information.
TensorShape input_shape
Validate test suite is to test ARM_COMPUTE_RETURN_ON_* macros we use to check the validity of given a...
DatasetMode
Possible dataset modes.
fill_tensor(input_to_input_weights, std::vector< uint8_t >{ 122, 130, 124, 134, 120, 122, 134, 134 })
auto recurrent_to_input_weights
TEST_SUITE_END() FIXTURE_DATA_TEST_CASE(RunSmall
[CLActivationLayer Test snippet]
quantized, asymmetric fixed-point 8-bit number unsigned
Accessor implementation for CLTensor objects.
TEST_SUITE(U8_to_S8) FIXTURE_DATA_TEST_CASE(RunSmall
auto recurrent_to_cell_weights
validate(CLAccessor(output_state), expected_output)
void run() override
Run the kernels contained in the function.
QuantizationInfo qasymm(1.f/128.f, 128)
void execute_window_loop(const Window &w, L &&lambda_function, Ts &&... iterators)
Iterate through the passed window, automatically adjusting the iterators and calling the lambda_funct...
TEST_CASE(FusedActivation, framework::DatasetMode::ALL)
Validate fused activation expecting the following behaviours:
QuantizationInfo qsymm_4(16.f/32768.f, 0)
CLLSTMLayerQuantized lstmq
auto input_to_forget_weights