From e267d2b5a614f3ef1b5186001f3dd5bb650aa41c Mon Sep 17 00:00:00 2001 From: Yuan Shuai Date: Mon, 23 Mar 2020 16:17:42 +0800 Subject: [PATCH] [LITE][TEST] Enhance mobilenet test, mobile_light demo (#3245) * Ehance mobilenetv1/v2, add std_dev computation. test=develop * Ehance cxx mobile_light demo, add std_dev computation. test=develop --- lite/api/mobilenetv1_test.cc | 20 ++++----- lite/api/mobilenetv2_test.cc | 20 ++++----- lite/api/test_helper.h | 27 ++++++++++++ .../cxx/mobile_light/mobilenetv1_light_api.cc | 41 +++++++++++++++---- 4 files changed, 81 insertions(+), 27 deletions(-) diff --git a/lite/api/mobilenetv1_test.cc b/lite/api/mobilenetv1_test.cc index 9164129dcf..fff27c8156 100644 --- a/lite/api/mobilenetv1_test.cc +++ b/lite/api/mobilenetv1_test.cc @@ -119,21 +119,21 @@ void TestModel(const std::vector& valid_places, // Get detailed result size_t output_tensor_num = predictor.GetOutputNames().size(); - VLOG(1) << "output tesnor num:" << output_tensor_num; + VLOG(1) << "output tensor num:" << output_tensor_num; for (size_t tidx = 0; tidx < output_tensor_num; ++tidx) { auto* output_tensor = predictor.GetOutput(tidx); VLOG(1) << "============= output tensor " << tidx << " =============\n"; auto out_dims = output_tensor->dims(); - VLOG(1) << "out_dims:" << out_dims; - - float sum = 0.f; - for (int i = 0; i < out_dims.production(); ++i) { - sum += output_tensor->data()[i]; - } - VLOG(1) << "out_dims.production():" << out_dims.production(); - VLOG(1) << "output tensor sum value:" << sum; - VLOG(1) << "output tensor mean value:" << sum / out_dims.production(); + auto out_data = output_tensor->data(); + auto out_mean = compute_mean(out_data, out_dims.production()); + auto out_std_dev = compute_standard_deviation( + out_data, out_dims.production(), true, out_mean); + + VLOG(1) << "output tensor dims:" << out_dims; + VLOG(1) << "output tensor elements num:" << out_dims.production(); + VLOG(1) << "output tensor standard deviation:" << out_std_dev; + VLOG(1) << "output tensor mean value:" << out_mean; // print result for (int i = 0; i < out_dims.production(); ++i) { diff --git a/lite/api/mobilenetv2_test.cc b/lite/api/mobilenetv2_test.cc index 26b9dc93da..c2959bf88d 100644 --- a/lite/api/mobilenetv2_test.cc +++ b/lite/api/mobilenetv2_test.cc @@ -121,21 +121,21 @@ void TestModel(const std::vector& valid_places, // Get detailed result size_t output_tensor_num = predictor.GetOutputNames().size(); - VLOG(1) << "output tesnor num:" << output_tensor_num; + VLOG(1) << "output tensor num:" << output_tensor_num; for (size_t tidx = 0; tidx < output_tensor_num; ++tidx) { auto* output_tensor = predictor.GetOutput(tidx); VLOG(1) << "============= output tensor " << tidx << " =============\n"; auto out_dims = output_tensor->dims(); - VLOG(1) << "out_dims:" << out_dims; - - float sum = 0.f; - for (int i = 0; i < out_dims.production(); ++i) { - sum += output_tensor->data()[i]; - } - VLOG(1) << "out_dims.production():" << out_dims.production(); - VLOG(1) << "output tensor sum value:" << sum; - VLOG(1) << "output tensor mean value:" << sum / out_dims.production(); + auto out_data = output_tensor->data(); + auto out_mean = compute_mean(out_data, out_dims.production()); + auto out_std_dev = compute_standard_deviation( + out_data, out_dims.production(), true, out_mean); + + VLOG(1) << "output tensor dims:" << out_dims; + VLOG(1) << "output tensor elements num:" << out_dims.production(); + VLOG(1) << "output tensor standard deviation:" << out_std_dev; + VLOG(1) << "output tensor mean value:" << out_mean; // print result for (int i = 0; i < out_dims.production(); ++i) { diff --git a/lite/api/test_helper.h b/lite/api/test_helper.h index 71752c942b..a17fc33131 100644 --- a/lite/api/test_helper.h +++ b/lite/api/test_helper.h @@ -17,6 +17,7 @@ #include #include #include +#include // for eval DEFINE_string(model_dir, "", "model dir"); @@ -43,5 +44,31 @@ inline double GetCurrentUS() { return 1e+6 * time.tv_sec + time.tv_usec; } +template +double compute_mean(const T* in, const size_t length) { + double sum = 0.; + for (size_t i = 0; i < length; ++i) { + sum += in[i]; + } + return sum / length; +} + +template +double compute_standard_deviation(const T* in, + const size_t length, + bool has_mean = false, + double mean = 10000) { + if (!has_mean) { + mean = compute_mean(in, length); + } + + double variance = 0.; + for (size_t i = 0; i < length; ++i) { + variance += pow((in[i] - mean), 2); + } + variance /= length; + return sqrt(variance); +} + } // namespace lite } // namespace paddle diff --git a/lite/demo/cxx/mobile_light/mobilenetv1_light_api.cc b/lite/demo/cxx/mobile_light/mobilenetv1_light_api.cc index 9f836c57a8..150bcd231c 100644 --- a/lite/demo/cxx/mobile_light/mobilenetv1_light_api.cc +++ b/lite/demo/cxx/mobile_light/mobilenetv1_light_api.cc @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -36,6 +37,32 @@ std::string ShapePrint(const shape_t& shape) { return shape_str; } +template +double compute_mean(const T* in, const size_t length) { + double sum = 0.; + for (size_t i = 0; i < length; ++i) { + sum += in[i]; + } + return sum / length; +} + +template +double compute_standard_deviation(const T* in, + const size_t length, + bool has_mean = false, + double mean = 10000) { + if (!has_mean) { + mean = compute_mean(in, length); + } + + double variance = 0.; + for (size_t i = 0; i < length; ++i) { + variance += pow((in[i] - mean), 2); + } + variance /= length; + return sqrt(variance); +} + inline double GetCurrentUS() { struct timeval time; gettimeofday(&time, NULL); @@ -108,17 +135,17 @@ void RunModel(std::string model_dir, predictor->GetOutput(tidx); std::cout << "\n--- output tensor " << tidx << " ---" << std::endl; auto out_shape = output_tensor->shape(); - std::cout << "out_shape(NCHW):" << ShapePrint(out_shape) << std::endl; + auto out_data = output_tensor->data(); + auto out_mean = compute_mean(out_data, ShapeProduction(out_shape)); + auto out_std_dev = compute_standard_deviation( + out_data, ShapeProduction(out_shape), true, out_mean); - float sum = 0.f; - for (int i = 0; i < ShapeProduction(out_shape); ++i) { - sum += output_tensor->data()[i]; - } + std::cout << "output shape(NCHW):" << ShapePrint(out_shape) << std::endl; std::cout << "output tensor " << tidx << " elem num:" << ShapeProduction(out_shape) << std::endl; - std::cout << "output tensor " << tidx << " sum value:" << sum << std::endl; std::cout << "output tensor " << tidx - << " mean value:" << sum / ShapeProduction(out_shape) + << " standard deviation:" << out_std_dev << std::endl; + std::cout << "output tensor " << tidx << " mean value:" << out_mean << std::endl; // print output -- GitLab