From 12be7ab4876f77fecfab903df70791623219b3da Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Tue, 3 Jul 2018 12:06:23 +0100 Subject: COMPMID-1310: Create graph validation executables. Change-Id: I9e0b57b1b83fe5a95777cdaeddba6ecef650bafc Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/138697 Reviewed-by: Anthony Barbier Tested-by: Jenkins --- examples/graph_vgg16.cpp | 105 +++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 62 deletions(-) (limited to 'examples/graph_vgg16.cpp') diff --git a/examples/graph_vgg16.cpp b/examples/graph_vgg16.cpp index d70c56eadd..5ff306507f 100644 --- a/examples/graph_vgg16.cpp +++ b/examples/graph_vgg16.cpp @@ -23,11 +23,10 @@ */ #include "arm_compute/graph.h" #include "support/ToolchainSupport.h" +#include "utils/CommonGraphOptions.h" #include "utils/GraphUtils.h" #include "utils/Utils.h" -#include - using namespace arm_compute::utils; using namespace arm_compute::graph::frontend; using namespace arm_compute::graph_utils; @@ -35,71 +34,47 @@ using namespace arm_compute::graph_utils; /** Example demonstrating how to implement VGG16's network using the Compute Library's graph API * * @param[in] argc Number of arguments - * @param[in] argv Arguments ( [optional] Target (0 = NEON, 1 = OpenCL, 2 = OpenCL with Tuner), [optional] Path to the weights folder, [optional] image, [optional] labels, [optional] Fast math for convolution layer (0 = DISABLED, 1 = ENABLED) ) + * @param[in] argv Arguments */ class GraphVGG16Example : public Example { public: - void do_setup(int argc, char **argv) override + GraphVGG16Example() + : cmd_parser(), common_opts(cmd_parser), common_params(), graph(0, "VGG16") { - std::string data_path; /* Path to the trainable data */ - std::string image; /* Image data */ - std::string label; /* Label data */ - - // Create a preprocessor object - const std::array mean_rgb{ { 123.68f, 116.779f, 103.939f } }; - std::unique_ptr preprocessor = arm_compute::support::cpp14::make_unique(mean_rgb); + } + bool do_setup(int argc, char **argv) override + { + // Parse arguments + cmd_parser.parse(argc, argv); - // Set target. 0 (NEON), 1 (OpenCL), 2 (OpenCL with Tuner). By default it is NEON - const int target = argc > 1 ? std::strtol(argv[1], nullptr, 10) : 0; - Target target_hint = set_target_hint(target); - FastMathHint fast_math_hint = FastMathHint::DISABLED; + // Consume common parameters + common_params = consume_common_graph_parameters(common_opts); - // Parse arguments - if(argc < 2) - { - // Print help - std::cout << "Usage: " << argv[0] << " [target] [path_to_data] [image] [labels] [fast_math_hint]\n\n"; - std::cout << "No data folder provided: using random values\n\n"; - } - else if(argc == 2) + // Return when help menu is requested + if(common_params.help) { - std::cout << "Usage: " << argv[0] << " " << argv[1] << " [path_to_data] [image] [labels] [fast_math_hint]\n\n"; - std::cout << "No data folder provided: using random values\n\n"; - } - else if(argc == 3) - { - data_path = argv[2]; - std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " [image] [labels] [fast_math_hint]\n\n"; - std::cout << "No image provided: using random values\n\n"; - } - else if(argc == 4) - { - data_path = argv[2]; - image = argv[3]; - std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " " << argv[3] << " [labels] [fast_math_hint]\n\n"; - std::cout << "No text file with labels provided: skipping output accessor\n\n"; - } - else if(argc == 5) - { - data_path = argv[2]; - image = argv[3]; - label = argv[4]; - std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " " << argv[3] << " " << argv[4] << " [fast_math_hint]\n\n"; - std::cout << "No fast math info provided: disabling fast math\n\n"; - } - else - { - data_path = argv[2]; - image = argv[3]; - label = argv[4]; - fast_math_hint = (std::strtol(argv[5], nullptr, 1) == 0) ? FastMathHint::DISABLED : FastMathHint::ENABLED; + cmd_parser.print_help(argv[0]); + return false; } - graph << target_hint - << fast_math_hint - << InputLayer(TensorDescriptor(TensorShape(224U, 224U, 3U, 1U), DataType::F32), - get_input_accessor(image, std::move(preprocessor))) + // Checks + ARM_COMPUTE_ERROR_ON_MSG(arm_compute::is_data_type_quantized_asymmetric(common_params.data_type), "Unsupported data type!"); + + // Print parameter values + std::cout << common_params << std::endl; + + // Get trainable parameters data path + std::string data_path = common_params.data_path; + + // Create a preprocessor object + const std::array mean_rgb{ { 123.68f, 116.779f, 103.939f } }; + std::unique_ptr preprocessor = arm_compute::support::cpp14::make_unique(mean_rgb); + + graph << common_params.target + << common_params.fast_math_hint + << InputLayer(TensorDescriptor(TensorShape(224U, 224U, 3U, 1U), common_params.data_type), + get_input_accessor(common_params, std::move(preprocessor))) // Layer 1 << ConvolutionLayer( 3U, 3U, 64U, @@ -231,12 +206,15 @@ public: .set_name("fc8") // Softmax << SoftmaxLayer().set_name("prob") - << OutputLayer(get_output_accessor(label, 5)); + << OutputLayer(get_output_accessor(common_params, 5)); // Finalize graph GraphConfig config; - config.use_tuner = (target == 2); - graph.finalize(target_hint, config); + config.num_threads = common_params.threads; + config.use_tuner = common_params.enable_tuner; + graph.finalize(common_params.target, config); + + return true; } void do_run() override { @@ -245,13 +223,16 @@ public: } private: - Stream graph{ 0, "VGG16" }; + CommandLineParser cmd_parser; + CommonGraphOptions common_opts; + CommonGraphParams common_params; + Stream graph; }; /** Main program for VGG16 * * @param[in] argc Number of arguments - * @param[in] argv Arguments ( [optional] Target (0 = NEON, 1 = OpenCL, 2 = OpenCL with Tuner), [optional] Path to the weights folder, [optional] image, [optional] labels, [optional] Fast math for convolution layer (0 = DISABLED, 1 = ENABLED) ) + * @param[in] argv Arguments */ int main(int argc, char **argv) { -- cgit v1.2.1