41 class InceptionV4Example final :
public Example 44 void do_setup(
int argc,
char **argv)
override 49 std::string data_path;
54 std::unique_ptr<IPreprocessor> preprocessor = arm_compute::support::cpp14::make_unique<TFPreproccessor>();
57 const int target = argc > 1 ? std::strtol(argv[1],
nullptr, 10) : 0;
65 std::cout <<
"Usage: " << argv[0] <<
" [target] [path_to_data] [image] [labels] [fast_math_hint]\n\n";
66 std::cout <<
"No data folder provided: using random values\n\n";
70 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" [path_to_data] [image] [labels] [fast_math_hint]\n\n";
71 std::cout <<
"No data folder provided: using random values\n\n";
76 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" " << argv[2] <<
" [image] [labels] [fast_math_hint]\n\n";
77 std::cout <<
"No image provided: using random values\n\n";
83 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" " << argv[2] <<
" " << argv[3] <<
" [labels] [fast_math_hint]\n\n";
84 std::cout <<
"No text file with labels provided: skipping output accessor\n\n";
91 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" " << argv[2] <<
" " << argv[3] <<
" " << argv[4] <<
" [fast_math_hint]\n\n";
92 std::cout <<
"No fast math info provided: disabling fast math\n\n";
99 fast_math_hint = (std::strtol(argv[5],
nullptr, 1) == 0) ? FastMathHint::DISABLED : FastMathHint::ENABLED;
109 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
111 get_weights_accessor(data_path,
"/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
113 get_weights_accessor(data_path,
"/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_beta.npy"),
119 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
121 get_weights_accessor(data_path,
"/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_moving_variance.npy"),
123 get_weights_accessor(data_path,
"/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_beta.npy"),
129 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
131 get_weights_accessor(data_path,
"/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_moving_variance.npy"),
133 get_weights_accessor(data_path,
"/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_beta.npy"),
137 graph << get_mixed_3a(data_path);
138 graph << get_mixed_4a(data_path);
139 graph << get_mixed_5a(data_path);
141 graph << get_inceptionA_block(data_path,
"Mixed_5b");
142 graph << get_inceptionA_block(data_path,
"Mixed_5c");
143 graph << get_inceptionA_block(data_path,
"Mixed_5d");
144 graph << get_inceptionA_block(data_path,
"Mixed_5e");
146 graph << get_reductionA_block(data_path);
148 graph << get_inceptionB_block(data_path,
"Mixed_6b");
149 graph << get_inceptionB_block(data_path,
"Mixed_6c");
150 graph << get_inceptionB_block(data_path,
"Mixed_6d");
151 graph << get_inceptionB_block(data_path,
"Mixed_6e");
152 graph << get_inceptionB_block(data_path,
"Mixed_6f");
153 graph << get_inceptionB_block(data_path,
"Mixed_6g");
154 graph << get_inceptionB_block(data_path,
"Mixed_6h");
156 graph << get_reductionB_block(data_path);
158 graph << get_inceptionC_block(data_path,
"Mixed_7b");
159 graph << get_inceptionC_block(data_path,
"Mixed_7c");
160 graph << get_inceptionC_block(data_path,
"Mixed_7d");
172 config.use_tuner = (target == 2);
173 graph.finalize(target_hint, config);
181 void do_run()
override 189 Stream graph{ 0,
"InceptionV4" };
192 BranchLayer get_mixed_3a(
const std::string &data_path)
194 std::string total_path =
"/cnn_data/inceptionv4_model/Mixed_3a_";
202 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
204 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_3x3_BatchNorm_moving_variance.npy"),
210 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
213 BranchLayer get_mixed_4a(
const std::string &data_path)
215 std::string total_path =
"/cnn_data/inceptionv4_model/Mixed_4a_";
220 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
222 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
229 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
231 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
240 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
242 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
249 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 3, 0))
251 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
258 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 3))
260 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
267 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
269 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
275 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
278 BranchLayer get_mixed_5a(
const std::string &data_path)
280 std::string total_path =
"/cnn_data/inceptionv4_model/Mixed_5a_";
285 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
287 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
296 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
299 BranchLayer get_inceptionA_block(
const std::string &data_path, std::string &¶m_path)
301 std::string total_path =
"/cnn_data/inceptionv4_model/" + param_path +
"_";
306 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
308 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
317 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
319 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
326 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
328 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
337 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
339 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
346 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
348 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
355 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
357 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_3x3_BatchNorm_moving_variance.npy"),
367 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
369 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
375 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
378 BranchLayer get_reductionA_block(
const std::string &data_path)
380 std::string total_path =
"/cnn_data/inceptionv4_model/Mixed_6a_";
385 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
387 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
396 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
398 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
405 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
407 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
414 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
416 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
425 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
428 BranchLayer get_inceptionB_block(
const std::string &data_path, std::string &¶m_path)
430 std::string total_path =
"/cnn_data/inceptionv4_model/" + param_path +
"_";
435 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
437 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
446 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
448 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
455 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 3, 0))
457 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
464 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 3))
466 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
475 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
477 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
484 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 3))
486 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_7x1_BatchNorm_moving_variance.npy"),
493 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 3, 0))
495 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_1x7_BatchNorm_moving_variance.npy"),
502 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 3))
504 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0d_7x1_BatchNorm_moving_variance.npy"),
511 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 3, 0))
513 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0e_1x7_BatchNorm_moving_variance.npy"),
523 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
525 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
531 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
534 BranchLayer get_reductionB_block(
const std::string &data_path)
536 std::string total_path =
"/cnn_data/inceptionv4_model/Mixed_7a_";
541 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
543 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
550 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
552 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
561 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
563 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
570 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 3, 0))
572 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
579 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 3))
581 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
588 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
590 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
599 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
602 BranchLayer get_inceptionC_block(
const std::string &data_path, std::string &¶m_path)
604 std::string total_path =
"/cnn_data/inceptionv4_model/" + param_path +
"_";
609 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
611 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
621 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
622 PadStrideInfo(1, 1, 0, 0))
624 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
625 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
631 SubStream i_b1(static_cast<IStream &>(i_b));
635 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
636 PadStrideInfo(1, 1, 1, 0))
638 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x3_BatchNorm_moving_mean.npy"),
639 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x3_BatchNorm_moving_variance.npy"),
645 SubStream i_b2(static_cast<IStream &>(i_b));
649 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
650 PadStrideInfo(1, 1, 0, 1))
652 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_3x1_BatchNorm_moving_mean.npy"),
653 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_3x1_BatchNorm_moving_variance.npy"),
660 i_b <<
BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_b1), std::move(i_b2));
666 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
667 PadStrideInfo(1, 1, 0, 0))
669 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
670 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
678 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
679 PadStrideInfo(1, 1, 0, 1))
681 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_3x1_BatchNorm_moving_mean.npy"),
682 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_3x1_BatchNorm_moving_variance.npy"),
690 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
691 PadStrideInfo(1, 1, 1, 0))
693 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_1x3_BatchNorm_moving_mean.npy"),
694 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_1x3_BatchNorm_moving_variance.npy"),
700 SubStream i_c1(static_cast<IStream &>(i_c));
704 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
705 PadStrideInfo(1, 1, 1, 0))
707 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0d_1x3_BatchNorm_moving_mean.npy"),
708 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0d_1x3_BatchNorm_moving_variance.npy"),
714 SubStream i_c2(static_cast<IStream &>(i_c));
718 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
719 PadStrideInfo(1, 1, 0, 1))
721 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0e_3x1_BatchNorm_moving_mean.npy"),
722 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0e_3x1_BatchNorm_moving_variance.npy"),
729 i_c <<
BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_c1), std::move(i_c2));
735 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
737 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
743 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
752 int main(
int argc,
char **argv)
754 return arm_compute::utils::run_example<InceptionV4Example>(argc, argv);
graph::Target set_target_hint(int target)
Utility function to return the TargetHint.
std::unique_ptr< graph::ITensorAccessor > get_output_accessor(const std::string &labels_path, size_t top_n=5, std::ostream &output_stream=std::cout)
Generates appropriate output accessor according to the specified labels_path.
1 channel, 1 F32 per channel
This file contains all available output stages for GEMMLowp on OpenCL.
std::unique_ptr< graph::ITensorAccessor > get_random_accessor(PixelValue lower, PixelValue upper, const std::random_device::result_type seed=0)
Generates appropriate random accessor.
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
int main(int argc, char **argv)
Main program for Inception V4.
std::unique_ptr< graph::ITensorAccessor > get_input_accessor(const std::string &ppm_path, std::unique_ptr< IPreprocessor > preprocessor=nullptr, bool bgr=true)
Generates appropriate input accessor according to the specified ppm_path.
FastMathHint
Enable or disable fast math for Convolution layer.
std::unique_ptr< graph::ITensorAccessor > get_weights_accessor(const std::string &path, const std::string &data_file, DataLayout file_layout=DataLayout::NCHW)
Generates appropriate weights accessor according to the specified path.
Stream frontend class to construct simple graphs in a stream fashion.
Batchnormalization Layer.