[Identity] Implement and connect identity layer
authorJihoon Lee <jhoon.it.lee@samsung.com>
Thu, 16 Dec 2021 07:20:09 +0000 (16:20 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Tue, 28 Dec 2021 06:01:41 +0000 (15:01 +0900)
THis patch implement and connect identity layer

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

Signed-off-by: Jihoon Lee <jhoon.it.lee@samsung.com>
api/ccapi/include/layer.h
jni/Android.mk
nntrainer/app_context.cpp
nntrainer/layers/identity_layer.cpp [new file with mode: 0644]
nntrainer/layers/meson.build

index 56b6ac34dd777d9876c8b5f73d783fdad77f17d4..1907a20bab31bb5808730e528fc1442a3ae7de73 100644 (file)
@@ -74,6 +74,7 @@ enum LayerType {
   LAYER_ZONEOUT_LSTMCELL,                  /**< Zoneout LSTM Cell Layer type */
   LAYER_GRUCELL,                           /**< GRU Cell Layer type */
   LAYER_REDUCE_MEAN,                       /**< Reduce mean Layer type */
+  LAYER_IDENTITY,                          /**< Identity Layer type */
   LAYER_LOSS_MSE = 500,             /**< Mean Squared Error Loss Layer type */
   LAYER_LOSS_CROSS_ENTROPY_SIGMOID, /**< Cross Entropy with Sigmoid Loss Layer
                                        type */
index bb9915969d7069d1fed75ae4c592b0f6ac2c95a9..db923c9cc5d0805270503a6cd26593ea7637445e 100644 (file)
@@ -187,6 +187,7 @@ NNTRAINER_SRCS := $(NNTRAINER_ROOT)/nntrainer/models/neuralnet.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/layers/common_properties.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/layers/layer_impl.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/layers/reduce_mean_layer.cpp \
+                  $(NNTRAINER_ROOT)/nntrainer/layers/identity_layer.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/graph/network_graph.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/graph/graph_core.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/graph/connection.cpp \
index 2e44a9a896e999af8e24e2a662dc149fd0f7b4da..ad15846103fd829833b6032de662668c03eb04db 100644 (file)
@@ -47,6 +47,7 @@
 #include <flatten_layer.h>
 #include <gru.h>
 #include <grucell.h>
+#include <identity_layer.h>
 #include <input_layer.h>
 #include <lstm.h>
 #include <lstmcell.h>
@@ -271,6 +272,8 @@ static void add_default_object(AppContext &ac) {
                      MoLAttentionLayer::type, LayerType::LAYER_MOL_ATTENTION);
   ac.registerFactory(nntrainer::createLayer<ReduceMeanLayer>,
                      ReduceMeanLayer::type, LayerType::LAYER_REDUCE_MEAN);
+  ac.registerFactory(nntrainer::createLayer<IdentityLayer>, IdentityLayer::type,
+                     LayerType::LAYER_IDENTITY);
 
 #ifdef ENABLE_NNSTREAMER_BACKBONE
   ac.registerFactory(nntrainer::createLayer<NNStreamerLayer>,
diff --git a/nntrainer/layers/identity_layer.cpp b/nntrainer/layers/identity_layer.cpp
new file mode 100644 (file)
index 0000000..ca808d9
--- /dev/null
@@ -0,0 +1,52 @@
+// SPDX-License-Identifier: Apache-2.0
+/**
+ * Copyright (C) 2021 Jihoon Lee <jhoon.it.lee@samsung.com>
+ *
+ * @file   identity.cpp
+ * @date   16 Dec 2021
+ * @brief  This is identity layer flows everything as it is
+ * @see           https://github.com/nnstreamer/nntrainer
+ * @author Jihoon Lee <jhoon.it.lee@samsung.com>
+ * @bug    No known bugs except for NYI items
+ *
+ */
+#include <identity_layer.h>
+#include <layer_context.h>
+#include <nntrainer_error.h>
+#include <stdexcept>
+#include <tensor.h>
+
+namespace nntrainer {
+IdentityLayer::IdentityLayer() {}
+
+IdentityLayer::~IdentityLayer() {}
+
+void IdentityLayer::finalize(InitLayerContext &context) {
+  context.setOutputDimensions(context.getInputDimensions());
+}
+
+void IdentityLayer::forwarding(RunLayerContext &context, bool training) {
+  if (!context.executeInPlace()) {
+    for (unsigned int i = 0, sz = context.getNumInputs(); i < sz; ++i) {
+      Tensor &hidden_ = context.getOutput(i);
+      Tensor &input_ = context.getInput(i);
+      hidden_.copyData(input_);
+    }
+  }
+}
+
+void IdentityLayer::calcDerivative(RunLayerContext &context) {
+  if (!context.executeInPlace()) {
+    for (unsigned int i = 0, sz = context.getNumInputs(); i < sz; ++i) {
+      Tensor &d_hidden = context.getIncomingDerivative(i);
+      Tensor &d_input = context.getOutgoingDerivative(i);
+      d_input.copyData(d_hidden);
+    }
+  }
+}
+
+void IdentityLayer::setProperty(const std::vector<std::string> &values) {
+  NNTR_THROW_IF(values.size(), std::invalid_argument)
+    << "Identity layer has left unparsed properties";
+}
+} // namespace nntrainer
index b3cf7ced38b49c18486171057703d1235dfe737b..23714c6e3fc148cd259310f9e2970babe79e2dfe 100644 (file)
@@ -39,7 +39,8 @@ layer_sources = [
   'centroid_knn.cpp',
   'layer_context.cpp',
   'reshape_layer.cpp',
-  'reduce_mean_layer.cpp'
+  'reduce_mean_layer.cpp',
+  'identity_layer.cpp'
 ]
 
 layer_headers = [