41 class InceptionV3Example :
public Example 44 void do_setup(
int argc,
char **argv)
override 46 std::string data_path;
51 std::unique_ptr<IPreprocessor> preprocessor = arm_compute::support::cpp14::make_unique<TFPreproccessor>();
54 const int target = argc > 1 ? std::strtol(argv[1],
nullptr, 10) : 0;
62 std::cout <<
"Usage: " << argv[0] <<
" [target] [path_to_data] [image] [labels] [fast_math_hint]\n\n";
63 std::cout <<
"No data folder provided: using random values\n\n";
67 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" [path_to_data] [image] [labels] [fast_math_hint]\n\n";
68 std::cout <<
"No data folder provided: using random values\n\n";
73 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" " << argv[2] <<
" [image] [labels] [fast_math_hint]\n\n";
74 std::cout <<
"No image provided: using random values\n\n";
80 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" " << argv[2] <<
" " << argv[3] <<
" [labels] [fast_math_hint]\n\n";
81 std::cout <<
"No text file with labels provided: skipping output accessor\n\n";
88 std::cout <<
"Usage: " << argv[0] <<
" " << argv[1] <<
" " << argv[2] <<
" " << argv[3] <<
" " << argv[4] <<
" [fast_math_hint]\n\n";
89 std::cout <<
"No fast math info provided: disabling fast math\n\n";
96 fast_math_hint = (std::strtol(argv[5],
nullptr, 1) == 0) ? FastMathHint::DISABLED : FastMathHint::ENABLED;
105 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 0, 0))
106 .
set_name(
"Conv2d_1a_3x3/convolution")
108 "/cnn_data/inceptionv3_model/Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
110 "/cnn_data/inceptionv3_model/Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
112 "/cnn_data/inceptionv3_model/Conv2d_1a_3x3_BatchNorm_beta.npy"),
114 .
set_name(
"Conv2d_1a_3x3/BatchNorm/batchnorm")
118 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
119 .
set_name(
"Conv2d_2a_3x3/convolution")
121 "/cnn_data/inceptionv3_model/Conv2d_2a_3x3_BatchNorm_moving_mean.npy"),
123 "/cnn_data/inceptionv3_model/Conv2d_2a_3x3_BatchNorm_moving_variance.npy"),
125 "/cnn_data/inceptionv3_model/Conv2d_2a_3x3_BatchNorm_beta.npy"),
127 .
set_name(
"Conv2d_2a_3x3/BatchNorm/batchnorm")
132 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 1, 1))
133 .
set_name(
"Conv2d_2b_3x3/convolution")
135 "/cnn_data/inceptionv3_model/Conv2d_2b_3x3_BatchNorm_moving_mean.npy"),
137 "/cnn_data/inceptionv3_model/Conv2d_2b_3x3_BatchNorm_moving_variance.npy"),
139 "/cnn_data/inceptionv3_model/Conv2d_2b_3x3_BatchNorm_beta.npy"),
141 .
set_name(
"Conv2d_2b_3x3/BatchNorm/batchnorm")
148 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
149 .
set_name(
"Conv2d_3b_1x1/convolution")
151 "/cnn_data/inceptionv3_model/Conv2d_3b_1x1_BatchNorm_moving_mean.npy"),
153 "/cnn_data/inceptionv3_model/Conv2d_3b_1x1_BatchNorm_moving_variance.npy"),
155 "/cnn_data/inceptionv3_model/Conv2d_3b_1x1_BatchNorm_beta.npy"),
157 .
set_name(
"Conv2d_3b_1x1/BatchNorm/batchnorm")
162 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
163 .
set_name(
"Conv2d_4a_3x3/convolution")
165 "/cnn_data/inceptionv3_model/Conv2d_4a_3x3_BatchNorm_moving_mean.npy"),
167 "/cnn_data/inceptionv3_model/Conv2d_4a_3x3_BatchNorm_moving_variance.npy"),
169 "/cnn_data/inceptionv3_model/Conv2d_4a_3x3_BatchNorm_beta.npy"),
171 .
set_name(
"Conv2d_4a_3x3/BatchNorm/batchnorm")
176 graph << get_inception_node_A(data_path,
"Mixed_5b", 64U, std::make_tuple(48U, 64U), std::make_tuple(64U, 96U, 96U),
179 graph << get_inception_node_A(data_path,
"Mixed_5c", 64U, std::make_tuple(48U, 64U), std::make_tuple(64U, 96U, 96U),
182 graph << get_inception_node_A(data_path,
"Mixed_5d", 64U, std::make_tuple(48U, 64U), std::make_tuple(64U, 96U, 96U),
186 graph << get_inception_node_B(data_path,
"Mixed_6a", 384U, std::make_tuple(64U, 96U, 96U)).
set_name(
"Mixed_6a/concat");
188 graph << get_inception_node_C(data_path,
"Mixed_6b", 192U, std::make_tuple(128U, 128U, 192U),
189 std::make_tuple(128U, 128U, 128U, 128U, 192U), 192U)
191 graph << get_inception_node_C(data_path,
"Mixed_6c", 192U, std::make_tuple(160U, 160U, 192U),
192 std::make_tuple(160U, 160U, 160U, 160U, 192U), 192U)
194 graph << get_inception_node_C(data_path,
"Mixed_6d", 192U, std::make_tuple(160U, 160U, 192U),
195 std::make_tuple(160U, 160U, 160U, 160U, 192U), 192U)
197 graph << get_inception_node_C(data_path,
"Mixed_6e", 192U, std::make_tuple(192U, 192U, 192U),
198 std::make_tuple(192U, 192U, 192U, 192U, 192U), 192U)
201 graph << get_inception_node_D(data_path,
"Mixed_7a", std::make_tuple(192U, 320U),
202 std::make_tuple(192U, 192U, 192U, 192U))
205 graph << get_inception_node_E(data_path,
"Mixed_7b", 320U, std::make_tuple(384U, 384U, 384U),
206 std::make_tuple(448U, 384U, 384U, 384U), 192U)
208 graph << get_inception_node_E(data_path,
"Mixed_7c", 320U, std::make_tuple(384U, 384U, 384U),
209 std::make_tuple(448U, 384U, 384U, 384U), 192U,
true)
214 "/cnn_data/inceptionv3_model/Logits_Conv2d_1c_1x1_weights.npy"),
216 "/cnn_data/inceptionv3_model/Logits_Conv2d_1c_1x1_biases.npy"),
217 PadStrideInfo(1, 1, 0, 0))
218 .
set_name(
"Logits/Conv2d_1c_1x1/convolution")
225 config.use_tuner = (target == 2);
226 graph.finalize(target_hint, config);
229 void do_run()
override 235 Stream graph{ 0,
"InceptionV3" };
238 BranchLayer get_inception_node_A(
const std::string &data_path, std::string &¶m_path,
240 std::tuple<unsigned int, unsigned int> b_filters,
241 std::tuple<unsigned int, unsigned int, unsigned int> c_filters,
243 bool is_name_different =
false)
245 std::string total_path =
"/cnn_data/inceptionv3_model/" + param_path +
"_";
248 std::string conv_id0 =
"_0a_";
249 std::string conv_id1 =
"2d_0b_";
250 if(is_name_different)
260 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
261 PadStrideInfo(1, 1, 0, 0))
262 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/convolution")
264 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
265 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
269 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/BatchNorm/batchnorm")
274 1U, 1U, std::get<0>(b_filters),
276 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
277 PadStrideInfo(1, 1, 0, 0))
278 .
set_name(param_path +
"/Branch_1/Conv2d" + conv_id0 +
"1x1/convolution")
280 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d" + conv_id0 +
"1x1_BatchNorm_moving_mean.npy"),
281 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d" + conv_id0 +
"1x1_BatchNorm_moving_variance.npy"),
283 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d" + conv_id0 +
"1x1_BatchNorm_beta.npy"),
285 .
set_name(param_path +
"/Branch_1/Conv2d" + conv_id0 +
"1x1/BatchNorm/batchnorm")
288 5U, 5U, std::get<1>(b_filters),
290 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
291 PadStrideInfo(1, 1, 2, 2))
292 .
set_name(param_path +
"/Branch_1/Conv2d" + conv_id1 +
"5x5/convolution")
294 get_weights_accessor(data_path, total_path +
"Branch_1_Conv" + conv_id1 +
"5x5_BatchNorm_moving_mean.npy"),
295 get_weights_accessor(data_path, total_path +
"Branch_1_Conv" + conv_id1 +
"5x5_BatchNorm_moving_variance.npy"),
297 get_weights_accessor(data_path, total_path +
"Branch_1_Conv" + conv_id1 +
"5x5_BatchNorm_beta.npy"),
299 .
set_name(param_path +
"/Branch_1/Conv2d" + conv_id1 +
"5x5/BatchNorm/batchnorm")
304 1U, 1U, std::get<0>(c_filters),
306 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
307 PadStrideInfo(1, 1, 0, 0))
308 .
set_name(param_path +
"/Branch_2/Conv2d_0a_1x1/convolution")
310 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
311 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
315 .
set_name(param_path +
"/Branch_2/Conv2d_0a_1x1/BatchNorm/batchnorm")
318 3U, 3U, std::get<1>(c_filters),
320 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
321 PadStrideInfo(1, 1, 1, 1))
322 .
set_name(param_path +
"/Branch_2/Conv2d_0b_3x3/convolution")
324 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
325 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
329 .
set_name(param_path +
"/Branch_2/Conv2d_0b_3x3/BatchNorm/batchnorm")
332 3U, 3U, std::get<2>(c_filters),
334 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
335 PadStrideInfo(1, 1, 1, 1))
336 .
set_name(param_path +
"/Branch_2/Conv2d_0c_3x3/convolution")
338 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_3x3_BatchNorm_moving_mean.npy"),
339 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_3x3_BatchNorm_moving_variance.npy"),
343 .
set_name(param_path +
"/Branch_2/Conv2d_0c_3x3/BatchNorm/batcnorm")
351 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
352 PadStrideInfo(1, 1, 0, 0))
353 .
set_name(param_path +
"/Branch_3/Conv2d_0b_1x1/convolution")
355 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
356 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
360 .
set_name(param_path +
"/Branch_3/Conv2d_0b_1x1/BatchNorm/batchnorm")
363 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
366 BranchLayer get_inception_node_B(
const std::string &data_path, std::string &¶m_path,
368 std::tuple<unsigned int, unsigned int, unsigned int> b_filters)
370 std::string total_path =
"/cnn_data/inceptionv3_model/" + param_path +
"_";
375 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
376 PadStrideInfo(2, 2, 0, 0))
377 .
set_name(param_path +
"/Branch_0/Conv2d_1a_1x1/convolution")
379 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_1x1_BatchNorm_moving_mean.npy"),
380 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_1x1_BatchNorm_moving_variance.npy"),
384 .
set_name(param_path +
"/Branch_0/Conv2d_1a_1x1/BatchNorm/batchnorm")
389 1U, 1U, std::get<0>(b_filters),
391 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
392 PadStrideInfo(1, 1, 0, 0))
393 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/convolution")
395 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
396 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
400 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/BatchNorm/batchnorm")
403 3U, 3U, std::get<1>(b_filters),
405 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
406 PadStrideInfo(1, 1, 1, 1))
407 .
set_name(param_path +
"/Branch_1/Conv2d_0b_3x3/convolution")
409 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
410 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
414 .
set_name(param_path +
"/Branch_1/Conv2d_0b_3x3/BatchNorm/batchnorm")
417 3U, 3U, std::get<2>(b_filters),
419 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
420 PadStrideInfo(2, 2, 0, 0))
421 .
set_name(param_path +
"/Branch_1/Conv2d_1a_1x1/convolution")
423 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_1a_1x1_BatchNorm_moving_mean.npy"),
424 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_1a_1x1_BatchNorm_moving_variance.npy"),
428 .
set_name(param_path +
"/Branch_1/Conv2d_1a_1x1/BatchNorm/batchnorm")
434 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
437 BranchLayer get_inception_node_C(
const std::string &data_path, std::string &¶m_path,
439 std::tuple<unsigned int, unsigned int, unsigned int> b_filters,
440 std::tuple<unsigned int, unsigned int, unsigned int, unsigned int, unsigned int> c_filters,
443 std::string total_path =
"/cnn_data/inceptionv3_model/" + param_path +
"_";
448 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
449 PadStrideInfo(1, 1, 0, 0))
450 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/convolution")
452 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
453 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
457 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/BatchNorm/batchnorm")
462 1U, 1U, std::get<0>(b_filters),
464 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
465 PadStrideInfo(1, 1, 0, 0))
466 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/convolution")
468 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
469 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
473 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/BatchNorm/batchnorm")
476 7U, 1U, std::get<1>(b_filters),
478 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
479 PadStrideInfo(1, 1, 3, 0))
480 .
set_name(param_path +
"/Branch_1/Conv2d_0b_1x7/convolution")
482 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
483 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
487 .
set_name(param_path +
"/Branch_1/Conv2d_0b_1x7/BatchNorm/batchnorm")
490 1U, 7U, std::get<2>(b_filters),
492 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
493 PadStrideInfo(1, 1, 0, 3))
494 .
set_name(param_path +
"/Branch_1/Conv2d_0c_7x1/convolution")
496 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
497 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
501 .
set_name(param_path +
"/Branch_1/Conv2d_0c_7x1/BatchNorm/batchnorm")
506 1U, 1U, std::get<0>(c_filters),
508 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
509 PadStrideInfo(1, 1, 0, 0))
510 .
set_name(param_path +
"/Branch_2/Conv2d_0a_1x1/convolution")
512 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
513 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
517 .
set_name(param_path +
"/Branch_2/Conv2d_0a_1x1/BatchNorm/batchnorm")
520 1U, 7U, std::get<1>(c_filters),
522 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
523 PadStrideInfo(1, 1, 0, 3))
524 .
set_name(param_path +
"/Branch_2/Conv2d_0b_7x1/convolution")
526 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_7x1_BatchNorm_moving_mean.npy"),
527 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_7x1_BatchNorm_moving_variance.npy"),
531 .
set_name(param_path +
"/Branch_2/Conv2d_0b_7x1/BatchNorm/batchnorm")
534 7U, 1U, std::get<2>(c_filters),
536 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
537 PadStrideInfo(1, 1, 3, 0))
538 .
set_name(param_path +
"/Branch_2/Conv2d_0c_1x7/convolution")
540 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_1x7_BatchNorm_moving_mean.npy"),
541 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_1x7_BatchNorm_moving_variance.npy"),
545 .
set_name(param_path +
"/Branch_2/Conv2d_0c_1x7/BatchNorm/batchnorm")
548 1U, 7U, std::get<3>(c_filters),
550 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
551 PadStrideInfo(1, 1, 0, 3))
552 .
set_name(param_path +
"/Branch_2/Conv2d_0d_7x1/convolution")
554 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0d_7x1_BatchNorm_moving_mean.npy"),
555 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0d_7x1_BatchNorm_moving_variance.npy"),
559 .
set_name(param_path +
"/Branch_2/Conv2d_0d_7x1/BatchNorm/batchnorm")
562 7U, 1U, std::get<4>(c_filters),
564 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
565 PadStrideInfo(1, 1, 3, 0))
566 .
set_name(param_path +
"/Branch_2/Conv2d_0e_1x7/convolution")
568 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0e_1x7_BatchNorm_moving_mean.npy"),
569 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0e_1x7_BatchNorm_moving_variance.npy"),
573 .
set_name(param_path +
"/Branch_2/Conv2d_0e_1x7/BatchNorm/batchnorm")
581 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
582 PadStrideInfo(1, 1, 0, 0))
583 .
set_name(param_path +
"/Branch_3/Conv2d_0b_1x1/convolution")
585 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
586 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
590 .
set_name(param_path +
"/Branch_3/Conv2d_0b_1x1/BatchNorm/batchnorm")
593 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
596 BranchLayer get_inception_node_D(
const std::string &data_path, std::string &¶m_path,
597 std::tuple<unsigned int, unsigned int> a_filters,
598 std::tuple<unsigned int, unsigned int, unsigned int, unsigned int> b_filters)
600 std::string total_path =
"/cnn_data/inceptionv3_model/" + param_path +
"_";
603 1U, 1U, std::get<0>(a_filters),
605 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
606 PadStrideInfo(1, 1, 0, 0))
607 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/convolution")
609 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
610 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
614 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/BatchNorm/batchnorm")
617 3U, 3U, std::get<1>(a_filters),
619 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
620 PadStrideInfo(2, 2, 0, 0))
621 .
set_name(param_path +
"/Branch_0/Conv2d_1a_3x3/convolution")
623 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
624 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
628 .
set_name(param_path +
"/Branch_0/Conv2d_1a_3x3/BatchNorm/batchnorm")
633 1U, 1U, std::get<0>(b_filters),
635 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
636 PadStrideInfo(1, 1, 0, 0))
637 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/convolution")
639 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
640 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
644 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/BatchNorm/batchnorm")
647 7U, 1U, std::get<1>(b_filters),
649 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
650 PadStrideInfo(1, 1, 3, 0))
651 .
set_name(param_path +
"/Branch_1/Conv2d_0b_1x7/convolution")
653 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
654 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
658 .
set_name(param_path +
"/Branch_1/Conv2d_0b_1x7/BatchNorm/batchnorm")
661 1U, 7U, std::get<2>(b_filters),
663 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
664 PadStrideInfo(1, 1, 0, 3))
665 .
set_name(param_path +
"/Branch_1/Conv2d_0c_7x1/convolution")
667 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
668 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
672 .
set_name(param_path +
"/Branch_1/Conv2d_0c_7x1/BatchNorm/batchnorm")
675 3U, 3U, std::get<3>(b_filters),
677 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
678 PadStrideInfo(2, 2, 0, 0))
679 .
set_name(param_path +
"/Branch_1/Conv2d_1a_3x3/convolution")
681 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
682 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
686 .
set_name(param_path +
"/Branch_1/Conv2d_1a_3x3/BatchNorm/batchnorm")
692 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
695 BranchLayer get_inception_node_E(
const std::string &data_path, std::string &¶m_path,
697 std::tuple<unsigned int, unsigned int, unsigned int> b_filters,
698 std::tuple<unsigned int, unsigned int, unsigned int, unsigned int> c_filters,
700 bool is_name_different =
false)
703 std::string conv_id =
"_0b_";
704 if(is_name_different)
709 std::string total_path =
"/cnn_data/inceptionv3_model/" + param_path +
"_";
714 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
715 PadStrideInfo(1, 1, 0, 0))
716 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/convolution")
718 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
719 get_weights_accessor(data_path, total_path +
"Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
723 .
set_name(param_path +
"/Branch_0/Conv2d_0a_1x1/BatchNorm/batchnorm")
728 1U, 1U, std::get<0>(b_filters),
730 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
731 PadStrideInfo(1, 1, 0, 0))
732 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/convolution")
734 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
735 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
739 .
set_name(param_path +
"/Branch_1/Conv2d_0a_1x1/BatchNorm/batchnorm")
742 SubStream i_b1(static_cast<IStream &>(i_b));
744 3U, 1U, std::get<1>(b_filters),
746 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
747 PadStrideInfo(1, 1, 1, 0))
748 .
set_name(param_path +
"/Branch_1/Conv2d_0b_1x3/convolution")
750 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x3_BatchNorm_moving_mean.npy"),
751 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d_0b_1x3_BatchNorm_moving_variance.npy"),
755 .
set_name(param_path +
"/Branch_1/Conv2d_0b_1x3/BatchNorm/batchnorm")
758 SubStream i_b2(static_cast<IStream &>(i_b));
760 1U, 3U, std::get<2>(b_filters),
762 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
763 PadStrideInfo(1, 1, 0, 1))
764 .
set_name(param_path +
"/Branch_1/Conv2d" + conv_id +
"3x1/convolution")
766 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d" + conv_id +
"3x1_BatchNorm_moving_mean.npy"),
767 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d" + conv_id +
"3x1_BatchNorm_moving_variance.npy"),
769 get_weights_accessor(data_path, total_path +
"Branch_1_Conv2d" + conv_id +
"3x1_BatchNorm_beta.npy"),
771 .
set_name(param_path +
"/Branch_1/Conv2d" + conv_id +
"3x1/BatchNorm/batchnorm")
775 i_b <<
BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_b1), std::move(i_b2)).
set_name(param_path +
"/Branch_1/concat");
779 1U, 1U, std::get<0>(c_filters),
781 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
782 PadStrideInfo(1, 1, 0, 0))
783 .
set_name(param_path +
"/Branch_2/Conv2d_0a_1x1/convolution")
785 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
786 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
790 .
set_name(param_path +
"/Branch_2/Conv2d_0a_1x1/BatchNorm/batchnorm")
793 3U, 3U, std::get<1>(c_filters),
795 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
796 PadStrideInfo(1, 1, 1, 1))
797 .
set_name(param_path +
"/Branch_2/Conv2d_0b_3x3/convolution")
799 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
800 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
804 .
set_name(param_path +
"/Branch_2/Conv2d_0b_3x3/BatchNorm/batchnorm")
807 SubStream i_c1(static_cast<IStream &>(i_c));
809 3U, 1U, std::get<2>(c_filters),
811 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
812 PadStrideInfo(1, 1, 1, 0))
813 .
set_name(param_path +
"/Branch_2/Conv2d_0c_1x3/convolution")
815 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_1x3_BatchNorm_moving_mean.npy"),
816 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0c_1x3_BatchNorm_moving_variance.npy"),
820 .
set_name(param_path +
"/Branch_2/Conv2d_0c_1x3/BatchNorm/batchnorm")
823 SubStream i_c2(static_cast<IStream &>(i_c));
825 1U, 3U, std::get<3>(c_filters),
827 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
828 PadStrideInfo(1, 1, 0, 1))
829 .
set_name(param_path +
"/Branch_2/Conv2d_0d_3x1/convolution")
831 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0d_3x1_BatchNorm_moving_mean.npy"),
832 get_weights_accessor(data_path, total_path +
"Branch_2_Conv2d_0d_3x1_BatchNorm_moving_variance.npy"),
836 .
set_name(param_path +
"/Branch_2/Conv2d_0d_3x1/BatchNorm/batchnorm")
840 i_c <<
BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_c1), std::move(i_c2)).
set_name(param_path +
"/Branch_2/concat");
847 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
848 PadStrideInfo(1, 1, 0, 0))
849 .
set_name(param_path +
"/Branch_3/Conv2d_0b_1x1/convolution")
851 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
852 get_weights_accessor(data_path, total_path +
"Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
856 .
set_name(param_path +
"/Branch_3/Conv2d_0b_1x1/BatchNorm/batchnorm")
859 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
868 int main(
int argc,
char **argv)
870 return arm_compute::utils::run_example<InceptionV3Example>(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
int main(int argc, char **argv)
Main program for Inception V3.
std::unique_ptr< graph::ITensorAccessor > get_random_accessor(PixelValue lower, PixelValue upper, const std::random_device::result_type seed=0)
Generates appropriate random accessor.
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.
ILayer & set_name(std::string name)
Sets the name of the layer.