From 9bfe2c6635e59e082c69a92ce2314ab3f4591dc3 Mon Sep 17 00:00:00 2001 From: eclipsess Date: Sat, 19 May 2018 11:03:53 +0800 Subject: [PATCH] change op test file (add,mul) --- test/CMakeLists.txt | 13 +- test/elementwise_add_op_test.h | 164 ------------------ test/main.cpp | 83 --------- test/mul_op_test.h | 190 -------------------- test/operators/test_elementwise_add_op.cpp | 165 ++++++++++++++++++ test/operators/test_mul_op.cpp | 191 +++++++++++++++++++++ 6 files changed, 365 insertions(+), 441 deletions(-) delete mode 100644 test/elementwise_add_op_test.h delete mode 100644 test/main.cpp delete mode 100644 test/mul_op_test.h create mode 100644 test/operators/test_elementwise_add_op.cpp create mode 100644 test/operators/test_mul_op.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a73364f049..99b4f618ea 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,12 +1,17 @@ -# gen test -ADD_EXECUTABLE(paddle-mobile-test main.cpp test_helper.h elementwise_add_op_test.h test_include.h mul_op_test.h) -target_link_libraries(paddle-mobile-test paddle-mobile) - # gen test ADD_EXECUTABLE(test-conv-op operators/test_cov_op.cpp test_helper.h test_include.h) target_link_libraries(test-conv-op paddle-mobile) +# gen test +ADD_EXECUTABLE(test-mul-op operators/test_mul_op.cpp test_helper.h test_include.h) +target_link_libraries(test-mul-op paddle-mobile) + +# gen test +ADD_EXECUTABLE(test-elementwiseadd-op operators/test_elementwise_add_op.cpp test_helper.h test_include.h) +target_link_libraries(test-elementwiseadd-op paddle-mobile) + + # gen test log ADD_EXECUTABLE(test-log common/test_log.cpp) target_link_libraries(test-log paddle-mobile) diff --git a/test/elementwise_add_op_test.h b/test/elementwise_add_op_test.h deleted file mode 100644 index b8e4b4052f..0000000000 --- a/test/elementwise_add_op_test.h +++ /dev/null @@ -1,164 +0,0 @@ - -/* Copyright (c) 2016 Baidu, Inc. All Rights Reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -==============================================================================*/ -#pragma once -#include "operators/elementwise_add_op.h" -#include "test_include.h" - -namespace paddle_mobile { -namespace framework { - -template class TestElementwiseAddOp { - public: - TestElementwiseAddOp(const Program p) : program_(p) { - if (use_optimize_) { - to_predict_program_ = program_.optimizeProgram; - } else { - to_predict_program_ = program_.originProgram; - } - - const std::vector> blocks = - to_predict_program_->Blocks(); - // DLOG << " **block size " << blocks.size(); - for (int i = 0; i < blocks.size(); ++i) { - std::shared_ptr block_desc = blocks[i]; - std::vector> ops = block_desc->Ops(); - // DLOG << " ops " << ops.size(); - for (int j = 0; j < ops.size(); ++j) { - std::shared_ptr op = ops[j]; - // if (op->Type() == - // "elementwise_add") { - // if - // (op->GetAttrMap().at("axis").Get() - // != -1) { - // DLOG << "attr: axis = - // " - // << - // op->GetAttrMap().at("axis").Get(); - // } - // } - // DLOG << "op:" << op->Type(); - if (op->Type() == "elementwise_add" && - op->Input("X")[0] == "batch_norm_2.tmp_2") { - DLOG << " elementwise_add attr size: " - << op->GetAttrMap().size(); - DLOG << " inputs size: " << op->GetInputs().size(); - DLOG << " outputs size: " << op->GetOutputs().size(); - DLOG << " Input X is : " << op->Input("X")[0]; - DLOG << " Input Y is : " << op->Input("Y")[0]; - DLOG << " Output Out is : " << op->Output("Out")[0]; - Attribute axis_attr = op->GetAttrMap().at("axis"); - int axis = axis_attr.Get(); - DLOG << " Attr axis is : " << axis; - - std::shared_ptr> - add = std::make_shared< - operators::ElementwiseAddOp>( - op->Type(), op->GetInputs(), op->GetOutputs(), - op->GetAttrMap(), program_.scope); - ops_of_block_[*block_desc.get()].push_back(add); - } - } - } - } - - std::shared_ptr predict_add(Tensor &t1, Tensor &t2) { - // feed - auto scope = program_.scope; - Variable *x_feed_value = scope->Var("batch_norm_2.tmp_2"); - auto tensor_x = x_feed_value->GetMutable(); - tensor_x->ShareDataWith(t1); - - Variable *y_feed_value = scope->Var("batch_norm_0.tmp_3"); - auto tensor_y = y_feed_value->GetMutable(); - tensor_y->ShareDataWith(t2); - - Variable *con_output = scope->Var("elementwise_add_0.tmp_0"); - Tensor *output_tensor = con_output->GetMutable(); - output_tensor->mutable_data({1, 3, 224, 224}); - // DLOG << typeid(output_tensor).name(); - // DLOG << "output_tensor dims: " << output_tensor->dims(); - - std::shared_ptr out_tensor = std::make_shared(); - out_tensor.reset(output_tensor); - - predict_add(t1, t2, 0); - return out_tensor; - } - - private: - const framework::Program program_; - std::shared_ptr to_predict_program_; - std::map>>> - ops_of_block_; - bool use_optimize_ = false; - - void predict_add(const Tensor &t1, const Tensor &t2, int block_id) { - std::shared_ptr to_predict_block = - to_predict_program_->Block(block_id); - for (int j = 0; j < ops_of_block_[*to_predict_block.get()].size(); - ++j) { - auto op = ops_of_block_[*to_predict_block.get()][j]; - DLOG << "op -> run()"; - op->Run(); - } - } -}; - -template class TestElementwiseAddOp; -} // namespace framework - -namespace test { -void testElementwiseAdd() { - DLOG << "----------**********----------"; - DLOG << "begin to run ElementAddOp Test"; - paddle_mobile::Loader loader; - auto program = - loader.Load(std::string("../../test/models/" - "image_classification_resnet.inference.model")); - - /// input x (1,3,224,224) - paddle_mobile::framework::Tensor inputx; - SetupTensor(&inputx, {1, 3, 224, 224}, static_cast(0), - static_cast(1)); - float *inputx_ptr = inputx.data(); - /// input y (224,) - paddle_mobile::framework::Tensor inputy; - SetupTensor(&inputy, {224}, static_cast(0), - static_cast(1)); - float *inputy_ptr = inputy.data(); - - paddle_mobile::framework::TestElementwiseAddOp - testElementwiseAddOp(program); - - auto output_add = testElementwiseAddOp.predict_add(inputx, inputy); - float *output_add_ptr = output_add->data(); - // for (int j = 0; j < output_add->numel(); ++j) { - // DLOG << "value of output: " << output_add_ptr[j]; - // } - - /// output (1,3,224,224) - DLOG << "output memory size : " << output_add->memory_size(); - DLOG << "output numel : " << output_add->numel(); - - DLOG << inputx_ptr[226] << " + " << inputy_ptr[2] << " = " - << output_add_ptr[226]; -} -} // namespace test -} // namespace paddle_mobile diff --git a/test/main.cpp b/test/main.cpp deleted file mode 100644 index e8ad36af2d..0000000000 --- a/test/main.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright (c) 2016 Baidu, Inc. All Rights Reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -==============================================================================*/ - -#include "elementwise_add_op_test.h" -#include "framework/executor.h" -#include "io.h" -#include "mul_op_test.h" -#include "test_helper.h" - -// -// template -// void SetupTensor(paddle::framework::LoDTensor* input, -// paddle::framework::DDim dims, T lower, T upper) { -// static unsigned int seed = 100; -// std::mt19937 rng(seed++); -// std::uniform_real_distribution uniform_dist(0, 1); -// -// T* input_ptr = input->mutable_data(dims, paddle::platform::CPUPlace()); -// for (int i = 0; i < input->numel(); ++i) { -// input_ptr[i] = static_cast(uniform_dist(rng) * (upper - lower) + -// lower); -// } -//} - -int main() { - - std::string data_set = "cifar10"; - // - // if (data_set == "cifar10") { - // SetupTensor(&input, {FLAGS_batch_size, 3, 32, 32}, - // static_cast(0), static_cast(1)); - // } else if (data_set == "imagenet") { - // SetupTensor(&input, {FLAGS_batch_size, 3, 224, 224}, - // static_cast(0), static_cast(1)); - // } else { - // LOG(FATAL) << "Only cifar10 or imagenet is supported."; - // } - - paddle_mobile::Loader loader; - auto program = loader.Load(std::string( - "../../../test/models/image_classification_resnet.inference.model")); - - paddle_mobile::framework::Executor executor(program); - - paddle_mobile::framework::Tensor input; - SetupTensor(&input, {1, 3, 32, 32}, static_cast(0), - static_cast(1)); - float *input_ptr = input.data(); - for (int i = 0; i < input.numel(); ++i) { - // std::cout << input_ptr[i] << std::endl; - } - - // std::cout << "input: " << input.memory_size() << std::endl; - // std::cout << "input: " << input.numel() << std::endl; - - auto output = executor.predict(input); - - // std::cout << "output: " << output->memory_size() << std::endl; - // std::cout << "output: " << output->numel() << std::endl; - - // float* output_ptr = output->data(); - // for (int j = 0; j < output->numel(); ++j) { - // std::cout << " value of output: " << output_ptr[j] << std::endl; - // - paddle_mobile::test::testElementwiseAdd(); - paddle_mobile::test::testMul(); - return 0; -} diff --git a/test/mul_op_test.h b/test/mul_op_test.h deleted file mode 100644 index 0f66abdee9..0000000000 --- a/test/mul_op_test.h +++ /dev/null @@ -1,190 +0,0 @@ - -/* Copyright (c) 2016 Baidu, Inc. All Rights Reserved. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -==============================================================================*/ -#pragma once -#include "operators/mul_op.h" -#include "test_include.h" - -namespace paddle_mobile { -namespace framework { - -template class TestMulOp { - public: - TestMulOp(const Program p) : program_(p) { - if (use_optimize_) { - to_predict_program_ = program_.optimizeProgram; - } else { - to_predict_program_ = program_.originProgram; - } - - const std::vector> blocks = - to_predict_program_->Blocks(); - // DLOG << " **block size " << blocks.size(); - for (int i = 0; i < blocks.size(); ++i) { - std::shared_ptr block_desc = blocks[i]; - std::vector> ops = block_desc->Ops(); - // DLOG << " ops " << ops.size(); - for (int j = 0; j < ops.size(); ++j) { - std::shared_ptr op = ops[j]; - // if (op->Type() == "mul") { - // DLOG << "x_num_col_dims : - // " - // << op->GetAttrMap() - // .at("x_num_col_dims") - // .Get(); - // DLOG << "y_num_col_dims : - // " - // << op->GetAttrMap() - // .at("y_num_col_dims") - // .Get(); - // DLOG << " Input X is : " - // << op->Input("X")[0]; - // } - // DLOG << "op:" << op->Type(); - if (op->Type() == "mul" && - op->Input("X")[0] == "pool2d_0.tmp_0") { - DLOG << " mul attr size: " << op->GetAttrMap().size(); - DLOG << " inputs size: " << op->GetInputs().size(); - DLOG << " outputs size: " << op->GetOutputs().size(); - DLOG << " Input X is : " << op->Input("X")[0]; - DLOG << " Input Y is : " << op->Input("Y")[0]; - DLOG << " Output Out is : " << op->Output("Out")[0]; - DLOG << "x_num_col_dims : " - << op->GetAttrMap().at("x_num_col_dims").Get(); - DLOG << "y_num_col_dims : " - << op->GetAttrMap().at("y_num_col_dims").Get(); - - std::shared_ptr> add = - std::make_shared>( - op->Type(), op->GetInputs(), op->GetOutputs(), - op->GetAttrMap(), program_.scope); - ops_of_block_[*block_desc.get()].push_back(add); - } - } - } - } - - std::shared_ptr predict_add(Tensor &t1, Tensor &t2) { - // feed - auto scope = program_.scope; - Variable *x_feed_value = scope->Var("pool2d_0.tmp_0"); - auto tensor_x = x_feed_value->GetMutable(); - tensor_x->ShareDataWith(t1); - - Variable *y_feed_value = scope->Var("fc_0.w_0"); - auto tensor_y = y_feed_value->GetMutable(); - tensor_y->ShareDataWith(t2); - - Variable *con_output = scope->Var("fc_0.tmp_0"); - Tensor *output_tensor = con_output->GetMutable(); - output_tensor->mutable_data({3, 3}); - // DLOG << typeid(output_tensor).name(); - // DLOG << "output_tensor dims: " << output_tensor->dims(); - - std::shared_ptr out_tensor = std::make_shared(); - out_tensor.reset(output_tensor); - - predict_add(t1, t2, 0); - return out_tensor; - } - - private: - const framework::Program program_; - std::shared_ptr to_predict_program_; - std::map>>> - ops_of_block_; - bool use_optimize_ = false; - - void predict_add(const Tensor &t1, const Tensor &t2, int block_id) { - std::shared_ptr to_predict_block = - to_predict_program_->Block(block_id); - for (int j = 0; j < ops_of_block_[*to_predict_block.get()].size(); - ++j) { - auto op = ops_of_block_[*to_predict_block.get()][j]; - DLOG << "op -> run()"; - op->Run(); - } - } -}; - -template class TestMulOp; -} // namespace framework - -namespace test { -void testMul() { - DLOG << "----------**********----------"; - DLOG << "begin to run MulOp Test"; - paddle_mobile::Loader loader; - auto program = - loader.Load(std::string("../../test/models/" - "image_classification_resnet.inference.model")); - - /// input x (3,2,1,1) - paddle_mobile::framework::Tensor inputx; - SetupTensor(&inputx, {3, 2, 1, 1}, static_cast(0), - static_cast(1)); - float *inputx_ptr = inputx.data(); - - /// input y (2,3) - paddle_mobile::framework::Tensor inputy; - SetupTensor(&inputy, {2, 3}, static_cast(0), - static_cast(1)); - float *inputy_ptr = inputy.data(); - - paddle_mobile::framework::TestMulOp testMulOp(program); - - auto output_mul = testMulOp.predict_add(inputx, inputy); - float *output_mul_ptr = output_mul->data(); - - auto dimx_1 = inputx.numel() / inputx.dims()[0]; - DLOG << " inputx : "; - for (int i = 0; i < inputx.dims()[0]; ++i) { - for (int j = 0; j < dimx_1; ++j) { - DLOGF("%f ", inputx_ptr[i * dimx_1 + j]); - } - DLOGF("\n"); - } - - auto dimy_1 = inputy.numel() / inputy.dims()[0]; - DLOG << " inputy : "; - for (int i = 0; i < inputy.dims()[0]; ++i) { - for (int j = 0; j < dimy_1; ++j) { - DLOGF("%f ", inputy_ptr[i * dimx_1 + j]); - } - DLOGF("\n"); - } - - auto dim_output_1 = output_mul->numel() / output_mul->dims()[0]; - DLOG << " output : "; - for (int i = 0; i < output_mul->dims()[0]; ++i) { - for (int j = 0; j < dim_output_1; ++j) { - DLOGF("%f ", output_mul_ptr[i * dimy_1 + j]); - } - DLOGF("\n"); - } - - /// output (3,3) - DLOG << "output memory size : " << output_mul->memory_size(); - DLOG << "output numel : " << output_mul->numel(); - - DLOG << inputx_ptr[0] << " x " << inputy_ptr[0] << " + " << inputx_ptr[1] - << " x " << inputy_ptr[0 + 3] << " = " << output_mul_ptr[0]; -} -} // namespace test -} // namespace paddle_mobile diff --git a/test/operators/test_elementwise_add_op.cpp b/test/operators/test_elementwise_add_op.cpp new file mode 100644 index 0000000000..54aab5d4a6 --- /dev/null +++ b/test/operators/test_elementwise_add_op.cpp @@ -0,0 +1,165 @@ + +/* Copyright (c) 2016 Baidu, Inc. All Rights Reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +==============================================================================*/ +#pragma once +#include "operators/elementwise_add_op.h" +#include "../test_include.h" + +namespace paddle_mobile { + namespace framework { + + template + class TestElementwiseAddOp { + public: + TestElementwiseAddOp(const Program p) : program_(p) { + if (use_optimize_) { + to_predict_program_ = program_.optimizeProgram; + } else { + to_predict_program_ = program_.originProgram; + } + + const std::vector> blocks = + to_predict_program_->Blocks(); + // DLOG << " **block size " << blocks.size(); + for (int i = 0; i < blocks.size(); ++i) { + std::shared_ptr block_desc = blocks[i]; + std::vector> ops = block_desc->Ops(); + // DLOG << " ops " << ops.size(); + for (int j = 0; j < ops.size(); ++j) { + std::shared_ptr op = ops[j]; + // if (op->Type() == + // "elementwise_add") { + // if + // (op->GetAttrMap().at("axis").Get() + // != -1) { + // DLOG << "attr: axis = + // " + // << + // op->GetAttrMap().at("axis").Get(); + // } + // } + // DLOG << "op:" << op->Type(); + if (op->Type() == "elementwise_add" && + op->Input("X")[0] == "batch_norm_2.tmp_2") { + DLOG << " elementwise_add attr size: " + << op->GetAttrMap().size(); + DLOG << " inputs size: " << op->GetInputs().size(); + DLOG << " outputs size: " << op->GetOutputs().size(); + DLOG << " Input X is : " << op->Input("X")[0]; + DLOG << " Input Y is : " << op->Input("Y")[0]; + DLOG << " Output Out is : " << op->Output("Out")[0]; + Attribute axis_attr = op->GetAttrMap().at("axis"); + int axis = axis_attr.Get(); + DLOG << " Attr axis is : " << axis; + + std::shared_ptr> + add = std::make_shared< + operators::ElementwiseAddOp>( + op->Type(), op->GetInputs(), op->GetOutputs(), + op->GetAttrMap(), program_.scope); + ops_of_block_[*block_desc.get()].push_back(add); + } + } + } + } + + std::shared_ptr predict_add(Tensor &t1, Tensor &t2) { + // feed + auto scope = program_.scope; + Variable *x_feed_value = scope->Var("batch_norm_2.tmp_2"); + auto tensor_x = x_feed_value->GetMutable(); + tensor_x->ShareDataWith(t1); + + Variable *y_feed_value = scope->Var("batch_norm_0.tmp_3"); + auto tensor_y = y_feed_value->GetMutable(); + tensor_y->ShareDataWith(t2); + + Variable *con_output = scope->Var("elementwise_add_0.tmp_0"); + Tensor *output_tensor = con_output->GetMutable(); + output_tensor->mutable_data({1, 3, 224, 224}); + // DLOG << typeid(output_tensor).name(); + // DLOG << "output_tensor dims: " << output_tensor->dims(); + + std::shared_ptr out_tensor = std::make_shared(); + out_tensor.reset(output_tensor); + + predict_add(t1, t2, 0); + return out_tensor; + } + + private: + const framework::Program program_; + std::shared_ptr to_predict_program_; + std::map>>> + ops_of_block_; + bool use_optimize_ = false; + + void predict_add(const Tensor &t1, const Tensor &t2, int block_id) { + std::shared_ptr to_predict_block = + to_predict_program_->Block(block_id); + for (int j = 0; j < ops_of_block_[*to_predict_block.get()].size(); + ++j) { + auto op = ops_of_block_[*to_predict_block.get()][j]; + DLOG << "op -> run()"; + op->Run(); + } + } + }; + + template + class TestElementwiseAddOp; + } // namespace framework +} // namespace paddle_mobile +int main() { + DLOG << "----------**********----------"; + DLOG << "begin to run ElementAddOp Test"; + paddle_mobile::Loader loader; + auto program = + loader.Load(std::string("../../../test/models/" + "image_classification_resnet.inference.model")); + + /// input x (1,3,224,224) + paddle_mobile::framework::Tensor inputx; + SetupTensor(&inputx, {1, 3, 224, 224}, static_cast(0), + static_cast(1)); + float *inputx_ptr = inputx.data(); + /// input y (224,) + paddle_mobile::framework::Tensor inputy; + SetupTensor(&inputy, {224}, static_cast(0), + static_cast(1)); + float *inputy_ptr = inputy.data(); + + paddle_mobile::framework::TestElementwiseAddOp + testElementwiseAddOp(program); + + auto output_add = testElementwiseAddOp.predict_add(inputx, inputy); + float *output_add_ptr = output_add->data(); + // for (int j = 0; j < output_add->numel(); ++j) { + // DLOG << "value of output: " << output_add_ptr[j]; + // } + + /// output (1,3,224,224) + DLOG << "output memory size : " << output_add->memory_size(); + DLOG << "output numel : " << output_add->numel(); + + DLOG << inputx_ptr[226] << " + " << inputy_ptr[2] << " = " + << output_add_ptr[226]; + return 0; +} + diff --git a/test/operators/test_mul_op.cpp b/test/operators/test_mul_op.cpp new file mode 100644 index 0000000000..dbfb22429f --- /dev/null +++ b/test/operators/test_mul_op.cpp @@ -0,0 +1,191 @@ + +/* Copyright (c) 2016 Baidu, Inc. All Rights Reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +==============================================================================*/ +#pragma once +#include "operators/mul_op.h" +#include "../test_include.h" + +namespace paddle_mobile { + namespace framework { + + template + class TestMulOp { + public: + TestMulOp(const Program p) : program_(p) { + if (use_optimize_) { + to_predict_program_ = program_.optimizeProgram; + } else { + to_predict_program_ = program_.originProgram; + } + + const std::vector> blocks = + to_predict_program_->Blocks(); + // DLOG << " **block size " << blocks.size(); + for (int i = 0; i < blocks.size(); ++i) { + std::shared_ptr block_desc = blocks[i]; + std::vector> ops = block_desc->Ops(); + // DLOG << " ops " << ops.size(); + for (int j = 0; j < ops.size(); ++j) { + std::shared_ptr op = ops[j]; + // if (op->Type() == "mul") { + // DLOG << "x_num_col_dims : + // " + // << op->GetAttrMap() + // .at("x_num_col_dims") + // .Get(); + // DLOG << "y_num_col_dims : + // " + // << op->GetAttrMap() + // .at("y_num_col_dims") + // .Get(); + // DLOG << " Input X is : " + // << op->Input("X")[0]; + // } + // DLOG << "op:" << op->Type(); + if (op->Type() == "mul" && + op->Input("X")[0] == "pool2d_0.tmp_0") { + DLOG << " mul attr size: " << op->GetAttrMap().size(); + DLOG << " inputs size: " << op->GetInputs().size(); + DLOG << " outputs size: " << op->GetOutputs().size(); + DLOG << " Input X is : " << op->Input("X")[0]; + DLOG << " Input Y is : " << op->Input("Y")[0]; + DLOG << " Output Out is : " << op->Output("Out")[0]; + DLOG << "x_num_col_dims : " + << op->GetAttrMap().at("x_num_col_dims").Get(); + DLOG << "y_num_col_dims : " + << op->GetAttrMap().at("y_num_col_dims").Get(); + + std::shared_ptr> add = + std::make_shared>( + op->Type(), op->GetInputs(), op->GetOutputs(), + op->GetAttrMap(), program_.scope); + ops_of_block_[*block_desc.get()].push_back(add); + } + } + } + } + + std::shared_ptr predict_add(Tensor &t1, Tensor &t2) { + // feed + auto scope = program_.scope; + Variable *x_feed_value = scope->Var("pool2d_0.tmp_0"); + auto tensor_x = x_feed_value->GetMutable(); + tensor_x->ShareDataWith(t1); + + Variable *y_feed_value = scope->Var("fc_0.w_0"); + auto tensor_y = y_feed_value->GetMutable(); + tensor_y->ShareDataWith(t2); + + Variable *con_output = scope->Var("fc_0.tmp_0"); + Tensor *output_tensor = con_output->GetMutable(); + output_tensor->mutable_data({3, 3}); + // DLOG << typeid(output_tensor).name(); + // DLOG << "output_tensor dims: " << output_tensor->dims(); + + std::shared_ptr out_tensor = std::make_shared(); + out_tensor.reset(output_tensor); + + predict_add(t1, t2, 0); + return out_tensor; + } + + private: + const framework::Program program_; + std::shared_ptr to_predict_program_; + std::map>>> + ops_of_block_; + bool use_optimize_ = false; + + void predict_add(const Tensor &t1, const Tensor &t2, int block_id) { + std::shared_ptr to_predict_block = + to_predict_program_->Block(block_id); + for (int j = 0; j < ops_of_block_[*to_predict_block.get()].size(); + ++j) { + auto op = ops_of_block_[*to_predict_block.get()][j]; + DLOG << "op -> run()"; + op->Run(); + } + } + }; + + template + class TestMulOp; + } // namespace framework +} // namespaece paddle_mobile + +int main () { + DLOG << "----------**********----------"; + DLOG << "begin to run MulOp Test"; + paddle_mobile::Loader loader; + auto program = + loader.Load(std::string("../../../test/models/" + "image_classification_resnet.inference.model")); + + /// input x (3,2,1,1) + paddle_mobile::framework::Tensor inputx; + SetupTensor(&inputx, {3, 2, 1, 1}, static_cast(0), + static_cast(1)); + float *inputx_ptr = inputx.data(); + + /// input y (2,3) + paddle_mobile::framework::Tensor inputy; + SetupTensor(&inputy, {2, 3}, static_cast(0), + static_cast(1)); + float *inputy_ptr = inputy.data(); + + paddle_mobile::framework::TestMulOp testMulOp(program); + + auto output_mul = testMulOp.predict_add(inputx, inputy); + float *output_mul_ptr = output_mul->data(); + + auto dimx_1 = inputx.numel() / inputx.dims()[0]; + DLOG << " inputx : "; + for (int i = 0; i < inputx.dims()[0]; ++i) { + for (int j = 0; j < dimx_1; ++j) { + DLOGF("%f ", inputx_ptr[i * dimx_1 + j]); + } + DLOGF("\n"); + } + + auto dimy_1 = inputy.numel() / inputy.dims()[0]; + DLOG << " inputy : "; + for (int i = 0; i < inputy.dims()[0]; ++i) { + for (int j = 0; j < dimy_1; ++j) { + DLOGF("%f ", inputy_ptr[i * dimx_1 + j]); + } + DLOGF("\n"); + } + + auto dim_output_1 = output_mul->numel() / output_mul->dims()[0]; + DLOG << " output : "; + for (int i = 0; i < output_mul->dims()[0]; ++i) { + for (int j = 0; j < dim_output_1; ++j) { + DLOGF("%f ", output_mul_ptr[i * dimy_1 + j]); + } + DLOGF("\n"); + } + + /// output (3,3) + DLOG << "output memory size : " << output_mul->memory_size(); + DLOG << "output numel : " << output_mul->numel(); + + DLOG << inputx_ptr[0] << " x " << inputy_ptr[0] << " + " << inputx_ptr[1] + << " x " << inputy_ptr[0 + 3] << " = " << output_mul_ptr[0]; + return 0; +} -- GitLab