blob: 4217c78554d9ab5d55d0d0a21710029a55ac2dbd [file] [log] [blame]
Georgios Pinitas240cfa62018-02-26 19:58:04 +00001/*
2 * Copyright (c) 2018 ARM Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010024#include "arm_compute/graph.h"
Georgios Pinitas240cfa62018-02-26 19:58:04 +000025#include "support/ToolchainSupport.h"
26#include "utils/GraphUtils.h"
27#include "utils/Utils.h"
28
29#include <cstdlib>
30#include <tuple>
31
32using namespace arm_compute::utils;
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010033using namespace arm_compute::graph::frontend;
Georgios Pinitas240cfa62018-02-26 19:58:04 +000034using namespace arm_compute::graph_utils;
35
36/** Example demonstrating how to implement InceptionV4's network using the Compute Library's graph API
37 *
38 * @param[in] argc Number of arguments
39 * @param[in] argv Arguments ( [optional] Target (0 = NEON, 1 = OpenCL, 2 = OpenCL with Tuner), [optional] Path to the weights folder, [optional] image, [optional] labels )
40 */
41class InceptionV4Example final : public Example
42{
43public:
44 void do_setup(int argc, char **argv) override
45 {
Pablo Telloeb82fd22018-02-23 13:43:50 +000046 // Disabled the test for now because the process gets killed on Linux Firefly 32 bit even when using ConvolutionMethodHint::DIRECT.
47 // Needs to review/rework to run the code below.
48#if __aarch64__
Georgios Pinitas240cfa62018-02-26 19:58:04 +000049 std::string data_path; /* Path to the trainable data */
50 std::string image; /* Image data */
51 std::string label; /* Label data */
52
53 // Create a preprocessor object
54 std::unique_ptr<IPreprocessor> preprocessor = arm_compute::support::cpp14::make_unique<TFPreproccessor>();
55
Georgios Pinitasd8734b52017-12-22 15:27:52 +000056 // Set target. 0 (NEON), 1 (OpenCL). By default it is NEON
Gian Marco Iodicec13021e2018-05-09 14:11:34 +010057 const int target = argc > 1 ? std::strtol(argv[1], nullptr, 10) : 0;
58 Target target_hint = set_target_hint(target);
59 ConvolutionMethod convolution_hint = target_hint == Target::NEON ? ConvolutionMethod::GEMM : ConvolutionMethod::DEFAULT;
Georgios Pinitas28705162018-03-21 20:10:53 +000060
Georgios Pinitas240cfa62018-02-26 19:58:04 +000061 // Parse arguments
62 if(argc < 2)
63 {
64 // Print help
65 std::cout << "Usage: " << argv[0] << " [target] [path_to_data] [image] [labels]\n\n";
66 std::cout << "No data folder provided: using random values\n\n";
67 }
68 else if(argc == 2)
69 {
70 std::cout << "Usage: " << argv[0] << " " << argv[1] << " [path_to_data] [image] [labels]\n\n";
71 std::cout << "No data folder provided: using random values\n\n";
72 }
73 else if(argc == 3)
74 {
75 data_path = argv[2];
76 std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " [image] [labels]\n\n";
77 std::cout << "No image provided: using random values\n\n";
78 }
79 else if(argc == 4)
80 {
81 data_path = argv[2];
82 image = argv[3];
83 std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " " << argv[3] << " [labels]\n\n";
84 std::cout << "No text file with labels provided: skipping output accessor\n\n";
85 }
86 else
87 {
88 data_path = argv[2];
89 image = argv[3];
90 label = argv[4];
91 }
92
Georgios Pinitasd8734b52017-12-22 15:27:52 +000093 graph << target_hint << InputLayer(TensorDescriptor(TensorShape(299U, 299U, 3U, 1U), DataType::F32),
94 get_input_accessor(image, std::move(preprocessor), false))
Georgios Pinitas240cfa62018-02-26 19:58:04 +000095 // Conv2d_1a_3x3
96 << ConvolutionLayer(3U, 3U, 32U,
97 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_weights.npy"),
98 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
99 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
100 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
101 get_random_accessor(1.f, 1.f),
102 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_beta.npy"),
103 0.001f)
104 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
Georgios Pinitas28705162018-03-21 20:10:53 +0000105 << convolution_hint
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000106 // Conv2d_2a_3x3
107 << ConvolutionLayer(3U, 3U, 32U,
108 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_weights.npy"),
109 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
110 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_moving_mean.npy"),
111 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_moving_variance.npy"),
112 get_random_accessor(1.f, 1.f),
113 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_beta.npy"),
114 0.001f)
115 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
116 // Conv2d_2b_3x3
117 << ConvolutionLayer(3U, 3U, 64U,
118 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_weights.npy"),
119 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
120 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_moving_mean.npy"),
121 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_moving_variance.npy"),
122 get_random_accessor(1.f, 1.f),
123 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_beta.npy"),
124 0.001f)
Georgios Pinitas41c482d2018-04-17 13:23:26 +0100125 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000126
Georgios Pinitas41c482d2018-04-17 13:23:26 +0100127 graph << get_mixed_3a(data_path);
128 graph << get_mixed_4a(data_path);
129 graph << get_mixed_5a(data_path);
130 // 4 inception A blocks
131 graph << get_inceptionA_block(data_path, "Mixed_5b");
132 graph << get_inceptionA_block(data_path, "Mixed_5c");
133 graph << get_inceptionA_block(data_path, "Mixed_5d");
134 graph << get_inceptionA_block(data_path, "Mixed_5e");
135 // reduction A block
136 graph << get_reductionA_block(data_path);
137 // 7 inception B blocks
138 graph << get_inceptionB_block(data_path, "Mixed_6b");
139 graph << get_inceptionB_block(data_path, "Mixed_6c");
140 graph << get_inceptionB_block(data_path, "Mixed_6d");
141 graph << get_inceptionB_block(data_path, "Mixed_6e");
142 graph << get_inceptionB_block(data_path, "Mixed_6f");
143 graph << get_inceptionB_block(data_path, "Mixed_6g");
144 graph << get_inceptionB_block(data_path, "Mixed_6h");
145 // reduction B block
146 graph << get_reductionB_block(data_path);
147 // 3 inception C blocks
148 graph << get_inceptionC_block(data_path, "Mixed_7b");
149 graph << get_inceptionC_block(data_path, "Mixed_7c");
150 graph << get_inceptionC_block(data_path, "Mixed_7d");
151 graph << PoolingLayer(PoolingLayerInfo(PoolingType::AVG))
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000152 << FlattenLayer()
153 << FullyConnectedLayer(
154 1001U,
155 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Logits_Logits_weights.npy"),
156 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Logits_Logits_biases.npy"))
157 << SoftmaxLayer()
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000158 << OutputLayer(get_output_accessor(label, 5));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000159
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000160 // Finalize graph
Georgios Pinitas9a8c6722018-03-21 17:52:35 +0000161 GraphConfig config;
Georgios Pinitas3d1489d2018-05-03 20:47:16 +0100162 config.use_tuner = (target == 2);
Georgios Pinitas9a8c6722018-03-21 17:52:35 +0000163 graph.finalize(target_hint, config);
Pablo Telloeb82fd22018-02-23 13:43:50 +0000164#else /* __aarch64__ */
165 using namespace arm_compute;
166 ARM_COMPUTE_UNUSED(argc);
167 ARM_COMPUTE_UNUSED(argv);
168#endif /* __aarch64__ */
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000169 }
170
171 void do_run() override
172 {
Pablo Telloeb82fd22018-02-23 13:43:50 +0000173#if __aarch64__
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000174 graph.run();
Pablo Telloeb82fd22018-02-23 13:43:50 +0000175#endif /* __aarch64__ */
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000176 }
177
178private:
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000179 Stream graph{ 0, "InceptionV4" };
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000180
181private:
182 BranchLayer get_mixed_3a(const std::string &data_path)
183 {
184 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_3a_";
185
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000186 SubStream i_a(graph);
187 i_a << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000188
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000189 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000190 i_b << ConvolutionLayer(3U, 3U, 96U,
191 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_weights.npy"),
192 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
193 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_BatchNorm_moving_mean.npy"),
194 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_BatchNorm_moving_variance.npy"),
195 get_random_accessor(1.f, 1.f),
196 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_BatchNorm_beta.npy"),
197 0.001f)
198 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
199
200 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
201 }
202
203 BranchLayer get_mixed_4a(const std::string &data_path)
204 {
205 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_4a_";
206
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000207 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000208 i_a << ConvolutionLayer(1U, 1U, 64U,
209 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
210 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
211 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
212 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
213 get_random_accessor(1.f, 1.f),
214 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
215 0.001f)
216 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
217 << ConvolutionLayer(3U, 3U, 96U,
218 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
219 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
220 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
221 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
222 get_random_accessor(1.f, 1.f),
223 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
224 0.001f)
225 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
226
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000227 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000228 i_b << ConvolutionLayer(1U, 1U, 64U,
229 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
230 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
231 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
232 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
233 get_random_accessor(1.f, 1.f),
234 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
235 0.001f)
236 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
237 << ConvolutionLayer(7U, 1U, 64U,
238 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_weights.npy"),
239 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
240 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
241 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
242 get_random_accessor(1.f, 1.f),
243 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_beta.npy"),
244 0.001f)
245 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
246 << ConvolutionLayer(1U, 7U, 64U,
247 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_weights.npy"),
248 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
249 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
250 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
251 get_random_accessor(1.f, 1.f),
252 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_beta.npy"),
253 0.001f)
254 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
255 << ConvolutionLayer(3U, 3U, 96U,
256 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_weights.npy"),
257 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
258 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
259 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
260 get_random_accessor(1.f, 1.f),
261 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_beta.npy"),
262 0.001f)
263 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
264
265 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
266 }
267
268 BranchLayer get_mixed_5a(const std::string &data_path)
269 {
270 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_5a_";
271
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000272 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000273 i_a << ConvolutionLayer(3U, 3U, 192U,
274 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
275 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
276 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
277 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
278 get_random_accessor(1.f, 1.f),
279 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
280 0.001f)
281 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
282
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000283 SubStream i_b(graph);
284 i_b << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000285
286 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
287 }
288
289 BranchLayer get_inceptionA_block(const std::string &data_path, std::string &&param_path)
290 {
291 std::string total_path = "/cnn_data/inceptionv4_model/" + param_path + "_";
292
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000293 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000294 i_a << ConvolutionLayer(1U, 1U, 96U,
295 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
296 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
297 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
298 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
299 get_random_accessor(1.f, 1.f),
300 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
301 0.001f)
302 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
303
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000304 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000305 i_b << ConvolutionLayer(1U, 1U, 64U,
306 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
307 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
308 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
309 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
310 get_random_accessor(1.f, 1.f),
311 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
312 0.001f)
313 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
314 << ConvolutionLayer(3U, 3U, 96U,
315 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_weights.npy"),
316 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
317 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
318 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
319 get_random_accessor(1.f, 1.f),
320 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_beta.npy"),
321 0.001f)
322 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
323
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000324 SubStream i_c(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000325 i_c << ConvolutionLayer(1U, 1U, 64U,
326 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_weights.npy"),
327 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
328 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
329 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
330 get_random_accessor(1.f, 1.f),
331 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_beta.npy"),
332 0.001f)
333 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
334 << ConvolutionLayer(3U, 3U, 96U,
335 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_weights.npy"),
336 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
337 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
338 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
339 get_random_accessor(1.f, 1.f),
340 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_BatchNorm_beta.npy"),
341 0.001f)
342 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
343 << ConvolutionLayer(3U, 3U, 96U,
344 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_weights.npy"),
345 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
346 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_BatchNorm_moving_mean.npy"),
347 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_BatchNorm_moving_variance.npy"),
348 get_random_accessor(1.f, 1.f),
349 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_BatchNorm_beta.npy"),
350 0.001f)
351 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
352
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000353 SubStream i_d(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000354 i_d << PoolingLayer(PoolingLayerInfo(PoolingType::AVG, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL), true))
355 << ConvolutionLayer(1U, 1U, 96U,
356 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_weights.npy"),
357 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
358 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
359 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
360 get_random_accessor(1.f, 1.f),
361 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_beta.npy"),
362 0.001f)
363 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
364
365 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
366 }
367
368 BranchLayer get_reductionA_block(const std::string &data_path)
369 {
370 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_6a_";
371
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000372 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000373 i_a << ConvolutionLayer(3U, 3U, 384U,
374 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
375 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
376 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
377 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
378 get_random_accessor(1.f, 1.f),
379 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
380 0.001f)
381 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
382
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000383 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000384 i_b << ConvolutionLayer(1U, 1U, 192U,
385 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
386 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
387 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
388 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
389 get_random_accessor(1.f, 1.f),
390 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
391 0.001f)
392 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
393 << ConvolutionLayer(3U, 3U, 224U,
394 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_weights.npy"),
395 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
396 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
397 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
398 get_random_accessor(1.f, 1.f),
399 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_beta.npy"),
400 0.001f)
401 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
402 << ConvolutionLayer(3U, 3U, 256U,
403 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_weights.npy"),
404 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
405 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
406 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
407 get_random_accessor(1.f, 1.f),
408 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_beta.npy"),
409 0.001f)
410 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
411
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000412 SubStream i_c(graph);
413 i_c << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
414
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000415 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
416 }
417
418 BranchLayer get_inceptionB_block(const std::string &data_path, std::string &&param_path)
419 {
420 std::string total_path = "/cnn_data/inceptionv4_model/" + param_path + "_";
421
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000422 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000423 i_a << ConvolutionLayer(1U, 1U, 384U,
424 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
425 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
426 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
427 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
428 get_random_accessor(1.f, 1.f),
429 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
430 0.001f)
431 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
432
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000433 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000434 i_b << ConvolutionLayer(1U, 1U, 192U,
435 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
436 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
437 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
438 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
439 get_random_accessor(1.f, 1.f),
440 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
441 0.001f)
442 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
443 << ConvolutionLayer(7U, 1U, 224U,
444 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_weights.npy"),
445 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
446 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
447 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
448 get_random_accessor(1.f, 1.f),
449 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_beta.npy"),
450 0.001f)
451 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
452 << ConvolutionLayer(1U, 7U, 256U,
453 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_weights.npy"),
454 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
455 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
456 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
457 get_random_accessor(1.f, 1.f),
458 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_beta.npy"),
459 0.001f)
460 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
461
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000462 SubStream i_c(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000463 i_c << ConvolutionLayer(1U, 1U, 192U,
464 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_weights.npy"),
465 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
466 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
467 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
468 get_random_accessor(1.f, 1.f),
469 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_beta.npy"),
470 0.001f)
471 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
472 << ConvolutionLayer(1U, 7U, 192U,
473 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_weights.npy"),
474 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
475 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_BatchNorm_moving_mean.npy"),
476 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_BatchNorm_moving_variance.npy"),
477 get_random_accessor(1.f, 1.f),
478 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_BatchNorm_beta.npy"),
479 0.001f)
480 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
481 << ConvolutionLayer(7U, 1U, 224U,
482 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_weights.npy"),
483 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
484 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_BatchNorm_moving_mean.npy"),
485 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_BatchNorm_moving_variance.npy"),
486 get_random_accessor(1.f, 1.f),
487 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_BatchNorm_beta.npy"),
488 0.001f)
489 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
490 << ConvolutionLayer(1U, 7U, 224U,
491 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_weights.npy"),
492 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
493 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_BatchNorm_moving_mean.npy"),
494 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_BatchNorm_moving_variance.npy"),
495 get_random_accessor(1.f, 1.f),
496 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_BatchNorm_beta.npy"),
497 0.001f)
498 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
499 << ConvolutionLayer(7U, 1U, 256U,
500 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_weights.npy"),
501 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
502 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_BatchNorm_moving_mean.npy"),
503 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_BatchNorm_moving_variance.npy"),
504 get_random_accessor(1.f, 1.f),
505 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_BatchNorm_beta.npy"),
506 0.001f)
507 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
508
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000509 SubStream i_d(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000510 i_d << PoolingLayer(PoolingLayerInfo(PoolingType::AVG, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL), true))
511 << ConvolutionLayer(1U, 1U, 128U,
512 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_weights.npy"),
513 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
514 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
515 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
516 get_random_accessor(1.f, 1.f),
517 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_beta.npy"),
518 0.001f)
519 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
520
521 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
522 }
523
524 BranchLayer get_reductionB_block(const std::string &data_path)
525 {
526 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_7a_";
527
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000528 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000529 i_a << ConvolutionLayer(1U, 1U, 192U,
530 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
531 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
532 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
533 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
534 get_random_accessor(1.f, 1.f),
535 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
536 0.001f)
537 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
538 << ConvolutionLayer(3U, 3U, 192U,
539 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
540 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
541 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
542 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
543 get_random_accessor(1.f, 1.f),
544 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
545 0.001f)
546 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
547
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000548 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000549 i_b << ConvolutionLayer(1U, 1U, 256U,
550 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
551 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
552 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
553 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
554 get_random_accessor(1.f, 1.f),
555 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
556 0.001f)
557 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
558 << ConvolutionLayer(7U, 1U, 256U,
559 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_weights.npy"),
560 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
561 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
562 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
563 get_random_accessor(1.f, 1.f),
564 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_beta.npy"),
565 0.001f)
566 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
567 << ConvolutionLayer(1U, 7U, 320U,
568 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_weights.npy"),
569 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
570 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
571 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
572 get_random_accessor(1.f, 1.f),
573 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_beta.npy"),
574 0.001f)
575 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
576 << ConvolutionLayer(3U, 3U, 320U,
577 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_weights.npy"),
578 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
579 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
580 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
581 get_random_accessor(1.f, 1.f),
582 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_beta.npy"),
583 0.001f)
584 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
585
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000586 SubStream i_c(graph);
587 i_c << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
588
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000589 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
590 }
591
592 BranchLayer get_inceptionC_block(const std::string &data_path, std::string &&param_path)
593 {
594 std::string total_path = "/cnn_data/inceptionv4_model/" + param_path + "_";
595
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000596 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000597 i_a << ConvolutionLayer(1U, 1U, 256U,
598 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
599 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
600 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
601 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
602 get_random_accessor(1.f, 1.f),
603 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
604 0.001f)
605 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
606
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000607 SubStream i_b(graph);
608 i_b << ConvolutionLayer(
609 1U, 1U, 384U,
610 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
611 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
612 PadStrideInfo(1, 1, 0, 0))
613 << BatchNormalizationLayer(
614 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
615 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
616 get_random_accessor(1.f, 1.f),
617 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
618 0.001f)
619 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
620
621 SubStream i_b1(static_cast<IStream &>(i_b));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000622 i_b1 << ConvolutionLayer(
623 3U, 1U, 256U,
624 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_weights.npy"),
625 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
626 PadStrideInfo(1, 1, 1, 0))
627 << BatchNormalizationLayer(
628 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_BatchNorm_moving_mean.npy"),
629 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_BatchNorm_moving_variance.npy"),
630 get_random_accessor(1.f, 1.f),
631 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_BatchNorm_beta.npy"),
632 0.001f)
633 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
634
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000635 SubStream i_b2(static_cast<IStream &>(i_b));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000636 i_b2 << ConvolutionLayer(
637 1U, 3U, 256U,
638 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_weights.npy"),
639 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
640 PadStrideInfo(1, 1, 0, 1))
641 << BatchNormalizationLayer(
642 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_BatchNorm_moving_mean.npy"),
643 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_BatchNorm_moving_variance.npy"),
644 get_random_accessor(1.f, 1.f),
645 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_BatchNorm_beta.npy"),
646 0.001f)
647 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
648
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000649 // Merge b1 and b2
650 i_b << BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_b1), std::move(i_b2));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000651
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000652 SubStream i_c(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000653 i_c << ConvolutionLayer(
654 1U, 1U, 384U,
655 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_weights.npy"),
656 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
657 PadStrideInfo(1, 1, 0, 0))
658 << BatchNormalizationLayer(
659 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
660 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
661 get_random_accessor(1.f, 1.f),
662 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_beta.npy"),
663 0.001f)
664 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
665 << ConvolutionLayer(
666 1U, 3U, 448U,
667 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_weights.npy"),
668 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
669 PadStrideInfo(1, 1, 0, 1))
670 << BatchNormalizationLayer(
671 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_BatchNorm_moving_mean.npy"),
672 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_BatchNorm_moving_variance.npy"),
673 get_random_accessor(1.f, 1.f),
674 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_BatchNorm_beta.npy"),
675 0.001f)
676 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
677 << ConvolutionLayer(
678 3U, 1U, 512U,
679 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_weights.npy"),
680 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
681 PadStrideInfo(1, 1, 1, 0))
682 << BatchNormalizationLayer(
683 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_BatchNorm_moving_mean.npy"),
684 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_BatchNorm_moving_variance.npy"),
685 get_random_accessor(1.f, 1.f),
686 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_BatchNorm_beta.npy"),
687 0.001f)
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000688 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000689
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000690 SubStream i_c1(static_cast<IStream &>(i_c));
691 i_c1 << ConvolutionLayer(
692 3U, 1U, 256U,
693 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_weights.npy"),
694 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
695 PadStrideInfo(1, 1, 1, 0))
696 << BatchNormalizationLayer(
697 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_BatchNorm_moving_mean.npy"),
698 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_BatchNorm_moving_variance.npy"),
699 get_random_accessor(1.f, 1.f),
700 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_BatchNorm_beta.npy"),
701 0.001f)
702 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
703
704 SubStream i_c2(static_cast<IStream &>(i_c));
705 i_c2 << ConvolutionLayer(
706 1U, 3U, 256U,
707 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_weights.npy"),
708 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
709 PadStrideInfo(1, 1, 0, 1))
710 << BatchNormalizationLayer(
711 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_BatchNorm_moving_mean.npy"),
712 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_BatchNorm_moving_variance.npy"),
713 get_random_accessor(1.f, 1.f),
714 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_BatchNorm_beta.npy"),
715 0.001f)
716 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
717
718 // Merge i_c1 and i_c2
719 i_c << BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_c1), std::move(i_c2));
720
721 SubStream i_d(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000722 i_d << PoolingLayer(PoolingLayerInfo(PoolingType::AVG, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL), true))
723 << ConvolutionLayer(1U, 1U, 256U,
724 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_weights.npy"),
725 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
726 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
727 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
728 get_random_accessor(1.f, 1.f),
729 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_beta.npy"),
730 0.001f)
731 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
732
733 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
734 }
735};
736
737/** Main program for Inception V4
738 *
739 * @param[in] argc Number of arguments
740 * @param[in] argv Arguments ( [optional] Target (0 = NEON, 1 = OpenCL, 2 = OpenCL with Tuner), [optional] Path to the weights folder, [optional] image, [optional] labels )
741 */
742int main(int argc, char **argv)
743{
744 return arm_compute::utils::run_example<InceptionV4Example>(argc, argv);
745}