[ Pooling2D ] initialize pooling 2d layer
authorjijoong.moon <jijoong.moon@samsung.com>
Mon, 15 Jun 2020 04:12:48 +0000 (13:12 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Tue, 16 Jun 2020 00:09:11 +0000 (09:09 +0900)
This PR includes initialization of pooling 2d layer.

. check input dimension
. set intput / output dimemsion
. allocate hidden layer

**Self evaluation:**
1. Build test:  [X]Passed [ ]Failed [ ]Skipped
2. Run test:  [X]Passed [ ]Failed [ ]Skipped

Signed-off-by: jijoong.moon <jijoong.moon@samsung.com>
nntrainer/src/pooling2d_layer.cpp
test/unittest/unittest_nntrainer_layers.cpp

index 3d7ca38..ecddc08 100644 (file)
@@ -23,7 +23,25 @@ namespace nntrainer {
 
 int Pooling2DLayer::initialize(bool last) {
   int status = ML_ERROR_NONE;
-  // NYI
+  if (input_dim.getDataLen() == 1) {
+    ml_logw("Warning: the length of previous layer dimension is one");
+  }
+  if (input_dim.batch() <= 0 || input_dim.height() <= 0 ||
+      input_dim.width() <= 0 || input_dim.channel() <= 0) {
+    ml_loge("Error: Dimension must be greater than 0");
+    return ML_ERROR_INVALID_PARAMETER;
+  }
+
+  this->last_layer = last;
+  output_dim.batch(input_dim.batch());
+  output_dim.channel(input_dim.channel());
+  output_dim.height(
+    (input_dim.height() - pooling_size[0] + 2 * padding[0]) / stride[0] + 1);
+  output_dim.width(
+    (input_dim.width() - pooling_size[1] + 2 * padding[1]) / stride[1] + 1);
+
+  hidden = Tensor(output_dim);
+
   return status;
 }
 
index ee8a3ce..98a13fa 100644 (file)
@@ -547,6 +547,27 @@ TEST(nntrainer_Pooling2D, setProperty_01_p) {
   std::vector<std::string> input_str;
   nntrainer::TensorDim previous_dim;
   previous_dim.setTensorDim("1:2:5:5");
+  layer.setInputDimension(previous_dim);
+
+  input_str.push_back("pooling_size= 2,2");
+  input_str.push_back("stride=1, 1");
+  input_str.push_back("padding=0,0");
+  input_str.push_back("pooling = average");
+
+  status = layer.setProperty(input_str);
+  EXPECT_EQ(status, ML_ERROR_NONE);
+}
+
+/**
+ * @brief Pooling 2D Layer
+ */
+TEST(nntrainer_Pooling2D, initialize_01_p) {
+  int status = ML_ERROR_NONE;
+  nntrainer::Pooling2DLayer layer;
+  std::vector<std::string> input_str;
+  nntrainer::TensorDim previous_dim;
+  previous_dim.setTensorDim("1:2:5:5");
+  layer.setInputDimension(previous_dim);
 
   input_str.push_back("pooling_size= 2,2");
   input_str.push_back("stride=1, 1");
@@ -555,6 +576,8 @@ TEST(nntrainer_Pooling2D, setProperty_01_p) {
 
   status = layer.setProperty(input_str);
   EXPECT_EQ(status, ML_ERROR_NONE);
+  status = layer.initialize(false);
+  EXPECT_EQ(status, ML_ERROR_NONE);
 }
 
 /**