From 3c97bc00673cbee8e8cb4cc06e85a69bab845324 Mon Sep 17 00:00:00 2001 From: hyeonseok lee Date: Mon, 26 Sep 2022 19:47:47 +0900 Subject: [PATCH] [unittest] remove unittest_nntrainer_layers - Remove unittest_nntrainer_layers.cpp cause this test have been disable. - Rename unittest_layers_v2 to unittest Close #2002 Signed-off-by: hyeonseok lee --- .../test/simpleshot_layer_common_tests.cpp | 2 +- packaging/unittest_layers.tar.gz | Bin 91762 -> 78462 bytes packaging/unittest_layers_v2.tar.gz | Bin 78462 -> 0 bytes test/unittest/layers/layers_common_tests.h | 2 +- test/unittest/layers/meson.build | 4 +- test/unittest/meson.build | 2 - test/unittest/models/unittest_models.cpp | 2 +- test/unittest/unittest_nntrainer_layers.cpp | 2732 -------------------- 8 files changed, 5 insertions(+), 2739 deletions(-) delete mode 100644 packaging/unittest_layers_v2.tar.gz delete mode 100644 test/unittest/unittest_nntrainer_layers.cpp diff --git a/Applications/SimpleShot/test/simpleshot_layer_common_tests.cpp b/Applications/SimpleShot/test/simpleshot_layer_common_tests.cpp index 6c28315..1f6de8b 100644 --- a/Applications/SimpleShot/test/simpleshot_layer_common_tests.cpp +++ b/Applications/SimpleShot/test/simpleshot_layer_common_tests.cpp @@ -2,7 +2,7 @@ /** * Copyright (C) 2021 Parichay Kapoor * - * @file unittest_layers_pooling.cpp + * @file simpleshot_layer_common_tests.cpp * @date 13 July 2021 * @brief Simpleshot Layers Test * @see https://github.com/nnstreamer/nntrainer diff --git a/packaging/unittest_layers.tar.gz b/packaging/unittest_layers.tar.gz index 3e3ea29c7648a6ccdb18d939f1c5434922b2744a..7a435aadf450e91772b7af0e61af527a3b404952 100644 GIT binary patch literal 78462 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 diff --git a/packaging/unittest_layers_v2.tar.gz b/packaging/unittest_layers_v2.tar.gz deleted file mode 100644 index 7a435aadf450e91772b7af0e61af527a3b404952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78462 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 * - * @file unittest_models_v2.cpp + * @file unittest_models.cpp * @date 25 Nov 2021 * @brief unittest models for v2 version * @see https://github.com/nnstreamer/nntrainer diff --git a/test/unittest/unittest_nntrainer_layers.cpp b/test/unittest/unittest_nntrainer_layers.cpp deleted file mode 100644 index 4ad53e4..0000000 --- a/test/unittest/unittest_nntrainer_layers.cpp +++ /dev/null @@ -1,2732 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -/** - * Copyright (C) 2020 Jijoong Moon - * - * @file unittest_nntrainer_layers.cpp - * @date 03 June 2020 - * @brief Unit test utility for layers. - * @see https://github.com/nnstreamer/nntrainer - * @author Jijoong Moon - * @bug No known bugs - */ -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using nntrainer::sharedConstTensor; -using nntrainer::sharedTensor; - -static std::string getDimensionString(const nntrainer::TensorDim &dim) { - std::string dim_str; - for (unsigned int i = 0; i < nntrainer::MAXDIM; i++) { - dim_str += std::to_string(dim.getTensorDim(i)); - dim_str += ":"; - } - dim_str.pop_back(); - - return dim_str; -} - -static std::string getLayerResPath(const std::string &file_name) { - return getResPath(file_name, {"test", "unittest_layers"}); -} - -/** - * @brief nntainer abstract Layer for test - */ -template -class nntrainer_abstractLayer : public ::testing::Test { -protected: - virtual void SetUp() { - manager = nntrainer::Manager(true, false); - status = ML_ERROR_NONE; - manager.setInPlaceActivationOptimization(false); - manager.setInferenceInOutMemoryOptimization(false); - prepareLayer(); - initialize(); - } - - virtual int initialize() { - int status = layer.initialize(manager); - EXPECT_EQ(status, ML_ERROR_NONE); - - manager.initializeWeights(); - manager.allocateWeights(); - - in = nntrainer::Tensor(layer.getInputDimension()[0]); - out = nntrainer::Tensor(layer.getOutputDimension()[0]); - - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - return status; - } - - virtual int reinitialize() { - resetLayer(); - prepareLayer(); - status = initialize(); - EXPECT_EQ(status, ML_ERROR_NONE); - return status; - } - - virtual int reinitialize(const std::string str, int batch_size = 1) { - resetLayer(); - prepareLayer(); - int status = setProperty(str); - EXPECT_EQ(status, ML_ERROR_NONE); - setBatch(batch_size); - status = initialize(); - EXPECT_EQ(status, ML_ERROR_NONE); - return status; - } - - // anchor point to prepare layer - virtual void prepareLayer(){}; - - virtual void resetLayer() { - manager.reset(); - layer = LayerType(); - } - - virtual void setInputDim(const std::string &dimension) { - ASSERT_EQ(layer.setProperty({"input_shape=" + dimension}), ML_ERROR_NONE); - } - - void setBatch(unsigned int batch) { layer.setBatch(batch); } - - void matchOutput(const float *result, const float *golden, size_t length) { - ASSERT_GT(length, (size_t)0); - for (size_t i = 0; i < length; ++i) { - EXPECT_NEAR(result[i], golden[i], local_tolerance); - } - } - - void matchOutput(const nntrainer::Tensor &result, - const nntrainer::Tensor &golden) { - matchOutput(result.getData(), golden.getData(), result.size()); - } - - void matchOutput(const float *result, const char *expected, - const nntrainer::TensorDim &dim) { - nntrainer::Tensor golden(dim); - loadFile(expected, golden); - matchOutput(result, golden.getData(), golden.size()); - } - - void matchOutput(const nntrainer::Tensor &result, const char *expected) { - matchOutput(result.getData(), expected, result.getDim()); - } - - void matchOutput(const std::vector result, const char *expected) { - matchOutput(result.data(), expected, {1, 1, 1, result.size()}); - } - - // setting property separated by "|" - int setProperty(const std::string &str) { - std::vector input_str; - std::regex words_regex("[^|]+"); - auto words_begin = - std::sregex_iterator(str.begin(), str.end(), words_regex); - auto words_end = std::sregex_iterator(); - for (std::sregex_iterator i = words_begin; i != words_end; ++i) { - input_str.push_back((*i).str()); - } - int status = layer.setProperty(input_str); - EXPECT_EQ(status, ML_ERROR_NONE); - - return status; - } - - // setting optimizer property separated by "|" - int setOptimizer(nntrainer::OptType type, const std::string &str = "") { - std::vector input_str; - std::regex words_regex("[^|]+"); - auto words_begin = - std::sregex_iterator(str.begin(), str.end(), words_regex); - auto words_end = std::sregex_iterator(); - for (std::sregex_iterator i = words_begin; i != words_end; ++i) { - input_str.push_back((*i).str()); - } - - EXPECT_NO_THROW(opt = nntrainer::createOptimizer(type)); - - status = opt->setProperty(input_str); - EXPECT_EQ(status, ML_ERROR_NONE); - - status = opt->initialize(); - EXPECT_EQ(status, ML_ERROR_NONE); - - EXPECT_NO_THROW(opt->getOptimizerVariableDim(layer.getWeightsRef())); - - return status; - } - - void allocateMemory() { - manager.initializeTensors(true); - manager.allocateTensors(); - } - - template void saveFile(const char *filename, T &t) { - std::ofstream file(filename, std::ios::out | std::ios::binary); - if (!file.good()) { - throw std::runtime_error("could not save file"); - } - t.save(file); - file.close(); - } - - template void loadFile(const char *filename, T &t) { - std::cout << getLayerResPath(filename) << std::endl; - std::ifstream file(getLayerResPath(filename)); - if (!file.good()) { - throw std::runtime_error("could not read, check filename"); - } - t.read(file); - file.close(); - } - - template - void loadFile(const char *filename, std::vector &ts) { - std::ifstream file(getLayerResPath(filename)); - if (!file.good()) { - throw std::runtime_error("could not read, check filename"); - } - /// @note if you want to load weight only, you either have to load weight - /// one by one or do that before setting optimizer to the layer - for (auto &t : ts) - t.read(file); - file.close(); - } - - LayerType layer; - int status; - nntrainer::Tensor in; - nntrainer::Tensor out; - float local_tolerance = tolerance; - nntrainer::Manager manager; - std::shared_ptr opt; -}; - -/** - * @brief nntainer Input Layer for test - */ -class nntrainer_InputLayer - : public nntrainer_abstractLayer { -protected: - virtual void prepareLayer() { - setInputDim("3:28:28"); - setBatch(1); - } -}; - -/** - * @brief Input Layer - */ -TEST_F(nntrainer_InputLayer, initialize_01_p) { - int status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_InputLayer, set_property_01_n) { - EXPECT_THROW( - layer.setProperty(nntrainer::Layer::PropertyType::input_shape, "0:3:2:1"), - std::invalid_argument); -} - -TEST_F(nntrainer_InputLayer, set_property_02_p) { - nntrainer::TensorDim dim; - int status = setProperty("input_shape=3:2:1"); - EXPECT_EQ(status, ML_ERROR_NONE); - - dim = layer.getInputDimension()[0]; - EXPECT_EQ(dim.getTensorDim(0), 1u); - EXPECT_EQ(dim.getTensorDim(1), 3u); - EXPECT_EQ(dim.getTensorDim(2), 2u); - EXPECT_EQ(dim.getTensorDim(3), 1u); -} - -TEST_F(nntrainer_InputLayer, set_property_03_p) { - nntrainer::TensorDim dim; - int status = setProperty("input_shape=1:3:2:1"); - EXPECT_EQ(status, ML_ERROR_NONE); - - dim = layer.getInputDimension()[0]; - EXPECT_EQ(dim.getTensorDim(0), 1u); - EXPECT_EQ(dim.getTensorDim(1), 3u); - EXPECT_EQ(dim.getTensorDim(2), 2u); - EXPECT_EQ(dim.getTensorDim(3), 1u); -} - -TEST_F(nntrainer_InputLayer, set_property_04_p) { - nntrainer::TensorDim dim; - int status = setProperty("input_shape=4:3:2:1"); - EXPECT_EQ(status, ML_ERROR_NONE); - - /** Set input shape ignores batch size */ - dim = layer.getInputDimension()[0]; - EXPECT_EQ(dim.getTensorDim(0), 1u); - EXPECT_EQ(dim.getTensorDim(1), 3u); - EXPECT_EQ(dim.getTensorDim(2), 2u); - EXPECT_EQ(dim.getTensorDim(3), 1u); -} - -TEST_F(nntrainer_InputLayer, set_property_05_p) { - nntrainer::TensorDim dim; - int status = ML_ERROR_NONE; - - setBatch(5); - EXPECT_EQ(status, ML_ERROR_NONE); - - dim = layer.getInputDimension()[0]; - EXPECT_EQ(dim.getTensorDim(0), 5u); - EXPECT_EQ(dim.getTensorDim(1), 3u); - EXPECT_EQ(dim.getTensorDim(2), 28u); - EXPECT_EQ(dim.getTensorDim(3), 28u); - - /** Original batch size is retained */ - status = setProperty("input_shape=1:3:2:1"); - EXPECT_EQ(status, ML_ERROR_NONE); - - dim = layer.getInputDimension()[0]; - EXPECT_EQ(dim.getTensorDim(0), 5u); - EXPECT_EQ(dim.getTensorDim(1), 3u); - EXPECT_EQ(dim.getTensorDim(2), 2u); - EXPECT_EQ(dim.getTensorDim(3), 1u); - - /** Original batch size is retained */ - status = setProperty("input_shape=4:3:2:1"); - EXPECT_EQ(status, ML_ERROR_NONE); - - dim = layer.getInputDimension()[0]; - EXPECT_EQ(dim.getTensorDim(0), 5u); - EXPECT_EQ(dim.getTensorDim(1), 3u); - EXPECT_EQ(dim.getTensorDim(2), 2u); - EXPECT_EQ(dim.getTensorDim(3), 1u); -} - -/** - * @brief Input Layer - */ -TEST_F(nntrainer_InputLayer, setOptimizer_01_p) { - status = setOptimizer(nntrainer::OptType::ADAM, "learning_rate=0.001 |" - "beta1=0.9 |" - "beta2=0.9999 |" - "epsilon=1e-7"); - - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Input Layer - */ -TEST_F(nntrainer_InputLayer, setActivation_01_p) { - int status = layer.setProperty({"activation=tanh"}); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Input Layer - */ -TEST_F(nntrainer_InputLayer, setActivation_02_n) { - int status = layer.setProperty({"activation=unknown"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST_F(nntrainer_InputLayer, setActivation_03_n) { - status = layer.setProperty({"activation=random"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -/** - * @brief Input Layer - */ -TEST_F(nntrainer_InputLayer, checkValidation_01_p) { - int status = layer.setProperty({"activation=tanh"}); - ASSERT_EQ(status, ML_ERROR_NONE); - - status = layer.checkValidation(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief nntainer Flip Layer for test - */ -class nntrainer_PreprocessFlipLayer - : public nntrainer_abstractLayer { -protected: - virtual void prepareLayer() { - setInputDim("3:5:5"); - setBatch(1); - } -}; - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, initialize_01_p) { - int status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, set_property_01_n) { - int status = layer.setProperty({"flip_direction=vertical_and_horizontal"}); - EXPECT_NE(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, set_property_02_n) { - int status = layer.setProperty({"flip_direction=flip"}); - EXPECT_NE(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, set_property_03_n) { - int status = layer.setProperty({"flip_direction=horizontal&vertical"}); - EXPECT_NE(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, set_property_04_n) { - int status = layer.setProperty({"flip_direction=horizontal&&vertical"}); - EXPECT_NE(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, set_property_05_n) { - int status = layer.setProperty({"flip_direction=horizontal+vertical"}); - EXPECT_NE(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, forwarding_01_p) { - layer.setProperty({"input_shape=1:3:5:5"}); - layer.setProperty({"flip_direction=horizontal"}); - nntrainer::Tensor in(nntrainer::TensorDim({1, 3, 5, 5})); - nntrainer::Tensor out_flip, out_orig; - - in.setRandNormal(0.0f, 10.0f); - - while (out_flip.empty() || (out_flip == in)) { - EXPECT_NO_THROW(out_flip = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - } - EXPECT_NE(out_flip, in); - - while (out_orig.empty() || (out_orig != in)) { - EXPECT_NO_THROW( - out_orig = *layer.forwarding_with_val({MAKE_SHARED_TENSOR(out_flip)})[0]); - } - EXPECT_EQ(out_orig, in); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, forwarding_02_p) { - layer.setProperty({"input_shape=1:2:4:4"}); - layer.setProperty({"flip_direction=horizontal"}); - nntrainer::Tensor in(nntrainer::TensorDim({1, 2, 4, 4})); - nntrainer::Tensor out_flip, out_orig; - - in.setRandNormal(0.0f, 10.0f); - - while (out_flip.empty() || (out_flip == in)) { - EXPECT_NO_THROW(out_flip = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - } - EXPECT_NE(out_flip, in); - - while (out_orig.empty() || (out_orig != in)) { - EXPECT_NO_THROW( - out_orig = *layer.forwarding_with_val({MAKE_SHARED_TENSOR(out_flip)})[0]); - } - EXPECT_EQ(out_orig, in); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, forwarding_03_p) { - layer.setProperty({"input_shape=1:3:5:5"}); - layer.setProperty({"flip_direction=vertical"}); - nntrainer::Tensor in(nntrainer::TensorDim({1, 3, 5, 5})); - nntrainer::Tensor out_flip, out_orig; - - in.setRandNormal(0.0f, 10.0f); - - while (out_flip.empty() || (out_flip == in)) { - EXPECT_NO_THROW(out_flip = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - } - EXPECT_NE(out_flip, in); - - while (out_orig.empty() || (out_orig != in)) { - EXPECT_NO_THROW( - out_orig = *layer.forwarding_with_val({MAKE_SHARED_TENSOR(out_flip)})[0]); - } - EXPECT_EQ(out_orig, in); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, forwarding_04_p) { - layer.setProperty({"input_shape=1:2:4:4"}); - layer.setProperty({"flip_direction=vertical"}); - nntrainer::Tensor in(nntrainer::TensorDim({1, 2, 4, 4})); - nntrainer::Tensor out_flip, out_orig; - - in.setRandNormal(0.0f, 10.0f); - - while (out_flip.empty() || (out_flip == in)) { - EXPECT_NO_THROW(out_flip = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - } - EXPECT_NE(out_flip, in); - - while (out_orig.empty() || (out_orig != in)) { - EXPECT_NO_THROW( - out_orig = *layer.forwarding_with_val({MAKE_SHARED_TENSOR(out_flip)})[0]); - } - EXPECT_EQ(out_orig, in); -} - -/** - * @brief Preprocess Flip Layer - */ -TEST_F(nntrainer_PreprocessFlipLayer, forwarding_05_p) { - layer.setProperty({"input_shape=1:2:4:4"}); - layer.setBatch(5); - layer.setProperty({"flip_direction=horizontal_and_vertical"}); - nntrainer::Tensor in(nntrainer::TensorDim({5, 2, 4, 4})); - nntrainer::Tensor out_flip; - - in.setRandNormal(0.0f, 10.0f); - - EXPECT_NO_THROW(out_flip = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); -} - -/** - * @brief Preprocess Translate Layer - */ -class nntrainer_PreprocessTranslateLayer - : public nntrainer_abstractLayer { -protected: - virtual void prepareLayer() { - setInputDim("3:32:32"); - setBatch(1); - } -}; - -/** - * @brief Preprocess Translate Layer - */ -TEST_F(nntrainer_PreprocessTranslateLayer, initialize_01_p) { - int status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Translate Layer - */ -TEST_F(nntrainer_PreprocessTranslateLayer, set_property_01_p) { - int status = layer.setProperty({"random_translate=0.5"}); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Preprocess Translate Layer - */ -TEST_F(nntrainer_PreprocessTranslateLayer, forwarding_01_p) { - layer.setBatch(2); - layer.setProperty({"random_translate=0.0"}); - layer.initialize(manager); - - manager.initializeTensors(true); - - nntrainer::Tensor in(nntrainer::TensorDim({2, 3, 32, 32})); - nntrainer::Tensor out_trans; - - in.setRandNormal(0.0f, 10.0f); - - EXPECT_NO_THROW(out_trans = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - EXPECT_EQ(out_trans, in); -} - -/** - * @brief Preprocess Translate Layer - */ -TEST_F(nntrainer_PreprocessTranslateLayer, forwarding_02_p) { -#if defined(ENABLE_DATA_AUGMENTATION_OPENCV) - layer.setBatch(1); - layer.setProperty({"random_translate=0.1"}); - layer.initialize(manager); - - manager.initializeTensors(true); - - nntrainer::Tensor in(nntrainer::TensorDim({1, 3, 32, 32})); - - in.setRandNormal(0.0f, 10.0f); - - nntrainer::Tensor out_trans; - EXPECT_NO_THROW(out_trans = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - EXPECT_NE(out_trans, in); -#else - layer.setBatch(1); - layer.setProperty({"random_translate=0.1"}); - EXPECT_THROW(layer.initialize(manager), nntrainer::exception::not_supported); -#endif -} - -/** - * @brief nntainer Fully Conneced Layer for test - */ -class nntrainer_FullyConnectedLayer - : public nntrainer_abstractLayer { -protected: - virtual void prepareLayer() { - setInputDim("1:28:28"); - setBatch(5); - setProperty("unit=1"); - } -}; - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer, initialize_01_p) { - int status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Fully Connected Layer without setting any parameter - */ -TEST(nntrainer_FullyConnectedLayer_n, initialize_02_n) { - nntrainer::Manager manager{true, false}; - manager.setInferenceInOutMemoryOptimization(false); - nntrainer::FullyConnectedLayer layer; - EXPECT_THROW(layer.initialize(manager), std::invalid_argument); -} - -/** - * @brief Fully Connected Layer without setting unit - */ -TEST(nntrainer_FullyConnectedLayer_n, initialize_03_n) { - nntrainer::Manager manager{true, false}; - manager.setInferenceInOutMemoryOptimization(false); - nntrainer::FullyConnectedLayer layer; - layer.setProperty({"input_shape=32:1:28:28"}); - - EXPECT_THROW(layer.initialize(manager), std::invalid_argument); -} - -/** - * @brief FullyConnected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer, initialize_04_p) { - std::string layer_name; - - /** Layer name can be set */ - layer_name = "FCLayer0"; - status = layer.setProperty({"name=" + layer_name}); - EXPECT_EQ(status, ML_ERROR_NONE); - EXPECT_EQ(layer.getName(), layer_name); - - /** Layer name cannot be updated once set */ - layer_name = "FCLayer1"; - status = layer.setProperty({"name=" + layer_name}); - EXPECT_EQ(status, ML_ERROR_NONE); - EXPECT_EQ(layer.getName(), layer_name); -} - -/** - * @brief FullyConnected Layer - */ -TEST(nntrainer_FullyConnectedLayer_init_name, initialize_05_n) { - int status = ML_ERROR_NONE; - nntrainer::FullyConnectedLayer layer0, layer1; - nntrainer::TensorDim d; - std::string layer_name; - - /** no name is set */ - layer_name = layer0.getName(); - EXPECT_EQ(layer_name.size(), 0u); - - /** Set empty name */ - status = layer0.setProperty({"name="}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer, setOptimizer_01_p) { - status = setOptimizer(nntrainer::OptType::ADAM, "learning_rate=0.001 |" - "beta1=0.9 |" - "beta2=0.9999 |" - "epsilon=1e-7"); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief FullyConnected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer, setOptimizer_02_p) { - status = setOptimizer(nntrainer::OptType::SGD, "learning_rate=0.1"); - EXPECT_EQ(status, ML_ERROR_NONE); -} -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer, setActivation_01_p) { - status = layer.setProperty({"activation=tanh"}); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer, setActivation_02_n) { - status = layer.setProperty({"activation=unknown"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -/** - * @brief FullyConnected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer, checkValidation_01_p) { - status = layer.setProperty({"activation=ReLU"}); - EXPECT_EQ(status, ML_ERROR_NONE); - status = layer.checkValidation(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief nntainer Fully Conneced Layer for test - */ -class nntrainer_FullyConnectedLayer_TFmatch - : public nntrainer_abstractLayer { - -protected: - typedef nntrainer_abstractLayer super; - - virtual int initialize() { - int status = super::initialize(); - label = - MAKE_SHARED_TENSOR(nntrainer::Tensor(layer.getOutputDimension()[0])); - - layers.clear(); - - return status; - } - - void addActivation(nntrainer::ActivationType type) { - std::shared_ptr act_layer = - std::make_shared(type); - - status = act_layer->setProperty( - {"input_shape=" + getDimensionString(layer.getOutputDimension()[0])}); - EXPECT_EQ(status, ML_ERROR_NONE); - - act_layer->setBatch(layer.getOutputDimension()[0].batch()); - - status = act_layer->initialize(manager); - EXPECT_EQ(status, ML_ERROR_NONE); - - act_layer->setInputBuffers( - manager.trackLayerInputs(act_layer->getType(), act_layer->getName(), - act_layer->getInputDimension())); - act_layer->setOutputBuffers( - manager.trackLayerOutputs(act_layer->getType(), act_layer->getName(), - act_layer->getOutputDimension())); - - layers.push_back(act_layer); - } - - void addLoss(nntrainer::LossType type) { - std::shared_ptr loss_layer = - std::make_shared(); - - status = loss_layer->setProperty( - {"input_shape=" + getDimensionString(layer.getOutputDimension()[0])}); - EXPECT_EQ(status, ML_ERROR_NONE); - - loss_layer->setBatch(layer.getOutputDimension()[0].batch()); - - status = loss_layer->initialize(manager); - EXPECT_EQ(status, ML_ERROR_NONE); - status = loss_layer->setLoss(type); - EXPECT_EQ(status, ML_ERROR_NONE); - loss_type = type; - - loss_layer->setInputBuffers( - manager.trackLayerInputs(loss_layer->getType(), loss_layer->getName(), - loss_layer->getInputDimension())); - loss_layer->setOutputBuffers( - manager.trackLayerOutputs(loss_layer->getType(), loss_layer->getName(), - loss_layer->getOutputDimension())); - - layers.push_back(loss_layer); - - if (type == nntrainer::LossType::LOSS_ENTROPY_SOFTMAX) { - nntrainer::Tensor weight = layer.weightAt(0).getVariable(); - loadFile("tc_fc_1_FCLayer_sensible.in", in); - loadFile("tc_fc_1_FCKernel_sensible.in", weight); - loadFile("tc_fc_1_FCLabel_sensible.in", *label); - } - } - - void matchForwarding(const char *file) { - std::vector v; - for (unsigned int i = 0; i < layer.getNumWeights(); ++i) { - v.push_back(layer.weightAt(i).getVariable()); - } - - loadFile("tc_fc_1_FCLayer.in", in); - loadFile("tc_fc_1_FCKernel.in", v); - loadFile("tc_fc_1_FCLabel.in", *label); - - sharedConstTensor out; - EXPECT_NO_THROW(out = - layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - if (layers.size() > 0) { - for (unsigned int idx = 0; idx < layers.size() - 1; idx++) { - EXPECT_NO_THROW(out = layers[idx]->forwarding_with_val({out})[0]); - } - - if (nntrainer::istrequal(layers.back()->getType(), - nntrainer::LossLayer::type)) { - std::shared_ptr loss_layer = - std::static_pointer_cast(layers.back()); - EXPECT_NO_THROW(out = - loss_layer->forwarding_with_val({out}, {label})[0]); - } else { - EXPECT_NO_THROW(out = layers.back()->forwarding_with_val({out})[0]); - } - EXPECT_EQ(status, ML_ERROR_NONE); - } - matchOutput(*out, file); - } - - void matchLoss(const char *file) { - nntrainer::Tensor loss(1, 1, 1, 1); - loadFile(file, loss); - EXPECT_NEAR(layers.back()->getLoss(), *(loss.getData()), local_tolerance); - } - - void matchBackwarding(const char *file_dx, const char *file_uw, - const char *file_g, const bool with_loss = false) { - - int idx = layers.size() - 1; - sharedTensor def_derivative = - MAKE_SHARED_TENSOR(constant(1.0, 3, 1, 1, 15)); - sharedConstTensor back_out; - - if (layers.size() && nntrainer::istrequal(layers.back()->getType(), - nntrainer::LossLayer::type)) { - if (with_loss) { - EXPECT_NO_THROW(layers.back()->backwarding_with_val({label})); - back_out = MAKE_SHARED_TENSOR(layers.back()->getDerivatives()[0]); - } else { - back_out = def_derivative; - } - idx -= 1; - } else { - back_out = def_derivative; - } - - for (; idx >= 0; --idx) - EXPECT_NO_THROW( - back_out = layers[idx]->backwarding_with_val(1, {back_out}, opt)[0]); - - EXPECT_NO_THROW(back_out = - layer.backwarding_with_val(1, {back_out}, opt)[0]); - matchOutput(*back_out.get(), file_dx); - - loadUpdatedWeightsGradients(file_uw, file_g); - matchUpdatedWeightsGradients(); - } - - void loadUpdatedWeightsGradients(const char *file_uw, const char *file_g) { - for (int idx = 0; idx < 2; ++idx) { - new_w.push_back( - nntrainer::Tensor(layer.weightAt(idx).getVariable().getDim())); - grad.push_back( - nntrainer::Tensor(layer.weightAt(idx).getGradient().getDim())); - } - - loadFile(file_uw, new_w); - loadFile(file_g, grad); - } - - virtual void prepareLayer() { - setInputDim("1:1:12"); - setBatch(3); - setProperty("unit=15"); - setProperty("bias_initializer=zeros"); - } - - void matchUpdatedWeightsGradients() { - std::vector params = layer.getWeights(); - - bool match_grads = true; - if (loss_type != nntrainer::LossType::LOSS_UNKNOWN) - match_grads = false; - - /** Match gradients and updated weights */ - for (int idx = 0; idx < 2; ++idx) { - if (match_grads) - matchOutput(params[idx].getGradient(), grad[idx]); - matchOutput(params[idx].getVariable(), new_w[idx]); - } - } - - sharedTensor label; - std::vector new_w; - std::vector grad; - std::vector> layers; - nntrainer::LossType loss_type = nntrainer::LossType::LOSS_UNKNOWN; -}; - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, - DISABLED_forwarding_backwarding_00_p) { - std::vector weight_data; - std::vector bias_data; - - setOptimizer(nntrainer::OptType::ADAM, "learning_rate=1.0"); - allocateMemory(); - - sharedConstTensor out; - - EXPECT_NO_THROW(out = layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - nntrainer::Tensor derivatives(3, 1, 1, 15); - - for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { - derivatives.getData()[i] = 1.0; - } - - nntrainer::Tensor result; - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); - - matchOutput(result, "tc_fc_1_goldenFCGradientAdam.out"); - - auto param_data = layer.getWeights(); - - nntrainer::Weight ¶m = param_data[0]; - nntrainer::Tensor weight = param.getVariable(); - matchOutput(weight, "tc_fc_1_goldenFCUpdatedWeightAdam.out"); - - nntrainer::Weight &bias_param = param_data[1]; - nntrainer::Tensor bias = bias_param.getVariable(); - matchOutput(bias, "tc_fc_1_goldenFCUpdatedBiasAdam.out"); -} - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, - forwarding_backwarding_loss_00_p) { - addLoss(nntrainer::LossType::LOSS_ENTROPY_SOFTMAX); - setOptimizer(nntrainer::OptType::ADAM, "learning_rate=0.0001"); - allocateMemory(); - - matchForwarding("tc_fc_1_goldenFCResultSoftmaxCrossAdam.out"); - - local_tolerance = 1.3e-4; - matchBackwarding("tc_fc_1_goldenFCGradientDxSoftmaxCrossAdam.out", - "tc_fc_1_goldenFCUpdatedWeightsSoftmaxCrossAdam.out", - "tc_fc_1_goldenFCGradientsSoftmaxCrossAdam.out", true); -} - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_01_p) { - - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding and backwarding without loss */ - matchForwarding("tc_fc_1_goldenFCResultActNone.out"); - - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxActNone.out", - "tc_fc_1_goldenFCUpdatedWeightsActNone.out", - "tc_fc_1_goldenFCGradientsActNone.out"); -} - -/** - * @brief Fully Connected Layer forward with MSE loss - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_02_p) { - - addActivation(nntrainer::ActivationType::ACT_SIGMOID); - addLoss(nntrainer::LossType::LOSS_MSE); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding value */ - matchForwarding("tc_fc_1_goldenFCResultSigmoidMse.out"); - - /** Verify loss value */ - matchLoss("tc_fc_1_goldenFCLossSigmoidMse.out"); - - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxSigmoid.out", - "tc_fc_1_goldenFCUpdatedWeightsSigmoid.out", - "tc_fc_1_goldenFCGradientsSigmoid.out"); -} - -/** - * @brief Fully Connected Layer forward with MSE loss - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_03_p) { - - addActivation(nntrainer::ActivationType::ACT_SOFTMAX); - addLoss(nntrainer::LossType::LOSS_MSE); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding value */ - matchForwarding("tc_fc_1_goldenFCResultSoftmaxMse.out"); - - /** Verify loss value */ - matchLoss("tc_fc_1_goldenFCLossSoftmaxMse.out"); - - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxSoftmax.out", - "tc_fc_1_goldenFCUpdatedWeightsSoftmax.out", - "tc_fc_1_goldenFCGradientsSoftmax.out"); -} - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_04_p) { - - addLoss(nntrainer::LossType::LOSS_MSE); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding value */ - matchForwarding("tc_fc_1_goldenFCResultActNone.out"); - matchOutput(*label, "tc_fc_1_FCLabel.in"); - - /** Verify loss value */ - matchLoss("tc_fc_1_goldenFCLossActNoneMse.out"); - - /** - * This lowers the tolerance for below check. As the data values are in the - * range [1, 10) (integer represented as floats), the values get very large - * which leads to higher values floating point error. - * This error exists in gradient. However, when added to weight with learning - * rate of 1.0, this error disappears. So, for now, local tolerance just for - * this test has been reduced to match the output. - * Note: this issue occurs only for a single value out of matrix of 180 - * elements - */ - local_tolerance = 1.3e-4; - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxActNoneMse.out", - "tc_fc_1_goldenFCUpdatedWeightsActNoneMse.out", - "tc_fc_1_goldenFCGradientsActNoneMse.out", true); -} - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_05_p) { - - addActivation(nntrainer::ActivationType::ACT_SIGMOID); - addLoss(nntrainer::LossType::LOSS_MSE); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding value */ - matchForwarding("tc_fc_1_goldenFCResultSigmoidMse.out"); - - /** Verify loss value */ - matchLoss("tc_fc_1_goldenFCLossSigmoidMse.out"); - - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxSigmoidMse.out", - "tc_fc_1_goldenFCUpdatedWeightsSigmoidMse.out", - "tc_fc_1_goldenFCGradientsSigmoidMse.out", true); -} - -/** - * @brief Fully Connected Layer - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_06_p) { - - addActivation(nntrainer::ActivationType::ACT_SOFTMAX); - addLoss(nntrainer::LossType::LOSS_MSE); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding value */ - matchForwarding("tc_fc_1_goldenFCResultSoftmaxMse.out"); - - /** Verify loss value */ - matchLoss("tc_fc_1_goldenFCLossSoftmaxMse.out"); - - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxSoftmaxMse.out", - "tc_fc_1_goldenFCUpdatedWeightsSoftmaxMse.out", - "tc_fc_1_goldenFCGradientsSoftmaxMse.out", true); -} - -/** - * @brief Fully Connected Layer forward with Cross Entropy loss - * @todo Upgrade this to adam to verify adam - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_07_p) { - - addLoss(nntrainer::LossType::LOSS_ENTROPY_SIGMOID); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding value */ - matchForwarding("tc_fc_1_goldenFCResultSigmoidCross.out"); - - /** Verify loss value */ - matchLoss("tc_fc_1_goldenFCLossSigmoidCross.out"); - - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxSigmoidCross.out", - "tc_fc_1_goldenFCUpdatedWeightsSigmoidCross.out", - "tc_fc_1_goldenFCGradientsSigmoidCross.out", true); -} - -/** - * @brief Fully Connected Layer forward with Cross Entropy loss - * @todo Upgrade this to adam to verify adam - */ -TEST_F(nntrainer_FullyConnectedLayer_TFmatch, forwarding_backwarding_08_p) { - - addLoss(nntrainer::LossType::LOSS_ENTROPY_SOFTMAX); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - /** Verify forwarding value */ - matchForwarding("tc_fc_1_goldenFCResultSoftmaxCross.out"); - - /** Verify loss value */ - matchLoss("tc_fc_1_goldenFCLossSoftmaxCross.out"); - - /** Verify backwarding without loss */ - matchBackwarding("tc_fc_1_goldenFCGradientDxSoftmaxCross.out", - "tc_fc_1_goldenFCUpdatedWeightsSoftmaxCross.out", - "tc_fc_1_goldenFCGradientsSoftmaxCross.out", true); -} - -/** - * @brief nntainer Batch Normalization Layer for test - */ -class nntrainer_BatchNormalizationLayer - : public nntrainer_abstractLayer { -protected: - typedef nntrainer_abstractLayer super; - - virtual int reinitialize() { - int status = super::reinitialize(); - - std::vector v; - - for (unsigned int i = 0; i < layer.getNumWeights(); ++i) { - v.push_back(layer.weightAt(i).getVariable()); - } - - loadFile("tc_bn_fc_1_BNLayerInput.in", in); - loadFile("tc_bn_fc_1_BNLayerWeights.in", v); - return status; - } - - virtual void prepareLayer() { - setProperty("input_shape=1:1:12 | epsilon=0.001 | momentum=0.90"); - setBatch(3); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1"); - } -}; - -/** - * @brief Batch Normalization Layer - */ -TEST_F(nntrainer_BatchNormalizationLayer, initialize_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Batch Normalization Layer - */ -TEST_F(nntrainer_BatchNormalizationLayer, setOptimizer_01_p) { - status = setOptimizer( - nntrainer::OptType::ADAM, - "learning_rate=0.001 | beta1=0.9 | beta2=0.9999 | epsilon=1e-7"); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Batch Normalization Layer - */ -TEST_F(nntrainer_BatchNormalizationLayer, setActivation_01_p) { - status = layer.setProperty({"activation=sigmoid"}); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Batch Normalization Layer - */ -TEST_F(nntrainer_BatchNormalizationLayer, setActivation_02_n) { - status = layer.setProperty({"activation=unknown"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -/** - * @brief Batch Normalization Layer - */ -TEST_F(nntrainer_BatchNormalizationLayer, checkValidation_01_p) { - status = layer.setProperty({"activation=relu"}); - EXPECT_EQ(status, ML_ERROR_NONE); - - status = layer.checkValidation(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_BatchNormalizationLayer, forward_backward_training_01_p) { - layer.setTrainable(true); - sharedConstTensor forward_result; - reinitialize(); - - allocateMemory(); - EXPECT_NO_THROW(forward_result = - layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - matchOutput(*forward_result, "tc_bn_fc_1_goldenBNResultForward.out"); - - nntrainer::Tensor backward_in(layer.getOutputDimension()[0]); - loadFile("tc_bn_fc_1_goldenBNLayerBackwardDxIn.out", backward_in); - - nntrainer::Tensor backward_result = - *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(backward_in)}, opt)[0]; - - local_tolerance = 1.3e-4; - matchOutput(backward_result, "tc_bn_fc_1_goldenBNLayerBackwardDx.out"); -} - -/** - * @brief nntainer Batch Normalization Layer for test - */ -class nntrainer_BatchNormalizationLayer_Conv - : public nntrainer_abstractLayer { -protected: - typedef nntrainer_abstractLayer super; - - virtual int reinitialize() { - int status = super::reinitialize(); - std::vector v; - for (unsigned int i = 0; i < layer.getNumWeights(); ++i) { - v.push_back(layer.weightAt(i).getVariable()); - } - loadFile("tc_bn_conv_1_BNLayerInput.in", in); - loadFile("tc_bn_conv_1_BNLayerWeights.in", v); - return status; - } - - virtual void prepareLayer() { - setProperty("input_shape=2:4:5 | epsilon=0.001 | momentum=0.90"); - setBatch(3); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1"); - } -}; - -TEST_F(nntrainer_BatchNormalizationLayer_Conv, forward_backward_training_01_p) { - layer.setTrainable(true); - sharedConstTensor forward_result; - reinitialize(); - allocateMemory(); - - EXPECT_NO_THROW(forward_result = - layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - matchOutput(*forward_result, "tc_bn_conv_1_goldenBNResultForward.out"); - - nntrainer::Tensor backward_in(layer.getOutputDimension()[0]); - loadFile("tc_bn_conv_1_goldenBNLayerBackwardDxIn.out", backward_in); - - nntrainer::Tensor backward_result = - *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(backward_in)}, opt)[0]; - - matchOutput(backward_result, "tc_bn_conv_1_goldenBNLayerBackwardDx.out"); -} - -/** - * @brief nntainer Batch Normalization Layer for test - */ -class nntrainer_BatchNormalizationLayer_Conv2 - : public nntrainer_abstractLayer { -protected: - typedef nntrainer_abstractLayer super; - - virtual int reinitialize() { - int status = super::reinitialize(); - - std::vector v; - for (unsigned int i = 0; i < layer.getNumWeights(); ++i) { - v.push_back(layer.weightAt(i).getVariable()); - } - - loadFile("tc_bn_conv_2_BNLayerInput.in", in); - loadFile("tc_bn_conv_2_BNLayerWeights.in", v); - return status; - } - - virtual void prepareLayer() { - setProperty("input_shape=2:4:5 | epsilon=0.001 | momentum=0.90"); - setBatch(1); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1"); - } -}; - -TEST_F(nntrainer_BatchNormalizationLayer_Conv2, - forward_backward_training_01_p) { - layer.setTrainable(true); - sharedConstTensor forward_result; - reinitialize(); - allocateMemory(); - - EXPECT_NO_THROW(forward_result = - layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - matchOutput(*forward_result, "tc_bn_conv_2_goldenBNResultForward.out"); - - nntrainer::Tensor backward_in(layer.getOutputDimension()[0]); - loadFile("tc_bn_conv_2_goldenBNLayerBackwardDxIn.out", backward_in); - - nntrainer::Tensor backward_result = - *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(backward_in)}, opt)[0]; - - matchOutput(backward_result, "tc_bn_conv_2_goldenBNLayerBackwardDx.out"); -} - -/** - * @brief nntainer Convolution Layer for test - */ -class nntrainer_Conv2DLayer - : public nntrainer_abstractLayer { - -protected: - typedef nntrainer_abstractLayer super; - - virtual void prepareLayer() { - int status = - setProperty("input_shape=3:28:28 |" - "bias_initializer=zeros |" - "activation=sigmoid |" - "weight_regularizer=l2norm |" - "weight_regularizer_constant= 0.005 |" - "weight_initializer=xavier_uniform |" - "filters=12 | kernel_size= 5,5 | stride=3,3 | padding=1,1"); - - EXPECT_EQ(status, ML_ERROR_NONE); - setBatch(32); - } - - nntrainer::Tensor result; -}; - -TEST_F(nntrainer_Conv2DLayer, print_01_p) { - std::stringstream ss, ss2; - layer.printPreset(ss, nntrainer::Layer::PrintPreset::PRINT_ALL); - ss2 << layer; - EXPECT_GT(ss.str().size(), 100u); - EXPECT_GT(ss2.str().size(), 100u); -} - -/** - * @brief Convolution 2D Layer - */ -TEST_F(nntrainer_Conv2DLayer, initialize_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Convolution 2D Layer save and read and save - */ -TEST_F(nntrainer_Conv2DLayer, save_read_01_p) { - allocateMemory(); - saveFile("save.bin", layer); - saveFile("save1.bin", layer); - - std::ifstream read_file("save.bin"); - ASSERT_TRUE(read_file.good()); - - std::ifstream read_file2("save1.bin"); - ASSERT_TRUE(read_file2.good()); - - float d1, d2; - - for (int i = 0; i < (5 * 5 * 3 * 12) + 12; ++i) { - read_file.read((char *)&d1, sizeof(float)); - read_file2.read((char *)&d2, sizeof(float)); - EXPECT_FLOAT_EQ(d1, d2); - } - - read_file.close(); - read_file2.close(); -} - -/** - * @brief Convolution 2D Layer - */ -TEST_F(nntrainer_Conv2DLayer, forwarding_01_p) { - reinitialize("input_shape=3:7:7 |" - "bias_initializer = zeros |" - "weight_initializer=xavier_uniform |" - "filters=2 | kernel_size=3,3 | stride=1, 1 | padding=0,0"); - allocateMemory(); - - ASSERT_EQ(in.getDim(), nntrainer::TensorDim(1, 3, 7, 7)); - ASSERT_EQ(out.getDim(), nntrainer::TensorDim(1, 2, 5, 5)); - - loadFile("tc_conv2d_1_conv2DLayer.in", in); - loadFile("tc_conv2d_1_conv2DKernel.in", layer); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - matchOutput(out, "tc_conv2d_1_goldenConv2DResult.out"); -} - -/** - * @brief Convolution 2D Layer - */ - -TEST_F(nntrainer_Conv2DLayer, forwarding_02_p) { - status = - reinitialize("input_shape=3:7:7 |" - "bias_initializer = zeros |" - "weight_initializer=xavier_uniform |" - "filters=3 | kernel_size=3,3 | stride=1, 1 | padding=0,0", - 2); - allocateMemory(); - - ASSERT_EQ(in.getDim(), nntrainer::TensorDim(2, 3, 7, 7)); - ASSERT_EQ(out.getDim(), nntrainer::TensorDim(2, 3, 5, 5)); - - loadFile("tc_conv2d_2_conv2DLayer.in", in); - loadFile("tc_conv2d_2_conv2DKernel.in", layer); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - matchOutput(out, "tc_conv2d_2_goldenConv2DResult.out"); -} - -TEST_F(nntrainer_Conv2DLayer, DISABLED_backwarding_01_p) { - status = reinitialize("input_shape=3:7:7 |" - "bias_initializer=zeros |" - "weight_initializer=xavier_uniform |" - "filters=2 |" - "kernel_size= 3,3 |" - "stride=1, 1 |" - "padding=0,0"); - - nntrainer::Tensor derivatives(1, 2, 5, 5); - - loadFile("tc_conv2d_1_conv2DLayer.in", in); - loadFile("tc_conv2d_1_conv2DKernel.in", layer); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { - derivatives.getData()[i] = 1.0; - } - - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); - - auto param_data = layer.getWeights(); - auto const &weight_grad = param_data[0].getGradient(); - auto const &bias_grad = param_data[1].getGradient(); - - matchOutput(weight_grad, "tc_conv2d_1_goldenKernelGrad.out"); - - matchOutput(result, "tc_conv2d_1_goldenInputGrad.out"); - - matchOutput(bias_grad, "tc_conv2d_1_goldenBiasGrad.out"); -} - -TEST_F(nntrainer_Conv2DLayer, DISABLED_backwarding_02_p) { - status = reinitialize("input_shape=3:7:7 |" - "bias_initializer=zeros |" - "weight_initializer=xavier_uniform |" - "filters=3 |" - "kernel_size= 3,3 |" - "stride=1, 1 |" - "padding=0,0", - 2); - - nntrainer::Tensor derivatives(2, 3, 5, 5); - - loadFile("tc_conv2d_2_conv2DLayer.in", in); - loadFile("tc_conv2d_2_conv2DKernel.in", layer); - - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { - derivatives.getData()[i] = 1.0; - } - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); - - auto param_data = layer.getWeights(); - auto const &weight_grad = param_data[0].getGradient(); - auto const &bias_grad = param_data[1].getGradient(); - - matchOutput(out, "tc_conv2d_2_goldenConv2DResult.out"); - matchOutput(weight_grad, "tc_conv2d_2_goldenKernelGrad.out"); - matchOutput(result, "tc_conv2d_2_goldenInputGrad.out"); - matchOutput(bias_grad, "tc_conv2d_2_goldenBiasGrad.out"); - - for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { - derivatives.getData()[i] = 1.0; - } - - for (int i = 0; i < 4; i++) { - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 0, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); - } - - /// @fixme: the output value of this test is around +/- 1.0e+07 which can't - // be compared with smaller tolerance - // for example, first value is -14422792, out value is -1.44228e+07 - // matchOutput(out, "tc_conv2d_2_goldenConv2DResult2.out"); - matchOutput(weight_grad, "tc_conv2d_2_goldenKernelGrad2.out"); - matchOutput(result, "tc_conv2d_2_goldenInputGrad2.out"); - matchOutput(bias_grad, "tc_conv2d_2_goldenBiasGrad2.out"); -} - -#ifdef USE_BLAS -// CONV2D TEST Cases is disabled. Instread of this, we could replace -// unitest_nntrainer_models -TEST_F(nntrainer_Conv2DLayer, DISABLED_backwarding_03_p) { - status = reinitialize("input_shape=3:28:28 |" - "bias_initializer=zeros |" - "weight_initializer=zeros |" - "filters=6 |" - "kernel_size= 5,5 |" - "stride=1, 1 |" - "padding=0, 0"); - - loadFile("tc_conv2d_int_conv2DLayer.in", in); - auto manager = nntrainer::Manager(); - manager.setInferenceInOutMemoryOptimization(false); - - manager.setGradientMemoryOptimization(false); - - nntrainer::Conv2DLayer layer1; - status = - layer1.setProperty({"input_shape=3:28:28", "bias_initializer=zeros", - "weight_initializer=zeros", "filters=6", - "kernel_size= 5,5", "stride=1, 1", "padding=0, 0"}); - EXPECT_EQ(status, ML_ERROR_NONE); - layer1.setBatch(1); - status = layer1.initialize(manager); - EXPECT_EQ(status, ML_ERROR_NONE); - - loadFile("tc_conv2d_int_conv2DKernel.in", layer1); - - std::shared_ptr op; - EXPECT_NO_THROW(op = nntrainer::createOptimizer(nntrainer::OptType::SGD)); - status = op->setProperty({"learning_rate=1.0"}); - EXPECT_EQ(status, ML_ERROR_NONE); - - nntrainer::Conv2DLayer layer2; - status = layer2.setProperty( - {"bias_initializer=zeros", "weight_initializer=zeros", "filters=12", - "kernel_size= 1,1", "stride=1, 1", "padding=0, 0"}); - EXPECT_EQ(status, ML_ERROR_NONE); - layer2.setBatch(1); - status = layer2.setProperty( - {"input_shape=" + getDimensionString(layer1.getOutputDimension()[0])}); - EXPECT_EQ(status, ML_ERROR_NONE); - status = layer2.initialize(manager); - EXPECT_EQ(status, ML_ERROR_NONE); - - loadFile("tc_conv2d_int_conv2DKernel2.in", layer2); - std::shared_ptr op2; - EXPECT_NO_THROW(op2 = nntrainer::createOptimizer(nntrainer::OptType::SGD)); - status = op2->setProperty({"learning_rate=1.0"}); - EXPECT_EQ(status, ML_ERROR_NONE); - - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - nntrainer::Tensor derivatives(1, 12, 24, 24); - - nntrainer::Tensor out1; - EXPECT_NO_THROW(out1 = - *layer1.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - nntrainer::Tensor out2; - - EXPECT_NO_THROW(out2 = - *layer2.forwarding_with_val({MAKE_SHARED_TENSOR(out1)})[0]); - - matchOutput(out1, "tc_conv2d_int_goldenConv2DResult.out"); - matchOutput(out2, "tc_conv2d_int_goldenConv2DResult2.out"); - - for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { - derivatives.getData()[i] = 1.0; - } - - nntrainer::Tensor result2; - EXPECT_NO_THROW(result2 = *layer2.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); - - EXPECT_NO_THROW(result = *layer1.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(result2)}, opt)[0]); - - /** Compare second conv */ - auto param_data = layer2.getWeights(); - auto const &weight_grad = param_data[0].getGradient(); - auto const &bias_grad = param_data[1].getGradient(); - - matchOutput(weight_grad, "tc_conv2d_int_goldenKernel2Grad.out"); - matchOutput(bias_grad, "tc_conv2d_int_goldenBias2Grad.out"); - - /** Compare first conv */ - param_data = layer1.getWeights(); - auto const &weight_grad2 = param_data[0].getGradient(); - auto const &bias_grad2 = param_data[1].getGradient(); - - matchOutput(weight_grad2, "tc_conv2d_int_goldenKernelGrad.out"); - matchOutput(bias_grad2, "tc_conv2d_int_goldenBiasGrad.out"); - - matchOutput(result, "tc_conv2d_int_goldenInputGrad.out"); -} -#endif - -TEST_F(nntrainer_Conv2DLayer, DISABLED_backwarding_04_p) { - status = reinitialize("input_shape=6:24:24 |" - "bias_initializer=zeros |" - "weight_initializer=xavier_uniform |" - "filters=12 |" - "kernel_size=5,5 |" - "stride=1,1 |" - "padding=0,0"); - - nntrainer::Tensor derivatives(1, 12, 20, 20); - - loadFile("tc_conv2d_3_conv2DLayer.in", in); - loadFile("tc_conv2d_3_conv2DKernel.in", layer); - - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - allocateMemory(); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { - derivatives.getData()[i] = 1.0; - } - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); - - auto param_data = layer.getWeights(); - auto const &weight_grad = param_data[0].getGradient(); - auto const &bias_grad = param_data[1].getGradient(); - - matchOutput(weight_grad, "tc_conv2d_3_goldenKernelGrad.out"); - - matchOutput(result, "tc_conv2d_3_goldenInputGrad.out"); - - matchOutput(bias_grad, "tc_conv2d_3_goldenBiasGrad.out"); -} - -/** - * @brief nntainer Pooling Layer for test - */ -class nntrainer_Pooling2DLayer - : public nntrainer_abstractLayer { -protected: - void matchData(float *golden) { - float *out_ptr; - - out_ptr = out.getData(); - - for (size_t i = 0; i < out.getDim().getDataLen(); ++i) { - EXPECT_NEAR(out_ptr[i], golden[i], local_tolerance); - } - } - - virtual void prepareLayer() { setInputDim("2:3:5:5"); } -}; - -TEST_F(nntrainer_Pooling2DLayer, setProperty_01_p) { - setInputDim("3:5:5"); - setBatch(2); - setProperty("pool_size=2,2 | stride=1,1 | padding=0,0 | pooling=average"); -} - -TEST_F(nntrainer_Pooling2DLayer, setProperty_02_n) { - setInputDim("3:5:5"); - setBatch(2); - int status = layer.setProperty({"pool_size="}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST_F(nntrainer_Pooling2DLayer, initialize_01_p) { reinitialize(); } - -TEST_F(nntrainer_Pooling2DLayer, forwarding_01_p) { - setInputDim("2:5:5"); - setProperty("pool_size=2,2 | stride=1,1 | padding=0,0 | pooling=max"); - - initialize(); - allocateMemory(); - - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - matchOutput(out, "tc_pooling2d_1_goldenPooling2Dmax.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, forwarding_02_p) { - setInputDim("2:5:5"); - setProperty("pool_size=2,2 | stride=1,1 | padding=0,0 | pooling=average"); - - initialize(); - allocateMemory(); - - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - matchOutput(out, "tc_pooling2d_1_goldenPooling2Daverage.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, forwarding_03_p) { - resetLayer(); - setInputDim("2:5:5"); - setProperty("pooling=global_max"); - initialize(); - allocateMemory(); - - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - matchOutput(out, "tc_pooling2d_1_goldenPooling2Dglobal_max.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, forwarding_04_p) { - resetLayer(); - setInputDim("2:5:5"); - setProperty("pooling=global_average"); - initialize(); - allocateMemory(); - - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - matchOutput(out, "tc_pooling2d_1_goldenPooling2Dglobal_average.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, forwarding_05_p) { - resetLayer(); - setInputDim("2:5:5"); - setBatch(2); - setProperty("pooling=global_max"); - initialize(); - allocateMemory(); - - loadFile("tc_pooling2d_2.in", in); - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - matchOutput(out, "tc_pooling2d_2_goldenPooling2Dglobal_max.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, forwarding_06_p) { - resetLayer(); - setInputDim("2:5:5"); - setBatch(2); - setProperty("pooling=global_average"); - initialize(); - allocateMemory(); - - loadFile("tc_pooling2d_2.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - matchOutput(out, "tc_pooling2d_2_goldenPooling2Dglobal_average.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, backwarding_01_p) { - resetLayer(); - setInputDim("2:5:5"); - setProperty("pool_size=2,2 | stride=1,1 | padding=0,0 | pooling=max"); - - initialize(); - allocateMemory(); - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - nntrainer::Tensor grad(out.getDim()); - - for (unsigned int i = 0; i < grad.size(); ++i) { - grad.getData()[i] = 1.0; - } - - EXPECT_NO_THROW( - in = *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(grad)}, opt)[0]); - - matchOutput(in, "tc_pooling2d_1_goldenPooling2DmaxGrad.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, backwarding_02_p) { - resetLayer(); - setInputDim("2:5:5"); - setProperty("pool_size=2,2 | stride=1,1 | padding=0,0 | pooling=average"); - initialize(); - allocateMemory(); - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - sharedTensor grad = MAKE_SHARED_TENSOR(out.getDim()); - - for (unsigned int i = 0; i < grad->size(); ++i) { - grad->getData()[i] = 1.0; - } - - EXPECT_NO_THROW(in = *layer.backwarding_with_val(1, {grad}, opt)[0]); - - matchOutput(in, "tc_pooling2d_1_goldenPooling2DaverageGrad.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, backwarding_03_p) { - resetLayer(); - setInputDim("2:5:5"); - setProperty("pooling=global_max"); - initialize(); - allocateMemory(); - - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - nntrainer::Tensor grad(out.getDim()); - - for (unsigned int i = 0; i < grad.getDim().getDataLen(); ++i) { - grad.getData()[i] = 1.0; - } - - EXPECT_NO_THROW( - in = *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(grad)}, opt)[0]); - - matchOutput(in, "tc_pooling2d_1_goldenPooling2Dglobal_maxGrad.out"); -} - -TEST_F(nntrainer_Pooling2DLayer, backwarding_04_p) { - setInputDim("2:5:5"); - setProperty("pooling=global_average"); - initialize(); - allocateMemory(); - loadFile("tc_pooling2d_1.in", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - nntrainer::Tensor grad(out.getDim()); - - for (unsigned int i = 0; i < grad.getDim().getDataLen(); ++i) { - grad.getData()[i] = 1.0; - } - - EXPECT_NO_THROW( - in = *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(grad)}, opt)[0]); - - matchOutput(in, "tc_pooling2d_1_goldenPooling2Dglobal_averageGrad.out"); -} - -/** - * @brief nntainer Flatten Layer for test - */ -class nntrainer_FlattenLayer - : public nntrainer_abstractLayer { -protected: - virtual void prepareLayer() { - setInputDim("2:4:4"); - setBatch(1); - } -}; - -/** - * @brief Flatten Layer - */ -TEST_F(nntrainer_FlattenLayer, forwarding_01_p) { - reinitialize(); - - EXPECT_EQ(out.getDim(), nntrainer::TensorDim(1, 1, 1, 32)); - - loadFile("tc_pooling2d_1_goldenPooling2Dmax.out", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - matchOutput(out, "tc_pooling2d_1_goldenPooling2Dmax.out"); -} - -/** - * @brief Flatten Layer - */ -TEST_F(nntrainer_FlattenLayer, forwarding_02_p) { - setInputDim("2:4:4"); - setBatch(2); - initialize(); - - EXPECT_EQ(out.getDim(), nntrainer::TensorDim(2, 1, 1, 32)); - - loadFile("tc_pooling2d_2_goldenPooling2Dmax.out", in); - - EXPECT_NO_THROW(out = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]); - - matchOutput(out, "tc_pooling2d_2_goldenPooling2Dmax.out"); -} - -/** - * @brief Flatten Layer - */ -TEST_F(nntrainer_FlattenLayer, backwarding_01_p) { - reinitialize(); - - EXPECT_EQ(out.getDim(), nntrainer::TensorDim(1, 1, 1, 32)); - - loadFile("tc_pooling2d_1_goldenPooling2Dmax.out", out); - - EXPECT_NO_THROW( - in = *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(out)}, opt)[0]); - EXPECT_EQ(in.getDim(), nntrainer::TensorDim(1, 2, 4, 4)); - - matchOutput(in, "tc_pooling2d_1_goldenPooling2Dmax.out"); -} - -/** - * @brief Flatten Layer - */ -TEST_F(nntrainer_FlattenLayer, backwarding_02_p) { - setInputDim("2:4:4"); - setBatch(2); - initialize(); - - EXPECT_EQ(out.getDim(), nntrainer::TensorDim(2, 1, 1, 32)); - - loadFile("tc_pooling2d_2_goldenPooling2Dmax.out", out); - - EXPECT_NO_THROW( - in = *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(out)}, opt)[0]); - EXPECT_EQ(in.getDim(), nntrainer::TensorDim(2, 2, 4, 4)); - - matchOutput(in, "tc_pooling2d_2_goldenPooling2Dmax.out"); -} - -/** - * @brief Loss Layer - */ -TEST(nntrainer_LossLayer, setLoss_01_p) { - int status = ML_ERROR_NONE; - nntrainer::LossLayer layer; - status = layer.setLoss(nntrainer::LossType::LOSS_ENTROPY); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -/** - * @brief Loss Layer - */ -TEST(nntrainer_LossLayer, setLoss_02_n) { - int status = ML_ERROR_NONE; - nntrainer::LossLayer layer; - status = layer.setLoss(nntrainer::LossType::LOSS_UNKNOWN); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST(nntrainer_LossLayer, forward_loss_unknown_n) { - nntrainer::LossLayer layer; - nntrainer::Tensor a = constant(1.0, 1, 1, 1, 1); - nntrainer::Tensor b = constant(1.0, 1, 1, 1, 1); - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(true); - manager.allocateTensors(); - EXPECT_THROW( - layer.forwarding_with_val({MAKE_SHARED_TENSOR(a)}, {MAKE_SHARED_TENSOR(b)}), - std::runtime_error); -} - -TEST(nntrainer_LossLayer, backward_loss_unknown_n) { - nntrainer::LossLayer layer; - nntrainer::Tensor a = constant(1.0, 1, 1, 1, 1); - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(true); - manager.allocateTensors(); - EXPECT_THROW(layer.backwarding_with_val({MAKE_SHARED_TENSOR(a)}), - std::runtime_error); -} - -TEST(nntrainer_LossLayer, forward_loss_forward_entropy_n) { - nntrainer::LossLayer layer; - layer.setLoss(nntrainer::LossType::LOSS_ENTROPY); - nntrainer::Tensor a = constant(1.0, 1, 1, 1, 1); - nntrainer::Tensor b = constant(1.0, 1, 1, 1, 1); - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(true); - manager.allocateTensors(); - EXPECT_THROW( - layer.forwarding_with_val({MAKE_SHARED_TENSOR(a)}, {MAKE_SHARED_TENSOR(b)}), - std::runtime_error); -} - -TEST(nntrainer_LossLayer, backward_loss_backward_entropy_n) { - nntrainer::LossLayer layer; - layer.setLoss(nntrainer::LossType::LOSS_ENTROPY); - nntrainer::Tensor a = constant(1.0, 1, 1, 1, 1); - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(true); - manager.allocateTensors(); - EXPECT_THROW(layer.backwarding_with_val({MAKE_SHARED_TENSOR(a)}), - std::runtime_error); -} - -/** - * @brief Loss Layer - */ -TEST(nntrainer_LossLayer, setProperty_through_vector_n) { - int status = ML_ERROR_NONE; - nntrainer::LossLayer layer; - status = layer.setProperty({"loss=cross"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST(nntrainer_LossLayer, setProperty_individual_01_n) { - nntrainer::LossLayer layer; - EXPECT_THROW( - layer.setProperty(nntrainer::Layer::PropertyType::filters, "1:2"), - nntrainer::exception::not_supported); -} - -TEST(nntrainer_LossLayer, setProperty_individual_02_n) { - nntrainer::LossLayer layer; - EXPECT_THROW(layer.setProperty(nntrainer::Layer::PropertyType::filters, - "invalid_string"), - nntrainer::exception::not_supported); -} - -TEST(nntrainer_ActivationLayer, init_02_p) { - nntrainer::Manager manager{true, false}; - manager.setInferenceInOutMemoryOptimization(false); - int status = ML_ERROR_NONE; - nntrainer::ActivationLayer layer; - - status = layer.setProperty({"input_shape=1:1:1:1"}); - EXPECT_EQ(status, ML_ERROR_NONE); - status = layer.initialize(manager); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST(nntrainer_ActivationLayer, setType_01_p) { - int status = ML_ERROR_NONE; - nntrainer::ActivationLayer layer; - - status = layer.setProperty({"activation=relu"}); - EXPECT_EQ(status, ML_ERROR_NONE); - status = layer.setProperty({"activation=softmax"}); - EXPECT_EQ(status, ML_ERROR_NONE); - status = layer.setProperty({"activation=sigmoid"}); - EXPECT_EQ(status, ML_ERROR_NONE); - status = layer.setProperty({"activation=tanh"}); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST(nntrainer_ActivationLayer, setType_02_n) { - int status = ML_ERROR_NONE; - nntrainer::ActivationLayer layer; - - status = layer.setProperty({"activation=random"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); - status = layer.setProperty({"activation=unknown"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST(nntrainer_ActivationLayer, forward_backward_01_p) { - int batch = 3; - int channel = 1; - int height = 1; - int width = 10; - - nntrainer::ActivationLayer layer(nntrainer::ActivationType::ACT_RELU); - - nntrainer::Tensor input(batch, channel, height, width); - GEN_TEST_INPUT(input, (l - 4) * 0.1 * (i + 1)); - nntrainer::Tensor expected(batch, channel, height, width); - GEN_TEST_INPUT(expected, nntrainer::ActiFunc::relu((l - 4) * 0.1 * (i + 1))); - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - manager.setInPlaceActivationOptimization(true); - - layer.setProperty({"input_shape=3:1:1:10"}); - layer.setBatch(3); - layer.initialize(manager); - - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - manager.initializeTensors(true); - manager.allocateTensors(); - - nntrainer::Tensor result; - EXPECT_NO_THROW(result = - *layer.forwarding_with_val({MAKE_SHARED_TENSOR(input)})[0]); - EXPECT_TRUE(result == expected); - - expected.copy(input); - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(constant(1.0, 3, 1, 1, 10))})[0]); - GEN_TEST_INPUT(expected, - nntrainer::ActiFunc::reluPrime( - nntrainer::ActiFunc::relu((l - 4) * 0.1 * (i + 1)))); - EXPECT_TRUE(result == expected); -} - -/** - * @brief Addition Layer - */ -class nntrainer_AdditionLayer - : public nntrainer_abstractLayer { -protected: - virtual void prepareLayer() { - setInputDim("3:28:28"); - setBatch(32); - } -}; - -TEST_F(nntrainer_AdditionLayer, initialize_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_AdditionLayer, initialize_02_p) { - nntrainer::AdditionLayer layer; - layer.setProperty({"input_shape=1:1:1:1"}); - status = layer.initialize(manager); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_AdditionLayer, checkValidation_01_p) { - status = layer.checkValidation(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -// Disabled until input_layer keyward is enabled. -TEST_F(nntrainer_AdditionLayer, DISABLED_forwarding_02_n) { - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - nntrainer::Tensor &in = *input; - - in = nntrainer::Tensor(layer.getInputDimension()[0]); - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(true); - manager.allocateTensors(); - - EXPECT_THROW(layer.forwarding_with_val({input}), std::runtime_error); -} - -TEST_F(nntrainer_AdditionLayer, DISABLED_forwarding_03_p) { - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[2], std::default_delete()); - nntrainer::Tensor &in = *input; - in = nntrainer::Tensor(layer.getInputDimension()[0]); - - input.get()[1] = *input; - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - EXPECT_NO_THROW(layer.forwarding_with_val({input})); -} - -/** - * @brief nntainer Embedding Layer for test - */ -class nntrainer_EmbeddingLayer - : public nntrainer_abstractLayer { - -protected: - typedef nntrainer_abstractLayer super; - - virtual void prepareLayer() { - int status = setProperty("in_dim=50 |" - "out_dim=8"); - EXPECT_EQ(status, ML_ERROR_NONE); - setBatch(3); - } - - nntrainer::Tensor result; -}; - -TEST_F(nntrainer_EmbeddingLayer, initialize_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_EmbeddingLayer, forwarding_01_p) { - float sentence[36] = {45, 16, 32, 27, 34, 33, 0, 0, 0, 0, 0, 0, - 24, 2, 27, 34, 33, 37, 32, 27, 3, 0, 0, 0, - 22, 27, 16, 28, 35, 33, 7, 2, 2, 3, 33, 35}; - - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - - nntrainer::Tensor &in = *input; - - in = nntrainer::Tensor(nntrainer::TensorDim(3, 1, 1, 12), sentence); - - nntrainer::Manager manager; - - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(false); - manager.allocateTensors(); - - EXPECT_NO_THROW(layer.forwarding_with_val({input})); -} - -TEST_F(nntrainer_EmbeddingLayer, DISABLED_forwarding_02_p) { - - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - - nntrainer::Tensor &in = *input; - - in = nntrainer::Tensor(nntrainer::TensorDim(3, 1, 1, 12)); - - loadFile("tc_embedding_01_Input.in", in); - - nntrainer::Manager manager; - - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(false); - manager.allocateTensors(); - - EXPECT_NO_THROW(out = *layer.forwarding_with_val({input})[0]); - - matchOutput(out, "tc_embedding_01_golden.out"); -} - -TEST_F(nntrainer_EmbeddingLayer, forwarding_backwarding_01_p) { - float sentence[36] = {45, 16, 32, 27, 34, 33, 0, 0, 0, 0, 0, 0, - 24, 2, 27, 34, 33, 37, 32, 27, 3, 0, 0, 0, - 22, 27, 16, 28, 35, 33, 7, 2, 2, 3, 33, 35}; - - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - - nntrainer::Tensor &in = *input; - - in = nntrainer::Tensor(nntrainer::TensorDim(3, 1, 1, 12), sentence); - - nntrainer::Manager manager; - - manager.setInferenceInOutMemoryOptimization(false); - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - - manager.initializeTensors(true); - manager.allocateTensors(); - - EXPECT_NO_THROW(layer.forwarding_with_val({input})); - - nntrainer::Tensor derivatives(3, 1, 12, 8); - - for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { - derivatives.getData()[i] = 1.0; - } - - setOptimizer(nntrainer::OptType::ADAM, "learning_rate=1.0"); - - allocateMemory(); - - nntrainer::Tensor result; - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); -} - -/** - * @brief nntainer RNN Layer for test - */ -class nntrainer_RNNLayer : public nntrainer_abstractLayer { - -protected: - typedef nntrainer_abstractLayer super; - - virtual void prepareLayer() { - int status = setProperty("unit=3 | weight_initializer=ones"); - EXPECT_EQ(status, ML_ERROR_NONE); - setInputDim("2:1:3:3"); - setBatch(2); - } - - nntrainer::Tensor result; -}; - -TEST_F(nntrainer_RNNLayer, initialize_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_RNNLayer, forwarding_01_p) { - - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); - float data[18] = {1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8}; - - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - nntrainer::Tensor &in = *input; - in = nntrainer::Tensor(nntrainer::TensorDim(2, 1, 3, 3), data); - allocateMemory(); - EXPECT_NO_THROW(layer.forwarding_with_val({input}, {}, false)); -} - -TEST_F(nntrainer_RNNLayer, backwarding_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); - float data[18] = {1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8}; - - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - nntrainer::Tensor &in = *input; - in = nntrainer::Tensor(nntrainer::TensorDim(2, 1, 3, 3), data); - allocateMemory(); - EXPECT_NO_THROW(layer.forwarding_with_val({input}, {}, false)); - - nntrainer::Tensor derivatives(2, 1, 3, 3); - derivatives.setValue(1.0); - - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - - nntrainer::Tensor result; - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); -} - -/** - * @brief nntainer LSTM Layer for test - */ -class nntrainer_LSTMLayer - : public nntrainer_abstractLayer { - -protected: - typedef nntrainer_abstractLayer super; - - virtual void prepareLayer() { - int status = - setProperty("unit=3 | activation=sigmoid | recurrent_activation = tanh"); - EXPECT_EQ(status, ML_ERROR_NONE); - setInputDim("2:1:3:3"); - setBatch(2); - } - - nntrainer::Tensor result; -}; - -TEST_F(nntrainer_LSTMLayer, initialize_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_LSTMLayer, forwarding_01_p) { - - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); - float data[18] = {1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8}; - - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - nntrainer::Tensor &in = *input; - in = nntrainer::Tensor(nntrainer::TensorDim(2, 1, 3, 3), data); - allocateMemory(); - EXPECT_NO_THROW(layer.forwarding_with_val({input}, {}, false)); -} - -TEST_F(nntrainer_LSTMLayer, backwarding_01_p) { - - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); - float data[18] = {1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7, 6, 7, 8}; - - sharedTensor input = std::shared_ptr( - new nntrainer::Tensor[1], std::default_delete()); - nntrainer::Tensor &in = *input; - in = nntrainer::Tensor(nntrainer::TensorDim(2, 1, 3, 3), data); - allocateMemory(); - EXPECT_NO_THROW(layer.forwarding_with_val({input}, {}, false)); - - nntrainer::Tensor derivatives(2, 1, 3, 3); - derivatives.setValue(1.0); - - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - nntrainer::Tensor result; - - EXPECT_NO_THROW(result = *layer.backwarding_with_val( - 1, {MAKE_SHARED_TENSOR(derivatives)}, opt)[0]); -} - -/** - * @brief nntainer split Layer for test - */ -class nntrainer_SplitLayer - : public nntrainer_abstractLayer { - -protected: - typedef nntrainer_abstractLayer super; - - virtual void prepareLayer() { - int status = setProperty("input_shape=9:8:7:6"); - EXPECT_EQ(status, ML_ERROR_NONE); - } - - nntrainer::Tensor result; -}; - -/** - * @brief Split Layer - */ -TEST_F(nntrainer_SplitLayer, init_01_p) { - nntrainer::TensorDim out_dim_expect; - layer.setBatch(9); - - for (unsigned int idx = 1; idx < nntrainer::MAXDIM; idx++) { - std::stringstream ss; - ss << "axis=" << idx; - EXPECT_EQ(ML_ERROR_NONE, layer.setProperty({ss.str()})); - ss.clear(); - layer.initialize(manager); - - auto in_dim = layer.getInputDimension(); - auto out_dim = layer.getOutputDimension(); - - unsigned int val_at_split_dim = in_dim[0].getTensorDim(idx); - EXPECT_EQ(out_dim.size(), val_at_split_dim); - - out_dim_expect = in_dim[0]; - out_dim_expect.setTensorDim(idx, 1); - - for (auto const &out_d : out_dim) { - EXPECT_EQ(out_dim_expect, out_d); - } - } -} - -/** - * @brief Split Layer - */ -TEST_F(nntrainer_SplitLayer, init_02_n) { - nntrainer::TensorDim out_dim_expect; - layer.setBatch(9); - layer.setProperty({"axis=0"}); - EXPECT_EQ(ML_ERROR_INVALID_PARAMETER, layer.initialize(manager)); -} - -/** - * @brief Split Layer - */ -TEST_F(nntrainer_SplitLayer, init_03_n) { - nntrainer::TensorDim out_dim_expect; - layer.setBatch(9); - layer.setProperty({"axis=5"}); - EXPECT_EQ(ML_ERROR_INVALID_PARAMETER, layer.initialize(manager)); - layer.setProperty({"axis=8"}); - EXPECT_EQ(ML_ERROR_INVALID_PARAMETER, layer.initialize(manager)); -} - -/** - * @brief Split + Concat Layer - */ -TEST_F(nntrainer_SplitLayer, forwarding_backwarding_01_p) { - nntrainer::ConcatLayer concat; - nntrainer::TensorDim out_dim_expect; - layer.setBatch(9); - concat.setBatch(9); - - /// enable till nntrainer::MAXDIM once #1227 is resolved - for (unsigned int idx = 1; idx < 2; idx++) { - std::stringstream ss; - ss << "num_inputs=" << idx; - EXPECT_EQ(ML_ERROR_NONE, concat.setProperty({ss.str()})); - ss.str(std::string()); - - ss << "axis=" << idx; - layer.setProperty({ss.str()}); - EXPECT_EQ(ML_ERROR_NONE, layer.setProperty({ss.str()})); - - auto in_dim = layer.getInputDimension(); - auto out_dim = layer.getOutputDimension(); - unsigned int val_at_split_dim = in_dim[0].getTensorDim(idx); - out_dim_expect = in_dim[0]; - out_dim_expect.setTensorDim(idx, 1); - - for (unsigned int ni = 0; ni < val_at_split_dim; ni++) - concat.setInputDimension( - std::vector(val_at_split_dim, out_dim_expect)); - - nntrainer::Manager manager; - manager.setInferenceInOutMemoryOptimization(false); - - layer.initialize(manager); - concat.initialize(manager); - - layer.setInputBuffers(manager.trackLayerInputs( - layer.getType(), layer.getName(), layer.getInputDimension())); - layer.setOutputBuffers(manager.trackLayerOutputs( - layer.getType(), layer.getName(), layer.getOutputDimension())); - concat.setInputBuffers(layer.getOutputRef()); - concat.setOutputBuffers(manager.trackLayerOutputs( - concat.getType(), concat.getName(), concat.getOutputDimension())); - - manager.initializeTensors(true); - manager.allocateTensors(); - - nntrainer::Tensor input(in_dim[0]); - nntrainer::Tensor derivative(in_dim[0]); - input.setRandUniform(); - derivative.setRandUniform(); - - auto split_outs = layer.forwarding_with_val({MAKE_SHARED_TENSOR(input)}); - auto joined_inputs = concat.forwarding_with_val(split_outs); - - EXPECT_EQ(input, *joined_inputs[0].get()); - - auto split_derv = - concat.backwarding_with_val({MAKE_SHARED_TENSOR(derivative)}); - auto joined_deriv = layer.backwarding_with_val(split_derv); - - EXPECT_EQ(*joined_deriv[0].get(), derivative); - } -} - -/** - * @brief nntainer PermuteLayer test - */ -class nntrainer_PermuteLayer - : public nntrainer_abstractLayer { - -protected: - typedef nntrainer_abstractLayer super; - - virtual void prepareLayer() { - int status = setProperty("direction=3,2,1"); - EXPECT_EQ(status, ML_ERROR_NONE); - setInputDim("2:4:5"); - setBatch(3); - } - - nntrainer::Tensor result; -}; - -TEST_F(nntrainer_PermuteLayer, initialize_01_p) { - status = reinitialize(); - EXPECT_EQ(status, ML_ERROR_NONE); -} - -TEST_F(nntrainer_PermuteLayer, setPropertyDirectionInvalidSeperator_01_n) { - status = layer.setProperty({"direction=3|1|2"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST_F(nntrainer_PermuteLayer, setPropertyDirectionInvalidSeperator_02_n) { - status = layer.setProperty({"direction=3:1:2"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST_F(nntrainer_PermuteLayer, setPropertyTooManyDimension_01_n) { - status = layer.setProperty({"direction=1,2,3,0"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST_F(nntrainer_PermuteLayer, setPropertyAxisMoreThanFour_n) { - status = layer.setProperty({"direction=1,2,4"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST_F(nntrainer_PermuteLayer, setPropertyInvalidString_n) { - status = layer.setProperty({"direction=random_string"}); - EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); -} - -TEST_F(nntrainer_PermuteLayer, forwardBackward_p) { - - nntrainer::Tensor in = ranged(3, 2, 4, 5); - allocateMemory(); - out = *layer.forwarding_with_val({MAKE_SHARED_TENSOR(in)})[0]; - - float answer_data[] = { - 0, 20, 5, 25, 10, 30, 15, 35, 1, 21, 6, 26, 11, 31, 16, - 36, 2, 22, 7, 27, 12, 32, 17, 37, 3, 23, 8, 28, 13, 33, - 18, 38, 4, 24, 9, 29, 14, 34, 19, 39, 40, 60, 45, 65, 50, - 70, 55, 75, 41, 61, 46, 66, 51, 71, 56, 76, 42, 62, 47, 67, - 52, 72, 57, 77, 43, 63, 48, 68, 53, 73, 58, 78, 44, 64, 49, - 69, 54, 74, 59, 79, 80, 100, 85, 105, 90, 110, 95, 115, 81, 101, - 86, 106, 91, 111, 96, 116, 82, 102, 87, 107, 92, 112, 97, 117, 83, - 103, 88, 108, 93, 113, 98, 118, 84, 104, 89, 109, 94, 114, 99, 119}; - nntrainer::Tensor answer({3, 5, 4, 2}, answer_data); - EXPECT_EQ(answer, out); - - nntrainer::Tensor in2 = - *layer.backwarding_with_val(1, {MAKE_SHARED_TENSOR(out)}, opt)[0]; - - /// @note forwarding -> backwarding -> forwarding has the exact same value - EXPECT_EQ(in2, in); -} - -/** - * @brief Main gtest - */ -int main(int argc, char **argv) { - int result = -1; - - try { - testing::InitGoogleTest(&argc, argv); - } catch (...) { - std::cerr << "Error duing IniGoogleTest" << std::endl; - return 0; - } - - try { - result = RUN_ALL_TESTS(); - } catch (...) { - std::cerr << "Error duing RUN_ALL_TSETS()" << std::endl; - } - - return result; -} -- 2.7.4