From a8f9a0ac65f00b51f5d67280c1e1aa5bb794d745 Mon Sep 17 00:00:00 2001 From: Parichay Kapoor Date: Thu, 24 Sep 2020 14:09:50 +0900 Subject: [PATCH] [batchsize] Change the semantics of batch size This patch changes the semantics of the way batchsize is used in the library 1. batch_size is no longer property of the layer. It can still be set externally by the model. The method to set is still public but will soon be changed to private. 2. batch_size of the input/label/derivative tensor provided to the forwarding/backwarding function can no longer be arbitrary. It must match the batch_size set to the model and the layer. This change in semantics to follow for a long-term design where memory for input/output is pre-allocated. 3. batch_size can now be set at train time than the earlier design where the batch_size had to be set at init time. This comes from the design change that the memory for the model weights can be allocated init time, which is not dependent on the batch size. However, the memory for input/output should be allocated at train/inference as the batch size can be different for these. In the current design, memory is allocated every iteration. Later, when memory is allocated at once and reused, change in batch size will change the memory at once at the first iteration (rather doing this at init times). This change is necessary to allow running inference without the need to initialize the model again. V2: Updated validation to run on a whole batch of data at once Also updated Tensor.argmax() to perform on batch of data than on the whole data **Self evaluation:** 1. Build test: [x]Passed [ ]Failed [ ]Skipped 2. Run test: [x]Passed [ ]Failed [ ]Skipped Signed-off-by: Parichay Kapoor --- Applications/MNIST/Tensorflow/model.bin | Bin 0 -> 31184 bytes nntrainer/include/layer.h | 25 +++---- nntrainer/include/neuralnet.h | 5 ++ nntrainer/include/tensor.h | 4 +- nntrainer/src/addition_layer.cpp | 3 +- nntrainer/src/conv2d_layer.cpp | 3 +- nntrainer/src/flatten_layer.cpp | 4 +- nntrainer/src/layer.cpp | 8 -- nntrainer/src/neuralnet.cpp | 62 +++++++++------ nntrainer/src/parse_util.cpp | 14 ++-- nntrainer/src/pooling2d_layer.cpp | 3 +- nntrainer/src/tensor.cpp | 17 ++++- test/unittest/unittest_nntrainer_layers.cpp | 79 +++++++++++--------- 13 files changed, 126 insertions(+), 101 deletions(-) create mode 100644 Applications/MNIST/Tensorflow/model.bin diff --git a/Applications/MNIST/Tensorflow/model.bin b/Applications/MNIST/Tensorflow/model.bin new file mode 100644 index 0000000000000000000000000000000000000000..9281731f907006c94f1b15342a094923ea3d9cb5 GIT binary patch literal 31184 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 z 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 values); + + /** + * @brief Update batch size of the model as well as its layers/dataset + */ + void setBatchSize(unsigned int batch_size); }; } /* namespace nntrainer */ diff --git a/nntrainer/include/tensor.h b/nntrainer/include/tensor.h index 6d1a44ae..260df2de 100644 --- a/nntrainer/include/tensor.h +++ b/nntrainer/include/tensor.h @@ -508,10 +508,10 @@ public: void read(std::ifstream &file); /** - * @brief return argument index which value is max + * @brief return argument index which value is max by batch * @retval unsigned int argument index */ - unsigned int argmax() const; + std::vector argmax() const; /** * @brief return a copy of the Tensor Dim diff --git a/nntrainer/src/addition_layer.cpp b/nntrainer/src/addition_layer.cpp index 6da5a55b..bb73ea83 100644 --- a/nntrainer/src/addition_layer.cpp +++ b/nntrainer/src/addition_layer.cpp @@ -38,8 +38,7 @@ int AdditionLayer::initialize() { } sharedConstTensor AdditionLayer::forwarding(sharedConstTensor in) { - hidden = Tensor(in->batch(), output_dim.channel(), output_dim.height(), - output_dim.width()); + hidden = Tensor(input_dim); hidden.setZero(); for (unsigned int idx = 0; idx < num_inputs; ++idx) { diff --git a/nntrainer/src/conv2d_layer.cpp b/nntrainer/src/conv2d_layer.cpp index 8a7590cd..6cecc332 100644 --- a/nntrainer/src/conv2d_layer.cpp +++ b/nntrainer/src/conv2d_layer.cpp @@ -77,7 +77,6 @@ sharedConstTensor Conv2DLayer::forwarding(sharedConstTensor in) { } TensorDim hidden_dim = output_dim; - hidden_dim.batch(in->batch()); hidden = Tensor(hidden_dim); hidden.setZero(); @@ -130,7 +129,7 @@ sharedConstTensor Conv2DLayer::forwarding(sharedConstTensor in) { kdim.getFeatureLen() * sizeof(float)); } - for (unsigned int b = 0; b < input.batch(); ++b) { + for (unsigned int b = 0; b < input_dim.batch(); ++b) { std::vector out(output_dim.getFeatureLen()); Tensor inSub(TensorDim(1, input.channel(), input.height(), input.width()), input.getAddress(b * input.getDim().getFeatureLen())); diff --git a/nntrainer/src/flatten_layer.cpp b/nntrainer/src/flatten_layer.cpp index 75daa622..ff675f35 100644 --- a/nntrainer/src/flatten_layer.cpp +++ b/nntrainer/src/flatten_layer.cpp @@ -38,9 +38,7 @@ sharedConstTensor FlattenLayer::forwarding(sharedConstTensor in) { input = *in; hidden = input; - /// @note in->batch can be different from input_dim.batch(); - hidden.reshape({in->batch(), output_dim.channel(), output_dim.height(), - output_dim.width()}); + hidden.reshape(output_dim); return MAKE_SHARED_TENSOR(hidden); } diff --git a/nntrainer/src/layer.cpp b/nntrainer/src/layer.cpp index e3849b77..7f1a8984 100644 --- a/nntrainer/src/layer.cpp +++ b/nntrainer/src/layer.cpp @@ -136,14 +136,6 @@ void Layer::setProperty(const PropertyType type, const std::string &value) { throw_status(status); } break; - case PropertyType::batch_size: - if (!value.empty()) { - unsigned int batch_size; - status = setUint(batch_size, value); - throw_status(status); - input_dim.batch(batch_size); - } - break; case PropertyType::activation: if (!value.empty()) { status = setActivation((ActivationType)parseType(value, TOKEN_ACTI)); diff --git a/nntrainer/src/neuralnet.cpp b/nntrainer/src/neuralnet.cpp index d0108060..8e34598b 100644 --- a/nntrainer/src/neuralnet.cpp +++ b/nntrainer/src/neuralnet.cpp @@ -121,14 +121,6 @@ int NeuralNetwork::setProperty(std::vector values) { unsigned int type = parseNetProperty(key); switch (static_cast(type)) { - case PropertyType::batch_size: { - status = setUint(batch_size, value); - NN_RETURN_STATUS(); - /** TODO: increase buffer size if it is smaller than batch size. - * also if this is set with default batch size, then make it - * smaller/larger - */ - } break; case PropertyType::loss: { status = setFloat(loss, value); NN_RETURN_STATUS(); @@ -172,6 +164,14 @@ int NeuralNetwork::setTrainConfig(std::vector values) { continue_train = cont_train; opt.setProperty({values[i]}); } break; + case PropertyType::batch_size: { + status = setUint(batch_size, value); + NN_RETURN_STATUS(); + /** TODO: increase buffer size if it is smaller than batch size. + * also if this is set with default batch size, then make it + * smaller/larger + */ + } break; default: ml_loge("Error: Unknown Network Property Key"); status = ML_ERROR_INVALID_PARAMETER; @@ -211,7 +211,6 @@ int NeuralNetwork::init() { } } - layers[i]->setBatch(batch_size); status = layers[i]->initialize(); switch (l.getType()) { @@ -366,7 +365,24 @@ void NeuralNetwork::readModel() { ml_logi("read modelfile: %s", save_path.c_str()); } +void NeuralNetwork::setBatchSize(unsigned int batch) { + batch_size = batch; + for (auto const &layer : layers) + layer->setBatch(batch_size); + + if (data_buffer && data_buffer->setBatchSize(batch_size) != ML_ERROR_NONE) + throw std::invalid_argument("Error setting batchsize for the dataset"); +} + sharedConstTensor NeuralNetwork::inference(const Tensor X) { + if (batch_size != X.batch()) { + /** + * Note that inference resets batch_size of the previous train configuration + * Next train must set its batch_size if inference is run with this model. + */ + setBatchSize(X.batch()); + } + sharedConstTensor out; try { out = forwarding(MAKE_SHARED_TENSOR(X)); @@ -388,10 +404,13 @@ int NeuralNetwork::train(std::vector values) { return ML_ERROR_INVALID_PARAMETER; } - /** Setup data buffer properties */ - status = data_buffer->setBatchSize(batch_size); + status = setTrainConfig(values); NN_RETURN_STATUS(); + /** set batch size just before training */ + setBatchSize(batch_size); + + /** Setup data buffer properties */ status = data_buffer->setClassNum(layers.back()->getOutputDimension().width()); NN_RETURN_STATUS(); @@ -402,9 +421,6 @@ int NeuralNetwork::train(std::vector values) { status = data_buffer->init(); NN_RETURN_STATUS(); - status = setTrainConfig(values); - NN_RETURN_STATUS(); - return train_run(); } @@ -475,15 +491,17 @@ int NeuralNetwork::train_run() { while (true) { vec_4d in, label; if (data_buffer->getDataFromBuffer(nntrainer::BUF_VAL, in, label)) { - for (unsigned int b = 0; b < batch_size; ++b) { - sharedTensor X = MAKE_SHARED_TENSOR(Tensor({in[b]})); - sharedTensor Y2 = MAKE_SHARED_TENSOR(Tensor({label[b]})); - sharedConstTensor Y = forwarding(X, Y2); - if (Y->argmax() == Y2->argmax()) + sharedTensor X = MAKE_SHARED_TENSOR(Tensor({in})); + sharedTensor Y2 = MAKE_SHARED_TENSOR(Tensor({label})); + sharedConstTensor Y = forwarding(X, Y2); + auto model_out = Y->argmax(); + auto label_out = Y2->argmax(); + for (unsigned int b = 0; b < batch_size; b++) { + if (model_out[b] == label_out[b]) right++; - validation.loss += getLoss(); - tcases++; } + validation.loss += getLoss(); + tcases++; } else { data_buffer->clear(nntrainer::BUF_VAL); break; @@ -496,7 +514,7 @@ int NeuralNetwork::train_run() { return status; } validation.loss /= (float)(tcases); - validation.accuracy = right / (float)(tcases)*100.0f; + validation.accuracy = right / (float)(tcases * batch_size) * 100.0f; std::cout << " >> [ Accuracy: " << validation.accuracy << "% - Validation Loss : " << validation.loss << " ] "; } diff --git a/nntrainer/src/parse_util.cpp b/nntrainer/src/parse_util.cpp index 17169f1e..de78a361 100644 --- a/nntrainer/src/parse_util.cpp +++ b/nntrainer/src/parse_util.cpp @@ -270,12 +270,11 @@ unsigned int parseType(std::string ll, InputType t) { * name = 17 * num_inputs = 18 * num_outputs = 19 - * batch_size = 20 - * momentum = 21 - * moving_mean_initializer = 22 - * moving_variance_initializer = 23 - * gamma_initializer = 24 - * beta_initializer = 25 + * momentum = 20 + * moving_mean_initializer = 21 + * moving_variance_initializer = 22 + * gamma_initializer = 23 + * beta_initializer = 24 * * InputLayer has 0, 1, 2, 3 properties. * FullyConnectedLayer has 1, 4, 6, 7, 8, 9 properties. @@ -283,7 +282,7 @@ unsigned int parseType(std::string ll, InputType t) { * Pooling2DLayer has 12, 13, 14, 15 properties. * BatchNormalizationLayer has 0, 1, 5, 6, 7 properties. */ -static std::array property_string = { +static std::array property_string = { "input_shape", "normalization", "standardization", @@ -304,7 +303,6 @@ static std::array property_string = { "name", "num_inputs", "num_outputs", - "batch_size", "momentum", "moving_mean_initializer", "moving_variance_initializer", diff --git a/nntrainer/src/pooling2d_layer.cpp b/nntrainer/src/pooling2d_layer.cpp index 2ef81317..d1780106 100644 --- a/nntrainer/src/pooling2d_layer.cpp +++ b/nntrainer/src/pooling2d_layer.cpp @@ -59,11 +59,10 @@ sharedConstTensor Pooling2DLayer::forwarding(sharedConstTensor in) { input = *in; TensorDim hidden_dim = output_dim; - hidden_dim.batch(in->batch()); hidden = Tensor(hidden_dim); hidden.setZero(); - for (unsigned int b = 0; b < input.batch(); ++b) { + for (unsigned int b = 0; b < input_dim.batch(); ++b) { Tensor in_padded = zero_pad(b, input, padding); Tensor result = pooling2d(b, in_padded); memcpy(hidden.getAddress(b * hidden.getDim().getFeatureLen()), diff --git a/nntrainer/src/tensor.cpp b/nntrainer/src/tensor.cpp index 4674910d..16c13784 100644 --- a/nntrainer/src/tensor.cpp +++ b/nntrainer/src/tensor.cpp @@ -706,10 +706,21 @@ void Tensor::setValue(float val) { void Tensor::setZero() { setValue(0); } -unsigned int Tensor::argmax() const { +std::vector Tensor::argmax() const { const float *data = getData(); - auto max_iter = std::max_element(data, data + length()); - return std::distance(data, max_iter); + std::vector result; + unsigned int batch_size = batch(); + unsigned int feature_len = dim.getFeatureLen(); + + result.reserve(batch_size); + + for (unsigned int b = 0; b < batch_size; b++) { + auto max_iter = + std::max_element(data + b * feature_len, data + (b + 1) * feature_len); + result[b] = std::distance(data, max_iter); + } + + return result; } float Tensor::l2norm() const { diff --git a/test/unittest/unittest_nntrainer_layers.cpp b/test/unittest/unittest_nntrainer_layers.cpp index 44d1fd91..97678b63 100644 --- a/test/unittest/unittest_nntrainer_layers.cpp +++ b/test/unittest/unittest_nntrainer_layers.cpp @@ -48,10 +48,11 @@ protected: return status; } - virtual int reinitialize(const std::string str) { + virtual int reinitialize(const std::string str, int batch_size = 1) { resetLayer(); int status = setProperty(str); EXPECT_EQ(status, ML_ERROR_NONE); + setBatch(batch_size); status = reinitialize(); EXPECT_EQ(status, ML_ERROR_NONE); return status; @@ -69,6 +70,8 @@ protected: layer.setInputDimension(dim); } + void setBatch(unsigned int batch) { layer.setBatch(batch); } + void matchOutput(const nntrainer::Tensor &result, const nntrainer::Tensor &golden) { const float *out_ptr, *golden_ptr; @@ -175,7 +178,7 @@ class nntrainer_InputLayer protected: virtual void prepareLayer() { setInputDim("3:28:28"); - setProperty("batch_size=1"); + setBatch(1); } }; @@ -234,7 +237,7 @@ TEST_F(nntrainer_InputLayer, set_property_05_p) { nntrainer::TensorDim dim; int status = ML_ERROR_NONE; - status = setProperty("batch_size=5"); + setBatch(5); EXPECT_EQ(status, ML_ERROR_NONE); dim = layer.getInputDimension(); @@ -308,7 +311,7 @@ class nntrainer_FullyConnectedLayer protected: virtual void prepareLayer() { setInputDim("1:28:28"); - setProperty("batch_size=32"); + setBatch(5); setProperty("unit=1"); } }; @@ -538,7 +541,7 @@ protected: virtual void prepareLayer() { setInputDim("1:1:12"); - setProperty("batch_size=3"); + setBatch(3); setProperty("unit=15"); setProperty("bias_initializer=zeros"); } @@ -801,8 +804,8 @@ protected: } virtual void prepareLayer() { - setProperty( - "input_shape=1:1:12 | epsilon=0.001 | batch_size=3 | momentum=0.90"); + setProperty("input_shape=1:1:12 | epsilon=0.001 | momentum=0.90"); + setBatch(3); setOptimizer(nntrainer::OptType::sgd, "learning_rate=1"); } }; @@ -881,8 +884,8 @@ protected: } virtual void prepareLayer() { - setProperty( - "input_shape=2:4:5 | epsilon=0.001 | batch_size=3 | momentum=0.90"); + setProperty("input_shape=2:4:5 | epsilon=0.001 | momentum=0.90"); + setBatch(3); setOptimizer(nntrainer::OptType::sgd, "learning_rate=1"); } }; @@ -916,8 +919,8 @@ protected: } virtual void prepareLayer() { - setProperty( - "input_shape=2:4:5 | epsilon=0.001 | batch_size=1 | momentum=0.90"); + setProperty("input_shape=2:4:5 | epsilon=0.001 | momentum=0.90"); + setBatch(1); setOptimizer(nntrainer::OptType::sgd, "learning_rate=1"); } }; @@ -947,7 +950,7 @@ protected: virtual void prepareLayer() { int status = - setProperty("input_shape=3:28:28 | batch_size=32 |" + setProperty("input_shape=3:28:28 |" "bias_initializer=zeros |" "activation=sigmoid |" "weight_regularizer=l2norm |" @@ -957,6 +960,7 @@ protected: "filters=12 | kernel_size= 5,5 | stride=3,3 | padding=1,1"); EXPECT_EQ(status, ML_ERROR_NONE); + setBatch(32); } nntrainer::Tensor result; @@ -1014,7 +1018,7 @@ TEST_F(nntrainer_Conv2DLayer, save_read_01_p) { * @brief Convolution 2D Layer */ TEST_F(nntrainer_Conv2DLayer, forwarding_01_p) { - reinitialize("input_shape=3:7:7 | batch_size=1 |" + 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"); @@ -1035,10 +1039,11 @@ TEST_F(nntrainer_Conv2DLayer, forwarding_01_p) { TEST_F(nntrainer_Conv2DLayer, forwarding_02_p) { status = - reinitialize("input_shape=3:7:7 | batch_size=2 |" + 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"); + "filters=3 | kernel_size=3,3 | stride=1, 1 | padding=0,0", + 2); ASSERT_EQ(in.getDim(), nntrainer::TensorDim(2, 3, 7, 7)); ASSERT_EQ(out.getDim(), nntrainer::TensorDim(2, 3, 5, 5)); @@ -1051,7 +1056,7 @@ TEST_F(nntrainer_Conv2DLayer, forwarding_02_p) { } TEST_F(nntrainer_Conv2DLayer, backwarding_01_p) { - status = reinitialize("input_shape=3:7:7 | batch_size=1 |" + status = reinitialize("input_shape=3:7:7 |" "bias_initializer=zeros |" "weight_initializer=xavier_uniform |" "filters=2 |" @@ -1104,7 +1109,7 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_01_p) { } TEST_F(nntrainer_Conv2DLayer, backwarding_04_p) { - status = reinitialize("input_shape=6:24:24 | batch_size=1 |" + status = reinitialize("input_shape=6:24:24 |" "bias_initializer=zeros |" "weight_initializer=xavier_uniform |" "filters=12 |" @@ -1157,13 +1162,14 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_04_p) { } TEST_F(nntrainer_Conv2DLayer, backwarding_02_p) { - status = reinitialize("input_shape=3:7:7 | batch_size=2 |" + 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"); + "padding=0,0", + 2); setOptimizer(nntrainer::OptType::sgd, "learning_rate=1.0"); @@ -1241,7 +1247,7 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_02_p) { #ifdef USE_BLAS TEST_F(nntrainer_Conv2DLayer, backwarding_03_p) { - status = reinitialize("input_shape=3:28:28 | batch_size=1 |" + status = reinitialize("input_shape=3:28:28 |" "bias_initializer=zeros |" "weight_initializer=zeros |" "filters=6 |" @@ -1250,19 +1256,21 @@ TEST_F(nntrainer_Conv2DLayer, backwarding_03_p) { "padding=0, 0"); nntrainer::Conv2DLayer layer1; - status = layer1.setProperty( - {"input_shape=3:28:28", "batch_size=1", "bias_initializer=zeros", - "weight_initializer=zeros", "filters=6", "kernel_size= 5,5", "stride=1, 1", - "padding=0, 0"}); + 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(); EXPECT_EQ(status, ML_ERROR_NONE); nntrainer::Conv2DLayer layer2; status = layer2.setProperty( - {"batch_size=1", "bias_initializer=zeros", "weight_initializer=zeros", - "filters=12", "kernel_size= 1,1", "stride=1, 1", "padding=0, 0"}); + {"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); layer2.setInputDimension(layer1.getOutputDimension()); status = layer2.initialize(); EXPECT_EQ(status, ML_ERROR_NONE); @@ -1389,13 +1397,13 @@ protected: TEST_F(nntrainer_Pooling2DLayer, setProperty_01_p) { setInputDim("3:5:5"); - setProperty("batch_size=2"); + 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"); - setProperty("batch_size=2"); + setBatch(2); int status = layer.setProperty({"pool_size="}); EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER); } @@ -1457,7 +1465,7 @@ TEST_F(nntrainer_Pooling2DLayer, forwarding_04_p) { TEST_F(nntrainer_Pooling2DLayer, forwarding_05_p) { resetLayer(); setInputDim("2:5:5"); - setProperty("batch_size=2"); + setBatch(2); setProperty("pooling=global_max"); reinitialize(); @@ -1469,7 +1477,7 @@ TEST_F(nntrainer_Pooling2DLayer, forwarding_05_p) { TEST_F(nntrainer_Pooling2DLayer, forwarding_06_p) { resetLayer(); setInputDim("2:5:5"); - setProperty("batch_size=2"); + setBatch(2); setProperty("pooling=global_average"); reinitialize(); @@ -1566,7 +1574,7 @@ class nntrainer_FlattenLayer protected: virtual void prepareLayer() { setInputDim("2:4:4"); - layer.setBatch(1); + setBatch(1); } }; @@ -1590,7 +1598,7 @@ TEST_F(nntrainer_FlattenLayer, forwarding_01_p) { */ TEST_F(nntrainer_FlattenLayer, forwarding_02_p) { setInputDim("2:4:4"); - layer.setBatch(2); + setBatch(2); reinitialize(); EXPECT_EQ(out.getDim(), nntrainer::TensorDim(2, 1, 1, 32)); @@ -1623,7 +1631,7 @@ TEST_F(nntrainer_FlattenLayer, backwarding_01_p) { */ TEST_F(nntrainer_FlattenLayer, backwarding_02_p) { setInputDim("2:4:4"); - layer.setBatch(2); + setBatch(2); reinitialize(); EXPECT_EQ(out.getDim(), nntrainer::TensorDim(2, 1, 1, 32)); @@ -1795,7 +1803,8 @@ class nntrainer_AdditionLayer : public nntrainer_abstractLayer { protected: virtual void prepareLayer() { - setInputDim("32:3:28:28"); + setInputDim("3:28:28"); + setBatch(32); setProperty("num_inputs=1"); } }; @@ -1837,7 +1846,7 @@ TEST_F(nntrainer_AdditionLayer, forwarding_01_n) { in = nntrainer::Tensor(); - EXPECT_THROW(layer.forwarding(input), std::logic_error); + EXPECT_THROW(layer.forwarding(input), std::runtime_error); } TEST_F(nntrainer_AdditionLayer, forwarding_02_n) { -- 2.34.1