[ Pooling2D ] Set Property for Pooling 2D Layer
authorjijoong.moon <jijoong.moon@samsung.com>
Mon, 15 Jun 2020 02:21:33 +0000 (11:21 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Mon, 15 Jun 2020 07:04:02 +0000 (16:04 +0900)
This PR provides seting property for pooling 2d layer.
which is,
  . stride, padding, pooling_size, pooling type

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

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

index baf87c8..dc895f0 100644 (file)
@@ -65,6 +65,7 @@ public:
     padding[1] = 0;
     pooling_size[0] = 0;
     pooling_size[1] = 0;
+    pooling_type = PoolingType::average;
     setType(LAYER_POOLING2D);
   };
 
index af9f71e..0965491 100644 (file)
@@ -214,19 +214,19 @@ int Conv2DLayer::setProperty(std::vector<std::string> values) {
     } break;
     case PropertyType::kernel_size:
       status = getValues(CONV2D_DIM, value, (int *)(kernel_size));
+      NN_RETURN_STATUS();      
       if (kernel_size[0] == 0 || kernel_size[1] == 0) {
-        ml_loge("Error: stride must be greater than 0");
+        ml_loge("Error: kernel_size must be greater than 0");
         return ML_ERROR_INVALID_PARAMETER;
       }
-      NN_RETURN_STATUS();
       break;
     case PropertyType::stride:
       status = getValues(CONV2D_DIM, value, (int *)(stride));
+      NN_RETURN_STATUS();      
       if (stride[0] == 0 || stride[1] == 0) {
         ml_loge("Error: stride must be greater than 0");
         return ML_ERROR_INVALID_PARAMETER;
       }
-      NN_RETURN_STATUS();
       break;
     case PropertyType::padding:
       status = getValues(CONV2D_DIM, value, (int *)(padding));
@@ -292,6 +292,7 @@ Tensor Conv2DLayer::zero_pad(int batch, Tensor in,
 
   return output;
 }
+  
 Tensor Conv2DLayer::conv2d(Tensor in, Tensor kernel, unsigned int const *stride,
                            int &status) {
 
index ced6824..3d7ca38 100644 (file)
@@ -3,7 +3,7 @@
  *
  * SPDX-License-Identifier: Apache-2.0-only
  *
- * @file       pooling2d_layer.h
+ * @file       pooling2d_layer.cpp
  * @date       12 June 2020
  * @see                https://github.com/nnstreamer/nntrainer
  * @author     Jijoong Moon <jijoong.moon@samsung.com>
@@ -54,7 +54,52 @@ int Pooling2DLayer::setSize(int *size,
 
 int Pooling2DLayer::setProperty(std::vector<std::string> values) {
   int status = ML_ERROR_NONE;
-  // NYI
+
+  for (unsigned int i = 0; i < values.size(); ++i) {
+    std::string key;
+    std::string value;
+
+    status = getKeyValue(values[i], key, value);
+    NN_RETURN_STATUS();
+    unsigned int t = parseLayerProperty(key);
+    switch (static_cast<PropertyType>(t)) {
+    case PropertyType::pooling:
+      pooling_type = (PoolingType)parseType(value, TOKEN_POOLING);
+      if (pooling_type == PoolingType::unknown) {
+        ml_loge("Error: Unknown pooling type");
+        return ML_ERROR_INVALID_PARAMETER;
+      }
+      break;
+    case PropertyType::pooling_size:
+      status = getValues(POOLING2D_DIM, value, (int *)(pooling_size));
+      NN_RETURN_STATUS();      
+      if (pooling_size[0] == 0 || pooling_size[1] == 0) {
+        ml_loge("Error: pooling_size must be greater than 0");
+        return ML_ERROR_INVALID_PARAMETER;
+      }
+      break;
+    case PropertyType::stride:
+      status = getValues(POOLING2D_DIM, value, (int *)(stride));
+      NN_RETURN_STATUS();      
+      if (stride[0] == 0 || stride[1] == 0) {
+        ml_loge("Error: stride must be greater than 0");
+        return ML_ERROR_INVALID_PARAMETER;
+      }
+      break;
+    case PropertyType::padding:
+      status = getValues(POOLING2D_DIM, value, (int *)(padding));
+      NN_RETURN_STATUS();      
+      if (padding[0] < 0 || padding[1] < 0) {
+        ml_loge("Error: padding must be greater than 0");
+        return ML_ERROR_INVALID_PARAMETER;
+      }
+      break;
+    default:
+      ml_loge("Error: Unknown Layer Property Key : %s", key.c_str());
+      status = ML_ERROR_INVALID_PARAMETER;
+      break;
+    }
+  }
   return status;
 }
 
index 276dbf0..ee8a3ce 100644 (file)
@@ -18,6 +18,7 @@
 #include <nntrainer_error.h>
 #include <nntrainer_test_util.h>
 #include <optimizer.h>
+#include <pooling2d_layer.h>
 #include <util_func.h>
 
 /**
@@ -538,6 +539,25 @@ TEST(nntrainer_Conv2DLayer, forwarding_01_p) {
 }
 
 /**
+ * @brief Pooling 2D Layer
+ */
+TEST(nntrainer_Pooling2D, setProperty_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");
+
+  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 Main gtest
  */
 int main(int argc, char **argv) {