From 1812868fdf0ff0a2fbace4f2a12514f3a1a22d10 Mon Sep 17 00:00:00 2001 From: Jihoon Lee Date: Fri, 6 Nov 2020 14:55:36 +0900 Subject: [PATCH] [Fix] Throw when read/save fails Currently, read save didn't throw when failing on those operation. From this patch, if an object fails to read, it throws an exception to preven false positive on test result **Self evaluation:** 1. Build test: [X]Passed [ ]Failed [ ]Skipped 2. Run test: [X]Passed [ ]Failed [ ]Skipped Signed-off-by: Jihoon Lee --- .../ReinforcementLearning/DeepQ/jni/DeepQ.ini | 2 +- .../CIFAR_Classification/res/Classification.ini | 2 +- .../res/Classification_func.ini | 2 +- .../res/Classification_new.ini | 2 +- .../Draw_Classification/jni/main.cpp | 6 ++ .../Draw_Classification/jni/meson.build | 2 +- .../Draw_Classification/res/Training.ini | 2 +- nntrainer/layers/conv2d_layer.cpp | 4 -- nntrainer/layers/conv2d_layer.h | 12 ---- nntrainer/layers/fc_layer.cpp | 12 ---- nntrainer/layers/fc_layer.h | 12 ---- nntrainer/layers/layer.cpp | 6 +- nntrainer/models/neuralnet.cpp | 26 ++++++-- nntrainer/optimizers/adam.cpp | 4 +- nntrainer/optimizers/optimizer.cpp | 8 ++- nntrainer/tensor/tensor.cpp | 6 +- nntrainer/utils/util_func.cpp | 21 +++++++ nntrainer/utils/util_func.h | 27 +++++++++ packaging/nntrainer.spec | 6 +- test/test_models/models/model.bin | Bin 31044 -> 46796 bytes test/unittest/unittest_nntrainer_layers.cpp | 67 +++++++++++++++------ test/unittest/unittest_util_func.cpp | 14 +++++ 22 files changed, 163 insertions(+), 80 deletions(-) diff --git a/Applications/ReinforcementLearning/DeepQ/jni/DeepQ.ini b/Applications/ReinforcementLearning/DeepQ/jni/DeepQ.ini index 524e238..566b17f 100644 --- a/Applications/ReinforcementLearning/DeepQ/jni/DeepQ.ini +++ b/Applications/ReinforcementLearning/DeepQ/jni/DeepQ.ini @@ -8,7 +8,7 @@ Optimizer = adam # Optimizer : sgd (stochastic gradien decent), Loss = mse # Loss function : mse (mean squared error) # cross (cross entropy) -Save_Path = "model.bin" # model path to save / read +Save_Path = "model_deepq.bin" # model path to save / read batch_size = 32 # batch size beta1 = 0.9 # beta 1 for adam beta2 = 0.9999 # beta 2 for adam diff --git a/Applications/TransferLearning/CIFAR_Classification/res/Classification.ini b/Applications/TransferLearning/CIFAR_Classification/res/Classification.ini index 83f897d..f91ff13 100644 --- a/Applications/TransferLearning/CIFAR_Classification/res/Classification.ini +++ b/Applications/TransferLearning/CIFAR_Classification/res/Classification.ini @@ -9,7 +9,7 @@ Optimizer = adam # Optimizer : sgd (stochastic gradien decent), # adam (Adamtive Moment Estimation) Loss = cross # Loss function : mse (mean squared error) # cross (cross entropy) -Save_Path = "model.bin" # model path to save / read +Save_Path = "model_cls.bin" # model path to save / read batch_size = 32 # batch size beta1 = 0.9 # beta 1 for adam beta2 = 0.9999 # beta 2 for adam diff --git a/Applications/TransferLearning/CIFAR_Classification/res/Classification_func.ini b/Applications/TransferLearning/CIFAR_Classification/res/Classification_func.ini index 8a67456..ae1e9a2 100644 --- a/Applications/TransferLearning/CIFAR_Classification/res/Classification_func.ini +++ b/Applications/TransferLearning/CIFAR_Classification/res/Classification_func.ini @@ -9,7 +9,7 @@ Optimizer = adam # Optimizer : sgd (stochastic gradien decent), # adam (Adamtive Moment Estimation) Loss = cross # Loss function : mse (mean squared error) # cross (cross entropy) -Save_Path = "model.bin" # model path to save / read +Save_Path = "model_cls_func.bin" # model path to save / read batch_size = 32 # batch size beta1 = 0.9 # beta 1 for adam beta2 = 0.9999 # beta 2 for adam diff --git a/Applications/TransferLearning/CIFAR_Classification/res/Classification_new.ini b/Applications/TransferLearning/CIFAR_Classification/res/Classification_new.ini index d1cd3bb..8b4eda3 100644 --- a/Applications/TransferLearning/CIFAR_Classification/res/Classification_new.ini +++ b/Applications/TransferLearning/CIFAR_Classification/res/Classification_new.ini @@ -10,7 +10,7 @@ Optimizer = sgd # Optimizer : sgd (stochastic gradien decent), Activation = sigmoid # activation : sigmoid, tanh Loss = cross # Loss function : mse (mean squared error) # cross (cross entropy) -Save_Path = "model.bin" # model path to save / read +Save_Path = "model_cls_new.bin" # model path to save / read batch_size = 32 # batch size beta1 = 0.9 # beta 1 for adam beta2 = 0.9999 # beta 2 for adam diff --git a/Applications/TransferLearning/Draw_Classification/jni/main.cpp b/Applications/TransferLearning/Draw_Classification/jni/main.cpp index dcc536a..9ab44e4 100644 --- a/Applications/TransferLearning/Draw_Classification/jni/main.cpp +++ b/Applications/TransferLearning/Draw_Classification/jni/main.cpp @@ -420,6 +420,12 @@ int main(int argc, char *argv[]) { /** location of resources ( ../../res/ ) */ std::string data_path = args[1]; + /// @todo #716 and discard this + if (chdir(data_path.c_str()) < 0) { + std::cout << "changing directory to data path failed\n"; + return 1; + } + srand(time(NULL)); /** Load input images */ diff --git a/Applications/TransferLearning/Draw_Classification/jni/meson.build b/Applications/TransferLearning/Draw_Classification/jni/meson.build index bfc2427..9c22801 100644 --- a/Applications/TransferLearning/Draw_Classification/jni/meson.build +++ b/Applications/TransferLearning/Draw_Classification/jni/meson.build @@ -25,4 +25,4 @@ e = executable('nntrainer_training', install_dir: application_install_dir ) -test('app_training', e, args: [join_paths(res_path, 'Training.ini'), res_path], timeout: 60) +test('app_training', e, args: [res_path / 'Training.ini', res_path], timeout: 60) diff --git a/Applications/TransferLearning/Draw_Classification/res/Training.ini b/Applications/TransferLearning/Draw_Classification/res/Training.ini index 8fd5fed..5936c9d 100644 --- a/Applications/TransferLearning/Draw_Classification/res/Training.ini +++ b/Applications/TransferLearning/Draw_Classification/res/Training.ini @@ -8,7 +8,7 @@ Optimizer = sgd # Optimizer : sgd (stochastic gradien decent), # adam (Adamtive Moment Estimation) Loss = cross # Loss function : mse (mean squared error) # cross (cross entropy) -Save_Path = "model.bin" # model path to save / read +Save_Path = "model_draw_cls.bin" # model path to save / read batch_size = 1 # batch size [MobilenetV2Backbone] diff --git a/nntrainer/layers/conv2d_layer.cpp b/nntrainer/layers/conv2d_layer.cpp index a29f09d..312dc62 100644 --- a/nntrainer/layers/conv2d_layer.cpp +++ b/nntrainer/layers/conv2d_layer.cpp @@ -68,10 +68,6 @@ int Conv2DLayer::initialize() { return status; } -void Conv2DLayer::read(std::ifstream &file) { Layer::read(file); } - -void Conv2DLayer::save(std::ofstream &file) { Layer::save(file); } - sharedConstTensors Conv2DLayer::forwarding(sharedConstTensors in) { int status = ML_ERROR_NONE; diff --git a/nntrainer/layers/conv2d_layer.h b/nntrainer/layers/conv2d_layer.h index 8efdd4f..7f21bc9 100644 --- a/nntrainer/layers/conv2d_layer.h +++ b/nntrainer/layers/conv2d_layer.h @@ -71,18 +71,6 @@ public: int initialize(); /** - * @brief Read Weight & Bias Data from file - * @param[in] file input stream file - */ - void read(std::ifstream &file); - - /** - * @brief Save Weight & Bias Data to file - * @param[in] file output stream file - */ - void save(std::ofstream &file); - - /** * @copydoc Layer::forwarding(sharedConstTensors in) */ sharedConstTensors forwarding(sharedConstTensors in); diff --git a/nntrainer/layers/fc_layer.cpp b/nntrainer/layers/fc_layer.cpp index e194980..6b8bc72 100644 --- a/nntrainer/layers/fc_layer.cpp +++ b/nntrainer/layers/fc_layer.cpp @@ -90,18 +90,6 @@ sharedConstTensors FullyConnectedLayer::forwarding(sharedConstTensors in) { return {MAKE_SHARED_TENSOR(hidden)}; } -void FullyConnectedLayer::read(std::ifstream &file) { - Layer::read(file); - if (opt) - opt->read(file); -} - -void FullyConnectedLayer::save(std::ofstream &file) { - Layer::save(file); - if (opt) - opt->save(file); -} - void FullyConnectedLayer::copy(std::shared_ptr l) { Layer::copy(l); diff --git a/nntrainer/layers/fc_layer.h b/nntrainer/layers/fc_layer.h index f20e109..ac22deb 100644 --- a/nntrainer/layers/fc_layer.h +++ b/nntrainer/layers/fc_layer.h @@ -52,18 +52,6 @@ public: FullyConnectedLayer &operator=(FullyConnectedLayer &&rhs) = default; /** - * @brief Read Weight & Bias Data from file - * @param[in] file input stream file - */ - void read(std::ifstream &file); - - /** - * @brief Save Weight & Bias Data to file - * @param[in] file output stream file - */ - void save(std::ofstream &file); - - /** * @copydoc Layer::forwarding(sharedConstTensors in) */ sharedConstTensors forwarding(sharedConstTensors in); diff --git a/nntrainer/layers/layer.cpp b/nntrainer/layers/layer.cpp index 95eaa25..3623bab 100644 --- a/nntrainer/layers/layer.cpp +++ b/nntrainer/layers/layer.cpp @@ -38,7 +38,7 @@ void Layer::setActivation(ActivationType acti) { } int Layer::setOptimizer(std::shared_ptr opt) { - this->opt = createOptimizer(opt->getType(), *opt.get()); + this->opt = createOptimizer(opt->getType(), *opt); return this->opt->initialize(weight_list, num_weights, true); } @@ -93,12 +93,16 @@ void Layer::read(std::ifstream &file) { for (unsigned int i = 0; i < num_weights; ++i) { weightAt(i).getVariableRef().read(file); } + if (opt) + opt->read(file); } void Layer::save(std::ofstream &file) { for (unsigned int i = 0; i < num_weights; ++i) { weightAt(i).getVariableRef().save(file); } + if (opt) + opt->save(file); } int Layer::setProperty(std::vector values) { diff --git a/nntrainer/models/neuralnet.cpp b/nntrainer/models/neuralnet.cpp index 484c400..d8391b5 100644 --- a/nntrainer/models/neuralnet.cpp +++ b/nntrainer/models/neuralnet.cpp @@ -342,7 +342,12 @@ NeuralNetwork &NeuralNetwork::copy(NeuralNetwork &from) { * save training parameters from the optimizer */ void NeuralNetwork::saveModel() { + if (save_path == std::string()) { + return; + } + std::ofstream model_file(save_path, std::ios::out | std::ios::binary); + for (unsigned int i = 0; i < layers.size(); i++) layers[i]->save(model_file); model_file.write((char *)&epoch_idx, sizeof(epoch_idx)); @@ -358,15 +363,21 @@ void NeuralNetwork::saveModel() { void NeuralNetwork::readModel() { if (!isFileExist(save_path)) return; + + NeuralNetwork tmp(*this); + std::ifstream model_file(save_path, std::ios::in | std::ios::binary); for (unsigned int i = 0; i < layers.size(); i++) - layers[i]->read(model_file); - if (continue_train) { - model_file.read((char *)&epoch_idx, sizeof(epoch_idx)); - model_file.read((char *)&iter, sizeof(iter)); - } + tmp.layers[i]->read(model_file); + checkedRead(model_file, (char *)&tmp.epoch_idx, sizeof(epoch_idx), + "[NeuralNetwork::readModel] failed to read epoch_idx"); + checkedRead(model_file, (char *)&tmp.iter, sizeof(iter), + "[NeuralNetwork::readModel] failed to read iteration"); + model_file.close(); ml_logi("read modelfile: %s", save_path.c_str()); + + swap(tmp, *this); } void NeuralNetwork::setBatchSize(unsigned int batch) { @@ -433,6 +444,11 @@ int NeuralNetwork::train(std::vector values) { int NeuralNetwork::train_run() { int status = ML_ERROR_NONE; + if (!continue_train) { + epoch_idx = 0; + iter = 0; + } + for (epoch_idx = epoch_idx + 1; epoch_idx <= epochs; ++epoch_idx) { training.loss = 0.0f; status = data_buffer->run(nntrainer::BufferType::BUF_TRAIN); diff --git a/nntrainer/optimizers/adam.cpp b/nntrainer/optimizers/adam.cpp index a95252e..f460c34 100644 --- a/nntrainer/optimizers/adam.cpp +++ b/nntrainer/optimizers/adam.cpp @@ -122,8 +122,10 @@ void Adam::setProperty(const PropertyType type, const std::string &value) { } void Adam::read(std::ifstream &file) { + /// @todo need strong exception safety guarantee OptType loaded_type; - file.read((char *)&loaded_type, sizeof(OptType)); + checkedRead(file, (char *)&loaded_type, sizeof(OptType), + "[Adam::read] operation failed"); if (loaded_type == type) { if (continue_train) { diff --git a/nntrainer/optimizers/optimizer.cpp b/nntrainer/optimizers/optimizer.cpp index 604e575..22d4013 100644 --- a/nntrainer/optimizers/optimizer.cpp +++ b/nntrainer/optimizers/optimizer.cpp @@ -129,8 +129,11 @@ void Optimizer::setProperty(const PropertyType type, const std::string &value) { } void Optimizer::read(std::ifstream &file) { + /// @todo need strong exception safety guarantee OptType loaded_type; - file.read((char *)&loaded_type, sizeof(OptType)); + + checkedRead(file, (char *)&loaded_type, sizeof(OptType), + "[Optimizer::read] read operation failed"); if (loaded_type >= OptType::UNKNOWN) throw std::runtime_error("Saved file has unknown optimizer"); @@ -140,6 +143,7 @@ void Optimizer::save(std::ofstream &file) { if (type >= OptType::UNKNOWN) throw std::runtime_error("Cannot save unknown optimizer"); - file.write((char *)&type, sizeof(OptType)); + checkedWrite(file, (char *)&type, sizeof(OptType), + "[Optimizer::save] operation failed"); } } // namespace nntrainer diff --git a/nntrainer/tensor/tensor.cpp b/nntrainer/tensor/tensor.cpp index ff0de42..8c60032 100644 --- a/nntrainer/tensor/tensor.cpp +++ b/nntrainer/tensor/tensor.cpp @@ -675,11 +675,13 @@ void Tensor::reshape(const TensorDim &d) { } void Tensor::save(std::ofstream &file) { - file.write((char *)getData(), getSize()); + checkedWrite(file, (char *)getData(), getSize(), + "[Tensor::save] operation failed"); } void Tensor::read(std::ifstream &file) { - file.read((char *)getData(), getSize()); + checkedRead(file, (char *)getData(), getSize(), + "[Tensor::read] operation failed"); } /** diff --git a/nntrainer/utils/util_func.cpp b/nntrainer/utils/util_func.cpp index 19bd21a..2ae4c57 100644 --- a/nntrainer/utils/util_func.cpp +++ b/nntrainer/utils/util_func.cpp @@ -132,4 +132,25 @@ bool isFileExist(std::string file_name) { return infile.good(); } +template +static void checkFile(const T &file, const char *error_msg) { + if (file.bad() | file.eof() | !file.good() | file.fail()) { + throw std::runtime_error(error_msg); + } +} + +void checkedRead(std::ifstream &file, char *array, std::streamsize size, + const char *error_msg) { + file.read(array, size); + + checkFile(file, error_msg); +} + +void checkedWrite(std::ofstream &file, const char *array, std::streamsize size, + const char *error_msg) { + file.write(array, size); + + checkFile(file, error_msg); +} + } // namespace nntrainer diff --git a/nntrainer/utils/util_func.h b/nntrainer/utils/util_func.h index 772d80d..9e32309 100644 --- a/nntrainer/utils/util_func.h +++ b/nntrainer/utils/util_func.h @@ -90,6 +90,33 @@ Tensor rotate_180(Tensor in); */ bool isFileExist(std::string file); +constexpr const char *default_error_msg = + "[util::checkeFile] file operation failed"; + +/** + * @brief same as file.read except it checks if fail to read the file + * + * @param file file to read + * @param array char * array + * @param size size of the array + * @param error_msg error msg to print when operation fail + * @throw std::runtime_error if file.fail() is true after read. + */ +void checkedRead(std::ifstream &file, char *array, std::streamsize size, + const char *error_msg = default_error_msg); + +/** + * @brief same as file.write except it checks if fail to write the file + * + * @param file file to write + * @param array char * array + * @param size size of the array + * @param error_msg error msg to print when operation fail + * @throw std::runtime_error if file.fail() is true after write. + */ +void checkedWrite(std::ofstream &file, const char *array, std::streamsize size, + const char *error_msg = default_error_msg); + } /* namespace nntrainer */ #endif /* __cplusplus */ diff --git a/packaging/nntrainer.spec b/packaging/nntrainer.spec index 24f6c66..3c92ce4 100644 --- a/packaging/nntrainer.spec +++ b/packaging/nntrainer.spec @@ -283,9 +283,9 @@ export NNSTREAMER_FILTERS=$(pwd)/build/nnstreamer/tensor_filter pushd build rm -rf model.bin -TF_APP=Applications/TransferLearning/Draw_Classification -cp ../${TF_APP}/res/ssd_mobilenet_v2_coco_feature.tflite . -./${TF_APP}/jni/nntrainer_training ../${TF_APP}/res/Training.ini ../${TF_APP}/res +TF_APP=$(pwd)/Applications/TransferLearning/Draw_Classification +TF_APP_RES=$(pwd)/../Applications/TransferLearning/Draw_Classification/res +${TF_APP}/jni/nntrainer_training ${TF_APP_RES}/Training.ini ${TF_APP_RES} %if 0%{?support_ccapi} rm -rf model.bin diff --git a/test/test_models/models/model.bin b/test/test_models/models/model.bin index ea30d6eeaba3787581f1885e1b6c6b080988bc06..d68eaccda99016939be181303379b71b9cc39862 100644 GIT binary patch literal 46796 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℞CAd^&Gd2jWkufj& z>FHY`tX%I*oSUu0+qP%ZnvMIY@JB59F51KSNEwq)4>ywHQ|)wru7HS@4s%1|dzj7s z*J;wzsrc5fOBc0wPvJU(m$JVee}}Su8NLdakr3rk@^e^$mkk@s7Z3JRe$a_?IH1Vv zQ8Z)IMsou@VJ7vAoWu6mKds5XvxO#o(Bd_ePf+r}o>{ed5wr5I7Mr0Z!(QCIihu8{ zz)pEdn4a>#+!D8HDsoAUqV1IF-Fgrf-4Y=!j!{HE^dnv77{NHXiP1%7{j}uvBPQzj z6e_<{6EA8!$o#!L8hAcMVeDl@#cD0u@Tcn5X6>EnzKSt+7l|P%K zx0dw~7Vz=Y53$t);THqEjCd`XAM|hKG3q)p!j)ZH$TU`T6VP^K7k13$jo!W`3DIAn zzrBmwe(n-=?LS7pTOSqriCHq2_cjonB5#&6+s9vSIYv&@9O3S~E}|a#V|X2LA?36*Vjpo%p!DT1R+0FC@Buj{T&nIz-KIrob?uhhuRwWdb3e*<3=Dvl>D#`jch@$e+M8EX9H_9`UE;2 zZ33;B0{GNW2|t8}=tIkM*i`>spkQPMTt*s#vw@1ZI_WDaX^&AV^N~>WNa2Gi&l&p#$ZayR0I2AiA z`-?6ZD`TS@GeN}A7^RFX!a=eO3MO6<5U~m71vO))b~gNH{tBg;w!-tI&*m7TcdFh35~Z zGE$CBC~k@ftlIwqrv82gZ`0>N+J+@qWjF<0PAtcNO6x#z=Q!ru+R0F0_gcWPy-@Tn z7Ows2K~p+g!1uvTRGs`1tbF#uv)4gbOiKjYK2NpYx^W?Fa}P%5H5%~m&1EnuJdFMn z|AeoX648^+WZdx81I>_pD#%L@gTuKRFxcn?N7Mmtt*A#2^pjw|Yzc4y%W=f>$AaFR zKd8iO2z-){gHgjMK9~X)aXyPY6>}iMvkO+#r{M3y&jc&{W06YRHfRZSgIBx%qFmey zDXJN0vcxF}&07qqt6sqTtCqN8i#A#y*a !)V10uBB(!tsZ8p~WHVka@##$o>(E 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 diff --git a/test/unittest/unittest_nntrainer_layers.cpp b/test/unittest/unittest_nntrainer_layers.cpp index 7d64b4a..86e23d1 100644 --- a/test/unittest/unittest_nntrainer_layers.cpp +++ b/test/unittest/unittest_nntrainer_layers.cpp @@ -169,6 +169,8 @@ protected: 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(); @@ -446,8 +448,14 @@ protected: label = MAKE_SHARED_TENSOR(nntrainer::Tensor(layer.getOutputDimension()[0])); + 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", layer); + loadFile("tc_fc_1_FCKernel.in", v); loadFile("tc_fc_1_FCLabel.in", *label); layers.clear(); @@ -482,8 +490,9 @@ protected: 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", layer); + loadFile("tc_fc_1_FCKernel_sensible.in", weight); loadFile("tc_fc_1_FCLabel_sensible.in", *label); } } @@ -816,8 +825,15 @@ protected: 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", layer); + loadFile("tc_bn_fc_1_BNLayerWeights.in", v); return status; } @@ -897,8 +913,12 @@ protected: 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", layer); + loadFile("tc_bn_conv_1_BNLayerWeights.in", v); return status; } @@ -932,8 +952,14 @@ protected: 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", layer); + loadFile("tc_bn_conv_2_BNLayerWeights.in", v); return status; } @@ -1079,7 +1105,6 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_01_p) { "stride=1, 1 |" "padding=0,0"); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); unsigned int filter_size = 2; std::vector grad_data; std::vector weight_data; @@ -1090,6 +1115,7 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_01_p) { loadFile("tc_conv2d_1_conv2DLayer.in", in); loadFile("tc_conv2d_1_conv2DKernel.in", layer); + setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); EXPECT_NO_THROW(out = *layer.forwarding({MAKE_SHARED_TENSOR(in)})[0]); @@ -1133,8 +1159,6 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_02_p) { "padding=0,0", 2); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); - unsigned int filter_size = 3; std::vector grad_data; std::vector weight_data; @@ -1147,6 +1171,8 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_02_p) { loadFile("tc_conv2d_2_conv2DLayer.in", in); loadFile("tc_conv2d_2_conv2DKernel.in", layer); + setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); + EXPECT_NO_THROW(out = *layer.forwarding({MAKE_SHARED_TENSOR(in)})[0]); for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { @@ -1220,6 +1246,8 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_03_p) { "stride=1, 1 |" "padding=0, 0"); + loadFile("tc_conv2d_int_conv2DLayer.in", in); + nntrainer::Conv2DLayer layer1; status = layer1.setProperty({"input_shape=3:28:28", "bias_initializer=zeros", @@ -1230,6 +1258,15 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_03_p) { status = layer1.initialize(); 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); + status = layer1.setOptimizer(op); + EXPECT_EQ(status, ML_ERROR_NONE); + nntrainer::Conv2DLayer layer2; status = layer2.setProperty( {"bias_initializer=zeros", "weight_initializer=zeros", "filters=12", @@ -1242,13 +1279,7 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_03_p) { status = layer2.initialize(); EXPECT_EQ(status, ML_ERROR_NONE); - 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); - status = layer1.setOptimizer(op); - 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"}); @@ -1267,10 +1298,6 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_03_p) { nntrainer::Tensor derivatives(1, 12, 24, 24); - loadFile("tc_conv2d_int_conv2DLayer.in", in); - loadFile("tc_conv2d_int_conv2DKernel.in", layer1); - loadFile("tc_conv2d_int_conv2DKernel2.in", layer2); - nntrainer::Tensor out1; EXPECT_NO_THROW(out1 = *layer1.forwarding({MAKE_SHARED_TENSOR(in)})[0]); @@ -1353,7 +1380,6 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_04_p) { "stride=1,1 |" "padding=0,0"); - setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); unsigned int filter_size = 12; std::vector grad_data; std::vector weight_data; @@ -1365,6 +1391,7 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_04_p) { loadFile("tc_conv2d_3_conv2DLayer.in", in); loadFile("tc_conv2d_3_conv2DKernel.in", layer); + setOptimizer(nntrainer::OptType::SGD, "learning_rate=1.0"); EXPECT_NO_THROW(out = *layer.forwarding({MAKE_SHARED_TENSOR(in)})[0]); for (unsigned int i = 0; i < derivatives.getDim().getDataLen(); ++i) { diff --git a/test/unittest/unittest_util_func.cpp b/test/unittest/unittest_util_func.cpp index 2a662ac..7e145bd 100644 --- a/test/unittest/unittest_util_func.cpp +++ b/test/unittest/unittest_util_func.cpp @@ -61,6 +61,20 @@ TEST(nntrainer_util_func, logFloat_01_p) { } } +TEST(nntrainer_util_func, checkedRead_n) { + std::ifstream file("not existing file"); + char array[5]; + + EXPECT_THROW(nntrainer::checkedRead(file, array, 5), std::runtime_error); +} + +TEST(nntrainer_util_func, checkedWrite_n) { + std::ofstream file("/not good file"); + char array[5]; + + EXPECT_THROW(nntrainer::checkedWrite(file, array, 5), std::runtime_error); +} + TEST(nntrainer_parse_util, throw_status_no_error_p) { EXPECT_NO_THROW(nntrainer::throw_status(ML_ERROR_NONE)); } -- 2.7.4