Imported Upstream version 1.25.0
[platform/core/ml/nnfw.git] / onert-micro / luci-interpreter / src / kernels / Conv2D.test.cpp
index 6c6d860..c373bd2 100644 (file)
@@ -1,6 +1,5 @@
 /*
  * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
- * Copyright 2019 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.
  * limitations under the License.
  */
 
-// TODO enable it
-#if 0
-#include "kernels/Conv2D.h"
 #include "kernels/TestUtils.h"
-#include "luci_interpreter/TestMemoryManager.h"
+#include "luci_interpreter/test_models/conv2d/FloatConv2DKernel.h"
+#include "luci_interpreter/test_models/conv2d/U8Conv2DKernel.h"
+#include "luci_interpreter/test_models/conv2d/NegConv2DKernel.h"
+
+#include "loader/ModuleLoader.h"
 
 namespace luci_interpreter
 {
-namespace kernels
-{
 namespace
 {
 
@@ -32,680 +30,92 @@ using namespace testing;
 
 class Conv2DTest : public ::testing::Test
 {
-protected:
-  void SetUp() override { _memory_manager = std::make_unique<TestMemoryManager>(); }
-
-  std::unique_ptr<IMemoryManager> _memory_manager;
+  // Do nothing
 };
 
-TEST_F(Conv2DTest, Float)
-{
-  Shape input_shape{1, 4, 3, 2};
-  Shape filter_shape{2, 2, 2, 2};
-  Shape bias_shape{2};
-  std::vector<float> input_data{
-    1,  2,  3,  4,  5,  6,  // row = 0
-    7,  8,  9,  10, 11, 12, // row = 1
-    13, 14, 15, 16, 17, 18, // row = 2
-    19, 20, 21, 22, 23, 24, // row = 3
-  };
-  std::vector<float> filter_data{
-    1,  2,  -3, -4, // out = 0, row = 0
-    -5, 6,  -7, 8,  // out = 1, row = 0
-    4,  -2, 3,  -1, // out = 0, row = 1
-    -8, -6, 7,  5,  // out = 1, row = 1
-  };
-  std::vector<float> bias_data{1, 2};
-  Tensor input_tensor =
-    makeInputTensor<DataType::FLOAT32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::FLOAT32>(bias_shape, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(im2col);
-  _memory_manager->allocate_memory(output_tensor);
-  kernel.execute();
-
-  std::vector<float> ref_output_data{
-    11, 16, 7, 20, // row = 0
-    0,  40, 0, 44, // row = 1
-  };
-  std::vector<int32_t> ref_output_shape{1, 2, 2, 2};
-  EXPECT_THAT(extractTensorData<float>(output_tensor), FloatArrayNear(ref_output_data));
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-}
-
-TEST_F(Conv2DTest, FloatPointwise)
-{
-  Shape input_shape{1, 2, 2, 2};
-  Shape filter_shape{2, 1, 1, 2};
-  Shape bias_shape{2};
-  std::vector<float> input_data{
-    1, 2, // row = 0, col = 0
-    3, 4, // row = 0, col = 1
-    5, 6, // row = 1, col = 0
-    7, 8, // row = 1, col = 1
-  };
-  std::vector<float> filter_data{
-    -1, 2, // out = 0
-    -3, 4, // out = 1
-  };
-  std::vector<float> bias_data{1, 2};
-  Tensor input_tensor =
-    makeInputTensor<DataType::FLOAT32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::FLOAT32>(bias_shape, bias_data, _memory_manager.get());
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 1;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(im2col);
-  _memory_manager->allocate_memory(output_tensor);
-  kernel.execute();
-
-  std::vector<float> ref_output_data{
-    4, 7,  6,  9,  // row = 0
-    8, 11, 10, 13, // row = 1
-  };
-  std::vector<int32_t> ref_output_shape{1, 2, 2, 2};
-  EXPECT_THAT(extractTensorData<float>(output_tensor), FloatArrayNear(ref_output_data));
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-}
-
-TEST_F(Conv2DTest, FloatCheck)
-{
-  Shape input_shape{2, 2, 4, 1};
-  Shape filter_shape{3, 2, 2, 1};
-  Shape bias_shape{3};
-  std::vector<float> input_data{
-    // First batch
-    1, 1, 1, 1, // row = 1
-    2, 2, 2, 2, // row = 2
-    // Second batch
-    1, 2, 3, 4, // row = 1
-    1, 2, 3, 4, // row = 2
-  };
-  std::vector<float> filter_data{
-    1,  2,  3,  4, // first 2x2 filter
-    -1, 1,  -1, 1, // second 2x2 filter
-    -1, -1, 1,  1, // third 2x2 filter
-  };
-  std::vector<float> bias_data{1, 2, 3};
-  Tensor input_tensor =
-    makeInputTensor<DataType::FLOAT32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::FLOAT32>(bias_shape, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 2;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::NONE;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(output_tensor);
-  _memory_manager->allocate_memory(im2col);
-  kernel.execute();
-
-  std::vector<float> ref_output_data{
-    18, 2, 5, // first batch, left
-    18, 2, 5, // first batch, right
-    17, 4, 3, // second batch, left
-    37, 4, 3, // second batch, right
-  };
-  std::vector<int32_t> ref_output_shape{2, 1, 2, 3};
-  EXPECT_THAT(extractTensorData<float>(output_tensor), FloatArrayNear(ref_output_data));
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-}
-
-TEST_F(Conv2DTest, Uint8)
-{
-  std::vector<float> input_data{
-    // First batch
-    1, 1, 1, 1, // row = 1
-    2, 2, 2, 2, // row = 2
-                // Second batch
-    1, 2, 3, 4, // row = 1
-    1, 2, 3, 4, // row = 2
-  };
-  std::vector<float> filter_data{
-    1,  2,  3,  4, // first 2x2 filter
-    -1, 1,  -1, 1, // second 2x2 filter
-    -1, -1, 1,  1, // third 2x2 filter
-  };
-  std::vector<float> bias_data{1, 2, 3};
-
-  std::pair<float, int32_t> input_quant_param = quantizationParams<uint8_t>(-63.5, 64);
-  std::pair<float, int32_t> output_quant_param = quantizationParams<uint8_t>(-127, 128);
-
-  Tensor input_tensor =
-    makeInputTensor<DataType::U8>({2, 2, 4, 1}, input_quant_param.first, input_quant_param.second,
-                                  input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::U8>({3, 2, 2, 1}, input_quant_param.first, input_quant_param.second,
-                                  filter_data, _memory_manager.get());
-  Tensor bias_tensor = makeInputTensor<DataType::S32>(
-    {3}, input_quant_param.first * input_quant_param.first, 0, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::U8, Shape({}), {}, "");
-  Tensor output_tensor =
-    makeOutputTensor(DataType::U8, output_quant_param.first, output_quant_param.second);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 2;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::NONE;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(output_tensor);
-  _memory_manager->allocate_memory(im2col);
-  kernel.execute();
-
-  std::vector<float> ref_output_data{
-    18, 2, 5, // first batch, left
-    18, 2, 5, // first batch, right
-    17, 4, 3, // second batch, left
-    37, 4, 3, // second batch, right
-  };
-  std::vector<int32_t> ref_output_shape{2, 1, 2, 3};
-  EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data));
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-}
-
-TEST_F(Conv2DTest, Uint8_CWQ)
-{
-  const int output_channels = 3;
-  std::vector<float> input_data{
-    // First batch
-    1, 1, 1, 1, // row = 1
-    2, 2, 2, 2, // row = 2
-                // Second batch
-    1, 2, 3, 4, // row = 1
-    1, 2, 3, 4, // row = 2
-  };
-  std::vector<float> filter_data{
-    1,  2,  3,  4, // first 2x2 filter
-    -1, 1,  -1, 1, // second 2x2 filter
-    -1, -1, 1,  1, // third 2x2 filter
-  };
-  std::vector<float> bias_data{1, 2, 3};
-  Shape filter_shape{output_channels, 2, 2, 1};
-
-  std::pair<float, int32_t> input_quant_param = quantizationParams<uint8_t>(0, 4);
-  std::pair<float, int32_t> output_quant_param = quantizationParams<uint8_t>(-127, 128);
-
-  std::vector<std::pair<float, int32_t>> filter_quant_params;
-  filter_quant_params.push_back(quantizationParams<uint8_t>(0, 4));
-  filter_quant_params.push_back(quantizationParams<uint8_t>(-1, 1));
-  filter_quant_params.push_back(quantizationParams<uint8_t>(-1, 1));
-
-  std::vector<float> filter_scales;
-  std::vector<int32_t> filter_zerops;
-  for (auto iter : filter_quant_params)
-  {
-    filter_scales.push_back(iter.first);
-    filter_zerops.push_back(iter.second);
-  }
-
-  std::vector<float> bias_scales;
-  for (int i = 0; i < output_channels; ++i)
-    bias_scales.push_back(filter_quant_params[i].first * input_quant_param.first);
-  std::vector<int32_t> zerop(output_channels, 0);
-
-  Tensor input_tensor =
-    makeInputTensor<DataType::U8>({2, 2, 4, 1}, input_quant_param.first, input_quant_param.second,
-                                  input_data, _memory_manager.get());
-  Tensor filter_tensor = makeInputTensor<DataType::U8>(filter_shape, filter_scales, filter_zerops,
-                                                       0, filter_data, _memory_manager.get());
-  Tensor bias_tensor = makeInputTensor<DataType::S32>({output_channels}, bias_scales, zerop, 0,
-                                                      bias_data, _memory_manager.get());
-  Tensor im2col(DataType::U8, Shape({}), {}, "");
-  Tensor output_tensor =
-    makeOutputTensor(DataType::U8, output_quant_param.first, output_quant_param.second);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 2;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::NONE;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(output_tensor);
-  _memory_manager->allocate_memory(im2col);
-  kernel.execute();
-
-  std::vector<float> ref_output_data{
-    18, 2, 5, // first batch, left
-    18, 2, 5, // first batch, right
-    17, 4, 3, // second batch, left
-    37, 4, 3, // second batch, right
-  };
-  std::vector<int32_t> ref_output_shape{2, 1, 2, 3};
-  EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data));
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-}
-
-TEST_F(Conv2DTest, SInt8_CWQ)
+template <typename T> std::vector<T> checkConv2DKernel(test_kernel::TestDataBase<T> *test_data_base)
 {
-  const int output_channels = 3;
-  std::vector<float> input_data{
-    // First batch
-    1, 1, 1, 1, // row = 1
-    2, 2, 2, 2, // row = 2
-                // Second batch
-    1, 2, 3, 4, // row = 1
-    1, 2, 3, 4, // row = 2
-  };
-  std::vector<float> filter_data{
-    1,  2,  3,  4, // first 2x2 filter
-    -1, 1,  -1, 1, // second 2x2 filter
-    -1, -1, 1,  1, // third 2x2 filter
-  };
-  std::vector<float> bias_data{1, 2, 3};
-  Shape filter_shape{output_channels, 2, 2, 1};
+  MemoryManager memory_manager{};
+  RuntimeModule runtime_module{};
+  bool dealloc_input = true;
 
-  std::pair<float, int32_t> input_quant_param = quantizationParams<int8_t>(0, 4);
-  std::pair<float, int32_t> output_quant_param = quantizationParams<int8_t>(-127, 128);
+  // Load model with single op
+  auto *model_data_raw = reinterpret_cast<const char *>(test_data_base->get_model_ptr());
+  ModuleLoader::load(&runtime_module, &memory_manager, model_data_raw, dealloc_input);
 
-  std::vector<std::pair<float, int32_t>> filter_quant_params;
-  filter_quant_params.push_back(std::pair<float, int32_t>(0.5, 0));
-  filter_quant_params.push_back(std::pair<float, int32_t>(0.25, 0));
-  filter_quant_params.push_back(std::pair<float, int32_t>(0.125, 0));
+  auto *main_runtime_graph = runtime_module.getMainGraph();
+  assert(main_runtime_graph->getNumOfInputTensors() == 1);
 
-  std::vector<float> filter_scales;
-  std::vector<int32_t> filter_zerops;
-  for (auto iter : filter_quant_params)
+  // set input data
   {
-    filter_scales.push_back(iter.first);
-    filter_zerops.push_back(iter.second);
+    auto *input_tensor_data = reinterpret_cast<T *>(main_runtime_graph->configureGraphInput(0));
+    std::copy(test_data_base->get_input_data_by_index(0).begin(),
+              test_data_base->get_input_data_by_index(0).end(), input_tensor_data);
   }
 
-  std::vector<float> bias_scales;
-  for (int i = 0; i < output_channels; ++i)
-    bias_scales.push_back(filter_quant_params[i].first * input_quant_param.first);
-  std::vector<int32_t> zerop(output_channels, 0);
-
-  Tensor input_tensor =
-    makeInputTensor<DataType::S8>({2, 2, 4, 1}, input_quant_param.first, input_quant_param.second,
-                                  input_data, _memory_manager.get());
-  Tensor filter_tensor = makeInputTensor<DataType::S8>(filter_shape, filter_scales, filter_zerops,
-                                                       0, filter_data, _memory_manager.get());
-  Tensor bias_tensor = makeInputTensor<DataType::S32>({output_channels}, bias_scales, zerop, 0,
-                                                      bias_data, _memory_manager.get());
-  Tensor im2col(DataType::S8, Shape({}), {}, "");
-  Tensor output_tensor =
-    makeOutputTensor(DataType::S8, output_quant_param.first, output_quant_param.second);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 2;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::NONE;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(output_tensor);
-  _memory_manager->allocate_memory(im2col);
-  kernel.execute();
-
-  std::vector<float> ref_output_data{
-    18, 2, 5, // first batch, left
-    18, 2, 5, // first batch, right
-    17, 4, 3, // second batch, left
-    37, 4, 3, // second batch, right
-  };
-  std::vector<int32_t> ref_output_shape{2, 1, 2, 3};
-  EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data));
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-}
-
-TEST_F(Conv2DTest, SInt16)
-{
-  Shape input_shape{1, 4, 3, 2};
-  Shape filter_shape{2, 2, 2, 2};
-  Shape bias_shape{2};
-  std::vector<int32_t> ref_output_shape{1, 2, 2, 2};
-
-  std::vector<float> input_data{
-    1,  2,  3,  4,  5,  6,  // row = 0
-    7,  8,  9,  10, 11, 12, // row = 1
-    13, 14, 15, 16, 17, 18, // row = 2
-    19, 20, 21, 22, 23, 24, // row = 3
-  };
-  std::vector<float> filter_data{
-    1,  2,  -3, -4, // out = 0, row = 0
-    -5, 6,  -7, 8,  // out = 1, row = 0
-    4,  -2, 3,  -1, // out = 0, row = 1
-    -8, -6, 7,  5,  // out = 1, row = 1
-  };
-  std::vector<float> bias_data{1, 2};
-  std::vector<float> ref_output_data{
-    11, 16, 7, 20, // row = 0
-    0,  40, 0, 44, // row = 1
-  };
-
-  Tensor input_tensor =
-    makeInputTensor<DataType::S16>(input_shape, 0.25, 0, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::S16>(filter_shape, 0.2, 0, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::S64>(bias_shape, 0.25 * 0.2, 0, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::S16, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::S16, 0.5, 0);
+  runtime_module.execute();
 
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
+  assert(main_runtime_graph->getNumOfOutputTensors() == 1);
 
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(output_tensor);
-  _memory_manager->allocate_memory(im2col);
-  kernel.execute();
-
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-  EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data));
+  T *output_data = reinterpret_cast<T *>(main_runtime_graph->getOutputDataByIndex(0));
+  const size_t num_elements = (main_runtime_graph->getOutputDataSizeByIndex(0) / sizeof(T));
+  std::vector<T> output_data_vector(output_data, output_data + num_elements);
+  return output_data_vector;
 }
 
-TEST_F(Conv2DTest, SInt16_CWQ_weights)
+TEST_F(Conv2DTest, Float_P)
 {
-  Shape input_shape{1, 2, 2, 2};  // Batch x H x W x C
-  Shape filter_shape{3, 1, 1, 2}; // Out channels x H x W x In Channels
-  Shape bias_shape{3};
-  std::vector<int32_t> ref_output_shape{1, 2, 2, 3};
-
-  std::vector<float> input_data{
-    1, 2, // row = 0, col 0
-    3, 4, // row = 0, col 1
-    5, 6, // row = 1, col 0
-    7, 8, // row = 1, col 1
-  };
-  std::vector<float> filter_data{
-    4, -3, // out = 0
-    1, -3, // out = 1
-    5, -3, // out = 2
-  };
-  std::vector<float> bias_data{1, 10, 5};
-  std::vector<float> ref_output_data{
-    0, 5, 4,  // row 0, col 0
-    1, 1, 8,  // row 0, col 1
-    3, 0, 12, // row 1, col 0
-    5, 0, 16, // row 1, col 1
-  };
-
-  float input_scale = 0.25f;
-  float output_scale = 0.05f;
-  std::vector<float> filter_scales = {0.25f, 0.2f, 0.1f};
-  std::vector<float> bias_scales;
-  for (int i = 0; i < filter_scales.size(); ++i)
-    bias_scales.push_back(filter_scales[i] * input_scale);
-  std::vector<int32_t> zerop = {0, 0, 0};
-
-  Tensor input_tensor =
-    makeInputTensor<DataType::S16>(input_shape, input_scale, 0, input_data, _memory_manager.get());
-  Tensor filter_tensor = makeInputTensor<DataType::S16>(filter_shape, filter_scales, zerop, 0,
-                                                        filter_data, _memory_manager.get());
-  Tensor bias_tensor = makeInputTensor<DataType::S64>(bias_shape, bias_scales, zerop, 0, bias_data,
-                                                      _memory_manager.get());
-  Tensor im2col(DataType::S16, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::S16, output_scale, 0);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 1;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  kernel.configure();
-  _memory_manager->allocate_memory(output_tensor);
-  _memory_manager->allocate_memory(im2col);
-  kernel.execute();
-
-  EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
-  EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(ref_output_data));
+  test_kernel::TestDataFloatConv2D test_data_kernel;
+  std::vector<float> output_data_vector = checkConv2DKernel(&test_data_kernel);
+  EXPECT_THAT(output_data_vector, kernels::testing::FloatArrayNear(
+                                    test_data_kernel.get_output_data_by_index(0), 0.0001f));
 }
 
-TEST_F(Conv2DTest, Unsupported_Type_Configure_NEG)
+TEST_F(Conv2DTest, U8_P)
 {
-  Shape input_shape{1, 4, 3, 2};
-  Shape filter_shape{2, 2, 2, 2};
-  Shape bias_shape{2};
-  std::vector<int32_t> input_data{
-    1,  2,  3,  4,  5,  6,  // row = 0
-    7,  8,  9,  10, 11, 12, // row = 1
-    13, 14, 15, 16, 17, 18, // row = 2
-    19, 20, 21, 22, 23, 24, // row = 3
-  };
-  std::vector<float> filter_data{
-    1,  2,  -3, -4, // out = 0, row = 0
-    -5, 6,  -7, 8,  // out = 1, row = 0
-    4,  -2, 3,  -1, // out = 0, row = 1
-    -8, -6, 7,  5,  // out = 1, row = 1
-  };
-  std::vector<float> bias_data{1, 2};
-  Tensor input_tensor =
-    makeInputTensor<DataType::S32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::FLOAT32>(bias_shape, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  EXPECT_ANY_THROW(kernel.configure());
+  test_kernel::TestDataU8Conv2D test_data_kernel;
+  std::vector<uint8_t> output_data_vector = checkConv2DKernel(&test_data_kernel);
+  EXPECT_THAT(output_data_vector, test_data_kernel.get_output_data_by_index(0));
 }
 
-TEST_F(Conv2DTest, Invalid_Bias_Type_NEG)
+TEST_F(Conv2DTest, Input_type_mismatch_NEG)
 {
-  Shape input_shape{1, 4, 3, 2};
-  Shape filter_shape{2, 2, 2, 2};
-  Shape bias_shape{2};
-  std::vector<float> input_data{
-    1,  2,  3,  4,  5,  6,  // row = 0
-    7,  8,  9,  10, 11, 12, // row = 1
-    13, 14, 15, 16, 17, 18, // row = 2
-    19, 20, 21, 22, 23, 24, // row = 3
-  };
-  std::vector<float> filter_data{
-    1,  2,  -3, -4, // out = 0, row = 0
-    -5, 6,  -7, 8,  // out = 1, row = 0
-    4,  -2, 3,  -1, // out = 0, row = 1
-    -8, -6, 7,  5,  // out = 1, row = 1
-  };
-  std::vector<uint8_t> bias_data{1, 2};
-  Tensor input_tensor =
-    makeInputTensor<DataType::FLOAT32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor = makeInputTensor<DataType::U8>(bias_shape, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
+  test_kernel::NegTestDataInputMismatchConv2DKernel test_data_kernel;
 
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  EXPECT_ANY_THROW(kernel.configure());
-}
-
-TEST_F(Conv2DTest, Invalid_Bias_Data_NEG)
-{
-  Shape input_shape{1, 4, 3, 2};
-  Shape filter_shape{2, 2, 2, 2};
-  Shape bias_shape{3};
-  std::vector<float> input_data{
-    1,  2,  3,  4,  5,  6,  // row = 0
-    7,  8,  9,  10, 11, 12, // row = 1
-    13, 14, 15, 16, 17, 18, // row = 2
-    19, 20, 21, 22, 23, 24, // row = 3
-  };
-  std::vector<float> filter_data{
-    1,  2,  -3, -4, // out = 0, row = 0
-    -5, 6,  -7, 8,  // out = 1, row = 0
-    4,  -2, 3,  -1, // out = 0, row = 1
-    -8, -6, 7,  5,  // out = 1, row = 1
-  };
-  std::vector<float> bias_data{1, 2, 3};
-  Tensor input_tensor =
-    makeInputTensor<DataType::FLOAT32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::FLOAT32>(bias_shape, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  EXPECT_ANY_THROW(kernel.configure());
+  MemoryManager memory_manager{};
+  RuntimeModule runtime_module{};
+  bool dealloc_input = true;
+  // Load model with single op
+  auto *model_data_raw = reinterpret_cast<const char *>(test_data_kernel.get_model_ptr());
+  EXPECT_DEATH(ModuleLoader::load(&runtime_module, &memory_manager, model_data_raw, dealloc_input),
+               "");
 }
 
-TEST_F(Conv2DTest, Invalid_Input_Shape_NEG)
+TEST_F(Conv2DTest, Wrong_bias_type_NEG)
 {
-  Shape input_shape{1, 4, 6, 1};
-  Shape filter_shape{2, 2, 2, 2};
-  Shape bias_shape{2};
-  std::vector<float> input_data{
-    1,  2,  3,  4,  5,  6,  // row = 0
-    7,  8,  9,  10, 11, 12, // row = 1
-    13, 14, 15, 16, 17, 18, // row = 2
-    19, 20, 21, 22, 23, 24, // row = 3
-  };
-  std::vector<float> filter_data{
-    1,  2,  -3, -4, // out = 0, row = 0
-    -5, 6,  -7, 8,  // out = 1, row = 0
-    4,  -2, 3,  -1, // out = 0, row = 1
-    -8, -6, 7,  5,  // out = 1, row = 1
-  };
-  std::vector<float> bias_data{1, 2};
-  Tensor input_tensor =
-    makeInputTensor<DataType::FLOAT32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::FLOAT32>(bias_shape, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
+  test_kernel::NegTestDataWrongBiasTypeConv2DKernel test_data_kernel;
 
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::RELU;
-
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  EXPECT_ANY_THROW(kernel.configure());
+  MemoryManager memory_manager{};
+  RuntimeModule runtime_module{};
+  bool dealloc_input = true;
+  // Load model with single op
+  auto *model_data_raw = reinterpret_cast<const char *>(test_data_kernel.get_model_ptr());
+  EXPECT_DEATH(ModuleLoader::load(&runtime_module, &memory_manager, model_data_raw, dealloc_input),
+               "");
 }
 
-TEST_F(Conv2DTest, Invalid_fused_act_tanh_NEG)
+TEST_F(Conv2DTest, Invalid_input_type_NEG)
 {
-  Shape input_shape{1, 4, 3, 2};
-  Shape filter_shape{2, 2, 2, 2};
-  Shape bias_shape{2};
-  std::vector<float> input_data{
-    1,  2,  3,  4,  5,  6,  // row = 0
-    7,  8,  9,  10, 11, 12, // row = 1
-    13, 14, 15, 16, 17, 18, // row = 2
-    19, 20, 21, 22, 23, 24, // row = 3
-  };
-  std::vector<float> filter_data{
-    1,  2,  -3, -4, // out = 0, row = 0
-    -5, 6,  -7, 8,  // out = 1, row = 0
-    4,  -2, 3,  -1, // out = 0, row = 1
-    -8, -6, 7,  5,  // out = 1, row = 1
-  };
-  std::vector<float> bias_data{1, 2};
-  Tensor input_tensor =
-    makeInputTensor<DataType::FLOAT32>(input_shape, input_data, _memory_manager.get());
-  Tensor filter_tensor =
-    makeInputTensor<DataType::FLOAT32>(filter_shape, filter_data, _memory_manager.get());
-  Tensor bias_tensor =
-    makeInputTensor<DataType::FLOAT32>(bias_shape, bias_data, _memory_manager.get());
-  Tensor im2col(DataType::FLOAT32, Shape({}), {}, "");
-  Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
-
-  Conv2DParams params{};
-  params.padding = Padding::VALID;
-  params.stride_height = 2;
-  params.stride_width = 1;
-  params.dilation_height_factor = 1;
-  params.dilation_width_factor = 1;
-  params.activation = Activation::TANH;
+  test_kernel::NegTestDataInvalidInputTypeConv2DKernel test_data_kernel;
 
-  Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, &im2col, params);
-  EXPECT_ANY_THROW(kernel.configure());
+  MemoryManager memory_manager{};
+  RuntimeModule runtime_module{};
+  bool dealloc_input = true;
+  // Load model with single op
+  auto *model_data_raw = reinterpret_cast<const char *>(test_data_kernel.get_model_ptr());
+  EXPECT_DEATH(ModuleLoader::load(&runtime_module, &memory_manager, model_data_raw, dealloc_input),
+               "");
 }
 
 } // namespace
-} // namespace kernels
 } // namespace luci_interpreter
-#endif