blob: d50513383395706cb7c5d1a6023064197c060997 [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
Georgios Pinitas9a8c6722018-03-21 17:52:35 +000057 const int target = argc > 1 ? std::strtol(argv[1], nullptr, 10) : 0;
Georgios Pinitasd9eb2752018-04-03 13:44:29 +010058 Target target_hint = set_target_hint(target);
Georgios Pinitas240cfa62018-02-26 19:58:04 +000059
Georgios Pinitas28705162018-03-21 20:10:53 +000060 ConvolutionMethod convolution_hint = (target_hint == Target::CL) ? ConvolutionMethod::WINOGRAD : ConvolutionMethod::GEMM;
61
Georgios Pinitas240cfa62018-02-26 19:58:04 +000062 // Parse arguments
63 if(argc < 2)
64 {
65 // Print help
66 std::cout << "Usage: " << argv[0] << " [target] [path_to_data] [image] [labels]\n\n";
67 std::cout << "No data folder provided: using random values\n\n";
68 }
69 else if(argc == 2)
70 {
71 std::cout << "Usage: " << argv[0] << " " << argv[1] << " [path_to_data] [image] [labels]\n\n";
72 std::cout << "No data folder provided: using random values\n\n";
73 }
74 else if(argc == 3)
75 {
76 data_path = argv[2];
77 std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " [image] [labels]\n\n";
78 std::cout << "No image provided: using random values\n\n";
79 }
80 else if(argc == 4)
81 {
82 data_path = argv[2];
83 image = argv[3];
84 std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " " << argv[3] << " [labels]\n\n";
85 std::cout << "No text file with labels provided: skipping output accessor\n\n";
86 }
87 else
88 {
89 data_path = argv[2];
90 image = argv[3];
91 label = argv[4];
92 }
93
Georgios Pinitasd8734b52017-12-22 15:27:52 +000094 graph << target_hint << InputLayer(TensorDescriptor(TensorShape(299U, 299U, 3U, 1U), DataType::F32),
95 get_input_accessor(image, std::move(preprocessor), false))
Georgios Pinitas240cfa62018-02-26 19:58:04 +000096 // Conv2d_1a_3x3
97 << ConvolutionLayer(3U, 3U, 32U,
98 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_weights.npy"),
99 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
100 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
101 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
102 get_random_accessor(1.f, 1.f),
103 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_beta.npy"),
104 0.001f)
105 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
Georgios Pinitas28705162018-03-21 20:10:53 +0000106 << convolution_hint
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000107 // Conv2d_2a_3x3
108 << ConvolutionLayer(3U, 3U, 32U,
109 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_weights.npy"),
110 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
111 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_moving_mean.npy"),
112 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_moving_variance.npy"),
113 get_random_accessor(1.f, 1.f),
114 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_beta.npy"),
115 0.001f)
116 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
117 // Conv2d_2b_3x3
118 << ConvolutionLayer(3U, 3U, 64U,
119 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_weights.npy"),
120 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
121 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_moving_mean.npy"),
122 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_moving_variance.npy"),
123 get_random_accessor(1.f, 1.f),
124 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_beta.npy"),
125 0.001f)
Georgios Pinitas41c482d2018-04-17 13:23:26 +0100126 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000127
Georgios Pinitas41c482d2018-04-17 13:23:26 +0100128 graph << get_mixed_3a(data_path);
129 graph << get_mixed_4a(data_path);
130 graph << get_mixed_5a(data_path);
131 // 4 inception A blocks
132 graph << get_inceptionA_block(data_path, "Mixed_5b");
133 graph << get_inceptionA_block(data_path, "Mixed_5c");
134 graph << get_inceptionA_block(data_path, "Mixed_5d");
135 graph << get_inceptionA_block(data_path, "Mixed_5e");
136 // reduction A block
137 graph << get_reductionA_block(data_path);
138 // 7 inception B blocks
139 graph << get_inceptionB_block(data_path, "Mixed_6b");
140 graph << get_inceptionB_block(data_path, "Mixed_6c");
141 graph << get_inceptionB_block(data_path, "Mixed_6d");
142 graph << get_inceptionB_block(data_path, "Mixed_6e");
143 graph << get_inceptionB_block(data_path, "Mixed_6f");
144 graph << get_inceptionB_block(data_path, "Mixed_6g");
145 graph << get_inceptionB_block(data_path, "Mixed_6h");
146 // reduction B block
147 graph << get_reductionB_block(data_path);
148 // 3 inception C blocks
149 graph << get_inceptionC_block(data_path, "Mixed_7b");
150 graph << get_inceptionC_block(data_path, "Mixed_7c");
151 graph << get_inceptionC_block(data_path, "Mixed_7d");
152 graph << PoolingLayer(PoolingLayerInfo(PoolingType::AVG))
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000153 << FlattenLayer()
154 << FullyConnectedLayer(
155 1001U,
156 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Logits_Logits_weights.npy"),
157 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Logits_Logits_biases.npy"))
158 << SoftmaxLayer()
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000159 << OutputLayer(get_output_accessor(label, 5));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000160
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000161 // Finalize graph
Georgios Pinitas9a8c6722018-03-21 17:52:35 +0000162 GraphConfig config;
163 config.use_function_memory_manager = true;
164 config.use_tuner = (target == 2);
165 graph.finalize(target_hint, config);
Pablo Telloeb82fd22018-02-23 13:43:50 +0000166#else /* __aarch64__ */
167 using namespace arm_compute;
168 ARM_COMPUTE_UNUSED(argc);
169 ARM_COMPUTE_UNUSED(argv);
170#endif /* __aarch64__ */
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000171 }
172
173 void do_run() override
174 {
Pablo Telloeb82fd22018-02-23 13:43:50 +0000175#if __aarch64__
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000176 graph.run();
Pablo Telloeb82fd22018-02-23 13:43:50 +0000177#endif /* __aarch64__ */
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000178 }
179
180private:
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000181 Stream graph{ 0, "InceptionV4" };
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000182
183private:
184 BranchLayer get_mixed_3a(const std::string &data_path)
185 {
186 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_3a_";
187
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000188 SubStream i_a(graph);
189 i_a << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000190
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000191 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000192 i_b << ConvolutionLayer(3U, 3U, 96U,
193 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_weights.npy"),
194 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
195 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_BatchNorm_moving_mean.npy"),
196 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_BatchNorm_moving_variance.npy"),
197 get_random_accessor(1.f, 1.f),
198 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_3x3_BatchNorm_beta.npy"),
199 0.001f)
200 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
201
202 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
203 }
204
205 BranchLayer get_mixed_4a(const std::string &data_path)
206 {
207 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_4a_";
208
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000209 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000210 i_a << ConvolutionLayer(1U, 1U, 64U,
211 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
212 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
213 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
214 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
215 get_random_accessor(1.f, 1.f),
216 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
217 0.001f)
218 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
219 << ConvolutionLayer(3U, 3U, 96U,
220 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
221 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
222 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
223 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
224 get_random_accessor(1.f, 1.f),
225 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
226 0.001f)
227 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
228
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000229 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000230 i_b << ConvolutionLayer(1U, 1U, 64U,
231 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
232 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
233 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
234 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
235 get_random_accessor(1.f, 1.f),
236 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
237 0.001f)
238 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
239 << ConvolutionLayer(7U, 1U, 64U,
240 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_weights.npy"),
241 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
242 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
243 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
244 get_random_accessor(1.f, 1.f),
245 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_beta.npy"),
246 0.001f)
247 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
248 << ConvolutionLayer(1U, 7U, 64U,
249 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_weights.npy"),
250 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
251 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
252 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
253 get_random_accessor(1.f, 1.f),
254 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_beta.npy"),
255 0.001f)
256 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
257 << ConvolutionLayer(3U, 3U, 96U,
258 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_weights.npy"),
259 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
260 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
261 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
262 get_random_accessor(1.f, 1.f),
263 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_beta.npy"),
264 0.001f)
265 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
266
267 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
268 }
269
270 BranchLayer get_mixed_5a(const std::string &data_path)
271 {
272 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_5a_";
273
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000274 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000275 i_a << ConvolutionLayer(3U, 3U, 192U,
276 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
277 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
278 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
279 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
280 get_random_accessor(1.f, 1.f),
281 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
282 0.001f)
283 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
284
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000285 SubStream i_b(graph);
286 i_b << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000287
288 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b));
289 }
290
291 BranchLayer get_inceptionA_block(const std::string &data_path, std::string &&param_path)
292 {
293 std::string total_path = "/cnn_data/inceptionv4_model/" + param_path + "_";
294
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000295 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000296 i_a << ConvolutionLayer(1U, 1U, 96U,
297 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
298 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
299 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
300 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
301 get_random_accessor(1.f, 1.f),
302 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
303 0.001f)
304 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
305
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000306 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000307 i_b << ConvolutionLayer(1U, 1U, 64U,
308 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
309 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
310 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
311 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
312 get_random_accessor(1.f, 1.f),
313 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
314 0.001f)
315 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
316 << ConvolutionLayer(3U, 3U, 96U,
317 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_weights.npy"),
318 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
319 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
320 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
321 get_random_accessor(1.f, 1.f),
322 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_beta.npy"),
323 0.001f)
324 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
325
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000326 SubStream i_c(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000327 i_c << ConvolutionLayer(1U, 1U, 64U,
328 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_weights.npy"),
329 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
330 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
331 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
332 get_random_accessor(1.f, 1.f),
333 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_beta.npy"),
334 0.001f)
335 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
336 << ConvolutionLayer(3U, 3U, 96U,
337 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_weights.npy"),
338 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
339 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
340 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
341 get_random_accessor(1.f, 1.f),
342 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x3_BatchNorm_beta.npy"),
343 0.001f)
344 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
345 << ConvolutionLayer(3U, 3U, 96U,
346 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_weights.npy"),
347 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
348 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_BatchNorm_moving_mean.npy"),
349 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_BatchNorm_moving_variance.npy"),
350 get_random_accessor(1.f, 1.f),
351 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_3x3_BatchNorm_beta.npy"),
352 0.001f)
353 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
354
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000355 SubStream i_d(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000356 i_d << PoolingLayer(PoolingLayerInfo(PoolingType::AVG, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL), true))
357 << ConvolutionLayer(1U, 1U, 96U,
358 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_weights.npy"),
359 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
360 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
361 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
362 get_random_accessor(1.f, 1.f),
363 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_beta.npy"),
364 0.001f)
365 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
366
367 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
368 }
369
370 BranchLayer get_reductionA_block(const std::string &data_path)
371 {
372 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_6a_";
373
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000374 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000375 i_a << ConvolutionLayer(3U, 3U, 384U,
376 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
377 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
378 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
379 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
380 get_random_accessor(1.f, 1.f),
381 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
382 0.001f)
383 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
384
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000385 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000386 i_b << ConvolutionLayer(1U, 1U, 192U,
387 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
388 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
389 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
390 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
391 get_random_accessor(1.f, 1.f),
392 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
393 0.001f)
394 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
395 << ConvolutionLayer(3U, 3U, 224U,
396 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_weights.npy"),
397 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
398 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_mean.npy"),
399 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_moving_variance.npy"),
400 get_random_accessor(1.f, 1.f),
401 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_3x3_BatchNorm_beta.npy"),
402 0.001f)
403 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
404 << ConvolutionLayer(3U, 3U, 256U,
405 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_weights.npy"),
406 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
407 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
408 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
409 get_random_accessor(1.f, 1.f),
410 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_beta.npy"),
411 0.001f)
412 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
413
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000414 SubStream i_c(graph);
415 i_c << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
416
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000417 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
418 }
419
420 BranchLayer get_inceptionB_block(const std::string &data_path, std::string &&param_path)
421 {
422 std::string total_path = "/cnn_data/inceptionv4_model/" + param_path + "_";
423
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000424 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000425 i_a << ConvolutionLayer(1U, 1U, 384U,
426 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
427 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
428 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
429 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
430 get_random_accessor(1.f, 1.f),
431 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
432 0.001f)
433 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
434
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000435 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000436 i_b << ConvolutionLayer(1U, 1U, 192U,
437 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
438 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
439 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
440 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
441 get_random_accessor(1.f, 1.f),
442 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
443 0.001f)
444 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
445 << ConvolutionLayer(7U, 1U, 224U,
446 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_weights.npy"),
447 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
448 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
449 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
450 get_random_accessor(1.f, 1.f),
451 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_beta.npy"),
452 0.001f)
453 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
454 << ConvolutionLayer(1U, 7U, 256U,
455 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_weights.npy"),
456 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
457 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
458 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
459 get_random_accessor(1.f, 1.f),
460 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_beta.npy"),
461 0.001f)
462 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
463
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000464 SubStream i_c(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000465 i_c << ConvolutionLayer(1U, 1U, 192U,
466 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_weights.npy"),
467 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
468 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
469 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
470 get_random_accessor(1.f, 1.f),
471 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_beta.npy"),
472 0.001f)
473 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
474 << ConvolutionLayer(1U, 7U, 192U,
475 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_weights.npy"),
476 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
477 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_BatchNorm_moving_mean.npy"),
478 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_BatchNorm_moving_variance.npy"),
479 get_random_accessor(1.f, 1.f),
480 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_7x1_BatchNorm_beta.npy"),
481 0.001f)
482 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
483 << ConvolutionLayer(7U, 1U, 224U,
484 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_weights.npy"),
485 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
486 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_BatchNorm_moving_mean.npy"),
487 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_BatchNorm_moving_variance.npy"),
488 get_random_accessor(1.f, 1.f),
489 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x7_BatchNorm_beta.npy"),
490 0.001f)
491 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
492 << ConvolutionLayer(1U, 7U, 224U,
493 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_weights.npy"),
494 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
495 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_BatchNorm_moving_mean.npy"),
496 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_BatchNorm_moving_variance.npy"),
497 get_random_accessor(1.f, 1.f),
498 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_7x1_BatchNorm_beta.npy"),
499 0.001f)
500 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
501 << ConvolutionLayer(7U, 1U, 256U,
502 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_weights.npy"),
503 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
504 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_BatchNorm_moving_mean.npy"),
505 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_BatchNorm_moving_variance.npy"),
506 get_random_accessor(1.f, 1.f),
507 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_1x7_BatchNorm_beta.npy"),
508 0.001f)
509 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
510
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000511 SubStream i_d(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000512 i_d << PoolingLayer(PoolingLayerInfo(PoolingType::AVG, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL), true))
513 << ConvolutionLayer(1U, 1U, 128U,
514 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_weights.npy"),
515 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
516 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
517 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
518 get_random_accessor(1.f, 1.f),
519 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_beta.npy"),
520 0.001f)
521 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
522
523 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
524 }
525
526 BranchLayer get_reductionB_block(const std::string &data_path)
527 {
528 std::string total_path = "/cnn_data/inceptionv4_model/Mixed_7a_";
529
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000530 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000531 i_a << ConvolutionLayer(1U, 1U, 192U,
532 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
533 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
534 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
535 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
536 get_random_accessor(1.f, 1.f),
537 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
538 0.001f)
539 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
540 << ConvolutionLayer(3U, 3U, 192U,
541 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_weights.npy"),
542 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
543 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
544 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
545 get_random_accessor(1.f, 1.f),
546 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_1a_3x3_BatchNorm_beta.npy"),
547 0.001f)
548 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
549
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000550 SubStream i_b(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000551 i_b << ConvolutionLayer(1U, 1U, 256U,
552 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
553 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
554 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
555 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
556 get_random_accessor(1.f, 1.f),
557 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
558 0.001f)
559 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
560 << ConvolutionLayer(7U, 1U, 256U,
561 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_weights.npy"),
562 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 3, 0))
563 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_mean.npy"),
564 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_moving_variance.npy"),
565 get_random_accessor(1.f, 1.f),
566 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x7_BatchNorm_beta.npy"),
567 0.001f)
568 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
569 << ConvolutionLayer(1U, 7U, 320U,
570 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_weights.npy"),
571 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 3))
572 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_mean.npy"),
573 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_moving_variance.npy"),
574 get_random_accessor(1.f, 1.f),
575 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_7x1_BatchNorm_beta.npy"),
576 0.001f)
577 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
578 << ConvolutionLayer(3U, 3U, 320U,
579 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_weights.npy"),
580 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
581 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
582 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
583 get_random_accessor(1.f, 1.f),
584 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_1a_3x3_BatchNorm_beta.npy"),
585 0.001f)
586 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
587
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000588 SubStream i_c(graph);
589 i_c << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL), true));
590
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000591 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c));
592 }
593
594 BranchLayer get_inceptionC_block(const std::string &data_path, std::string &&param_path)
595 {
596 std::string total_path = "/cnn_data/inceptionv4_model/" + param_path + "_";
597
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000598 SubStream i_a(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000599 i_a << ConvolutionLayer(1U, 1U, 256U,
600 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_weights.npy"),
601 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
602 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
603 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
604 get_random_accessor(1.f, 1.f),
605 get_weights_accessor(data_path, total_path + "Branch_0_Conv2d_0a_1x1_BatchNorm_beta.npy"),
606 0.001f)
607 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
608
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000609 SubStream i_b(graph);
610 i_b << ConvolutionLayer(
611 1U, 1U, 384U,
612 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_weights.npy"),
613 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
614 PadStrideInfo(1, 1, 0, 0))
615 << BatchNormalizationLayer(
616 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
617 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
618 get_random_accessor(1.f, 1.f),
619 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0a_1x1_BatchNorm_beta.npy"),
620 0.001f)
621 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
622
623 SubStream i_b1(static_cast<IStream &>(i_b));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000624 i_b1 << ConvolutionLayer(
625 3U, 1U, 256U,
626 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_weights.npy"),
627 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
628 PadStrideInfo(1, 1, 1, 0))
629 << BatchNormalizationLayer(
630 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_BatchNorm_moving_mean.npy"),
631 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_BatchNorm_moving_variance.npy"),
632 get_random_accessor(1.f, 1.f),
633 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0b_1x3_BatchNorm_beta.npy"),
634 0.001f)
635 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
636
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000637 SubStream i_b2(static_cast<IStream &>(i_b));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000638 i_b2 << ConvolutionLayer(
639 1U, 3U, 256U,
640 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_weights.npy"),
641 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
642 PadStrideInfo(1, 1, 0, 1))
643 << BatchNormalizationLayer(
644 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_BatchNorm_moving_mean.npy"),
645 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_BatchNorm_moving_variance.npy"),
646 get_random_accessor(1.f, 1.f),
647 get_weights_accessor(data_path, total_path + "Branch_1_Conv2d_0c_3x1_BatchNorm_beta.npy"),
648 0.001f)
649 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
650
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000651 // Merge b1 and b2
652 i_b << BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_b1), std::move(i_b2));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000653
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000654 SubStream i_c(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000655 i_c << ConvolutionLayer(
656 1U, 1U, 384U,
657 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_weights.npy"),
658 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
659 PadStrideInfo(1, 1, 0, 0))
660 << BatchNormalizationLayer(
661 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_mean.npy"),
662 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_moving_variance.npy"),
663 get_random_accessor(1.f, 1.f),
664 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0a_1x1_BatchNorm_beta.npy"),
665 0.001f)
666 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
667 << ConvolutionLayer(
668 1U, 3U, 448U,
669 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_weights.npy"),
670 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
671 PadStrideInfo(1, 1, 0, 1))
672 << BatchNormalizationLayer(
673 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_BatchNorm_moving_mean.npy"),
674 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_BatchNorm_moving_variance.npy"),
675 get_random_accessor(1.f, 1.f),
676 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0b_3x1_BatchNorm_beta.npy"),
677 0.001f)
678 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
679 << ConvolutionLayer(
680 3U, 1U, 512U,
681 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_weights.npy"),
682 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
683 PadStrideInfo(1, 1, 1, 0))
684 << BatchNormalizationLayer(
685 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_BatchNorm_moving_mean.npy"),
686 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_BatchNorm_moving_variance.npy"),
687 get_random_accessor(1.f, 1.f),
688 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0c_1x3_BatchNorm_beta.npy"),
689 0.001f)
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000690 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000691
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000692 SubStream i_c1(static_cast<IStream &>(i_c));
693 i_c1 << ConvolutionLayer(
694 3U, 1U, 256U,
695 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_weights.npy"),
696 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
697 PadStrideInfo(1, 1, 1, 0))
698 << BatchNormalizationLayer(
699 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_BatchNorm_moving_mean.npy"),
700 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_BatchNorm_moving_variance.npy"),
701 get_random_accessor(1.f, 1.f),
702 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0d_1x3_BatchNorm_beta.npy"),
703 0.001f)
704 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
705
706 SubStream i_c2(static_cast<IStream &>(i_c));
707 i_c2 << ConvolutionLayer(
708 1U, 3U, 256U,
709 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_weights.npy"),
710 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
711 PadStrideInfo(1, 1, 0, 1))
712 << BatchNormalizationLayer(
713 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_BatchNorm_moving_mean.npy"),
714 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_BatchNorm_moving_variance.npy"),
715 get_random_accessor(1.f, 1.f),
716 get_weights_accessor(data_path, total_path + "Branch_2_Conv2d_0e_3x1_BatchNorm_beta.npy"),
717 0.001f)
718 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
719
720 // Merge i_c1 and i_c2
721 i_c << BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_c1), std::move(i_c2));
722
723 SubStream i_d(graph);
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000724 i_d << PoolingLayer(PoolingLayerInfo(PoolingType::AVG, 3, PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL), true))
725 << ConvolutionLayer(1U, 1U, 256U,
726 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_weights.npy"),
727 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
728 << BatchNormalizationLayer(get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_mean.npy"),
729 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_moving_variance.npy"),
730 get_random_accessor(1.f, 1.f),
731 get_weights_accessor(data_path, total_path + "Branch_3_Conv2d_0b_1x1_BatchNorm_beta.npy"),
732 0.001f)
733 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU));
734
735 return BranchLayer(BranchMergeMethod::DEPTH_CONCATENATE, std::move(i_a), std::move(i_b), std::move(i_c), std::move(i_d));
736 }
737};
738
739/** Main program for Inception V4
740 *
741 * @param[in] argc Number of arguments
742 * @param[in] argv Arguments ( [optional] Target (0 = NEON, 1 = OpenCL, 2 = OpenCL with Tuner), [optional] Path to the weights folder, [optional] image, [optional] labels )
743 */
744int main(int argc, char **argv)
745{
746 return arm_compute::utils::run_example<InceptionV4Example>(argc, argv);
747}