[Bug] Fix bug when Android build
authorskykongkong8 <ss.kong@samsung.com>
Thu, 10 Aug 2023 05:19:00 +0000 (14:19 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Mon, 21 Aug 2023 06:29:23 +0000 (15:29 +0900)
- Due to different compiler setting, trivial code fix for default
  template instantiation is required.

Resolves:

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

Signed-off-by: skykongkong8 <ss.kong@samsung.com>
nntrainer/layers/loss/cross_entropy_sigmoid_loss_layer.cpp
nntrainer/layers/loss/cross_entropy_softmax_loss_layer.cpp
nntrainer/utils/util_func.cpp
nntrainer/utils/util_func.h
test/unittest/unittest_util_func.cpp

index 1770b42f2a292ac0bbcd3396542c0252adf1ef5f..60ea113418d668d1434e3dce70f67ded9ddc3c9b 100644 (file)
@@ -41,7 +41,7 @@ void CrossEntropySigmoidLossLayer::forwarding(RunLayerContext &context,
                         .multiply(-1.0)
                         .apply<float>(static_cast<float (*)(float)>(&std::exp))
                         .add(1.0)
-                        .apply<float>(logFloat);
+                        .apply<float>(logFloat<float>);
     mid_term = mid_term.add(y.apply<float>(ActiFunc::relu<float>));
 
     // y * y2
index 92ce9ec6f6c0c55c63992bac3dea667783ce9dcc..992d257de08fca96adea93a5f78ddf0642949d0c 100644 (file)
@@ -30,14 +30,31 @@ void CrossEntropySoftmaxLossLayer::forwarding(RunLayerContext &context,
   Tensor &y = context.getInput(SINGLE_INOUT_IDX);
 
   // fill the output
-  hidden_ = y.apply(ActiFunc::softmax, hidden_);
+  auto dataType = y.getDataType();
+  if (dataType == ml::train::TensorDim::DataType::FP32) {
+    hidden_ = y.apply(ActiFunc::softmax<float>, hidden_);
 
-  if (context.isLabelAvailable(SINGLE_INOUT_IDX)) {
-    Tensor &y2 = context.getLabel(SINGLE_INOUT_IDX);
-    l = y2.multiply(hidden_.apply<float>(logFloat)).sum_by_batch().multiply(-1);
+    if (context.isLabelAvailable(SINGLE_INOUT_IDX)) {
+      Tensor &y2 = context.getLabel(SINGLE_INOUT_IDX);
+      l = y2.multiply(hidden_.apply<float>(logFloat<float>))
+            .sum_by_batch()
+            .multiply(-1);
 
-    // update the loss value
-    LossLayer::updateLoss(context, l);
+      // update the loss value
+      LossLayer::updateLoss(context, l);
+    }
+  } else if (dataType == ml::train::TensorDim::DataType::FP16) {
+    hidden_ = y.apply(ActiFunc::softmax<_FP16>, hidden_);
+
+    if (context.isLabelAvailable(SINGLE_INOUT_IDX)) {
+      Tensor &y2 = context.getLabel(SINGLE_INOUT_IDX);
+      l = y2.multiply(hidden_.apply<_FP16>(logFloat<_FP16>))
+            .sum_by_batch()
+            .multiply(-1);
+
+      // update the loss value
+      LossLayer::updateLoss(context, l);
+    }
   }
 }
 
@@ -46,13 +63,20 @@ void CrossEntropySoftmaxLossLayer::calcDerivative(RunLayerContext &context) {
   const Tensor &y2 = context.getIncomingDerivative(SINGLE_INOUT_IDX);
   Tensor &y = context.getInput(SINGLE_INOUT_IDX);
 
+  auto dataType = y.getDataType();
+
   Tensor ret;
+  ret.setDataType(dataType);
+  if (dataType == ml::train::TensorDim::DataType::FP32) {
+    y.apply(ActiFunc::softmax<float>, ret);
+  } else if (dataType == ml::train::TensorDim::DataType::FP16) {
+    y.apply(ActiFunc::softmax<_FP16>, ret);
+  }
 
   /// @note y and ret_derivative can be same here, so this has to be out-place
   /// operation
   // TODO: verify y and ret_derivative must not be same as loss layer is not
   // working in-place
-  y.apply(ActiFunc::softmax, ret);
   ret.subtract(y2, ret_derivative);
   if (ret_derivative.divide_i(ret.batch()) != ML_ERROR_NONE) {
     throw std::runtime_error("[CrossEntropySoftmaxLossLayer::calcDerivative] "
index 05b0ace6acf05b66ab2fa223dcd16f599cb33726..bf53d36f4b0c22727a36b1975ace2340dea489c1 100644 (file)
@@ -39,8 +39,6 @@ float sqrtFloat(float x) { return sqrt(x); };
 
 double sqrtDouble(double x) { return sqrt(x); };
 
-float logFloat(float x) { return log(x + 1.0e-20); }
-
 bool isFileExist(std::string file_name) {
   std::ifstream infile(file_name);
   return infile.good();
index 3cf410dc95038fc6b5e886be810ba15a2f021533..d7704c03a253cce388f47fd4b06373e5701dc926 100644 (file)
@@ -97,6 +97,10 @@ double sqrtDouble(double x);
  */
 float logFloat(float x);
 
+template <typename T = float> T logFloat(T x) {
+  return static_cast<T>(log(x + 1.0e-20));
+}
+
 /**
  * @brief     exp function for float type
  * @param[in] x float
index 29c43fea04de955c1a53d0aadcfe4a2b6ac7cb00..9353e8a1e4a86f6d8f5382e0cea538ffe1a85b29 100644 (file)
@@ -44,7 +44,7 @@ TEST(nntrainer_util_func, logFloat_01_p) {
   nntrainer::Tensor input(batch, channel, height, width);
   GEN_TEST_INPUT(input, i * (width) + k + 1);
 
-  nntrainer::Tensor Results = input.apply<float>(nntrainer::logFloat);
+  nntrainer::Tensor Results = input.apply<float>(nntrainer::logFloat<float>);
 
   float *data = Results.getData();
   ASSERT_NE(nullptr, data);