blob: 88073b7efbcbd079da7b4f5ec531ddbde6661c48 [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 */
Pablo Telloeb82fd22018-02-23 13:43:50 +000024#include "arm_compute/core/Error.h"
Georgios Pinitasd8734b52017-12-22 15:27:52 +000025#include "arm_compute/graph2.h"
Georgios Pinitas240cfa62018-02-26 19:58:04 +000026#include "support/ToolchainSupport.h"
27#include "utils/GraphUtils.h"
28#include "utils/Utils.h"
29
30#include <cstdlib>
31#include <tuple>
32
33using namespace arm_compute::utils;
Georgios Pinitasd8734b52017-12-22 15:27:52 +000034using namespace arm_compute::graph2::frontend;
Georgios Pinitas240cfa62018-02-26 19:58:04 +000035using namespace arm_compute::graph_utils;
36
37/** Example demonstrating how to implement InceptionV4's network using the Compute Library's graph API
38 *
39 * @param[in] argc Number of arguments
40 * @param[in] argv Arguments ( [optional] Target (0 = NEON, 1 = OpenCL, 2 = OpenCL with Tuner), [optional] Path to the weights folder, [optional] image, [optional] labels )
41 */
42class InceptionV4Example final : public Example
43{
44public:
45 void do_setup(int argc, char **argv) override
46 {
Pablo Telloeb82fd22018-02-23 13:43:50 +000047 // Disabled the test for now because the process gets killed on Linux Firefly 32 bit even when using ConvolutionMethodHint::DIRECT.
48 // Needs to review/rework to run the code below.
49#if __aarch64__
Georgios Pinitas240cfa62018-02-26 19:58:04 +000050 std::string data_path; /* Path to the trainable data */
51 std::string image; /* Image data */
52 std::string label; /* Label data */
53
54 // Create a preprocessor object
55 std::unique_ptr<IPreprocessor> preprocessor = arm_compute::support::cpp14::make_unique<TFPreproccessor>();
56
Georgios Pinitasd8734b52017-12-22 15:27:52 +000057 // Set target. 0 (NEON), 1 (OpenCL). By default it is NEON
58 const int target = argc > 1 ? std::strtol(argv[1], nullptr, 10) : 0;
59 Target target_hint = set_target_hint2(target);
60 bool enable_tuning = (target == 2);
61 bool enable_memory_management = true;
Georgios Pinitas240cfa62018-02-26 19:58:04 +000062
Georgios Pinitas28705162018-03-21 20:10:53 +000063 ConvolutionMethod convolution_hint = (target_hint == Target::CL) ? ConvolutionMethod::WINOGRAD : ConvolutionMethod::GEMM;
64
Georgios Pinitas240cfa62018-02-26 19:58:04 +000065 // Parse arguments
66 if(argc < 2)
67 {
68 // Print help
69 std::cout << "Usage: " << argv[0] << " [target] [path_to_data] [image] [labels]\n\n";
70 std::cout << "No data folder provided: using random values\n\n";
71 }
72 else if(argc == 2)
73 {
74 std::cout << "Usage: " << argv[0] << " " << argv[1] << " [path_to_data] [image] [labels]\n\n";
75 std::cout << "No data folder provided: using random values\n\n";
76 }
77 else if(argc == 3)
78 {
79 data_path = argv[2];
80 std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " [image] [labels]\n\n";
81 std::cout << "No image provided: using random values\n\n";
82 }
83 else if(argc == 4)
84 {
85 data_path = argv[2];
86 image = argv[3];
87 std::cout << "Usage: " << argv[0] << " " << argv[1] << " " << argv[2] << " " << argv[3] << " [labels]\n\n";
88 std::cout << "No text file with labels provided: skipping output accessor\n\n";
89 }
90 else
91 {
92 data_path = argv[2];
93 image = argv[3];
94 label = argv[4];
95 }
96
Georgios Pinitasd8734b52017-12-22 15:27:52 +000097 graph << target_hint << InputLayer(TensorDescriptor(TensorShape(299U, 299U, 3U, 1U), DataType::F32),
98 get_input_accessor(image, std::move(preprocessor), false))
Georgios Pinitas240cfa62018-02-26 19:58:04 +000099 // Conv2d_1a_3x3
100 << ConvolutionLayer(3U, 3U, 32U,
101 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_weights.npy"),
102 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(2, 2, 0, 0))
103 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_moving_mean.npy"),
104 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_moving_variance.npy"),
105 get_random_accessor(1.f, 1.f),
106 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_1a_3x3_BatchNorm_beta.npy"),
107 0.001f)
108 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
Georgios Pinitas28705162018-03-21 20:10:53 +0000109 << convolution_hint
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000110 // Conv2d_2a_3x3
111 << ConvolutionLayer(3U, 3U, 32U,
112 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_weights.npy"),
113 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 0, 0))
114 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_moving_mean.npy"),
115 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_moving_variance.npy"),
116 get_random_accessor(1.f, 1.f),
117 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2a_3x3_BatchNorm_beta.npy"),
118 0.001f)
119 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
120 // Conv2d_2b_3x3
121 << ConvolutionLayer(3U, 3U, 64U,
122 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_weights.npy"),
123 std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), PadStrideInfo(1, 1, 1, 1))
124 << BatchNormalizationLayer(get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_moving_mean.npy"),
125 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_moving_variance.npy"),
126 get_random_accessor(1.f, 1.f),
127 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Conv2d_2b_3x3_BatchNorm_beta.npy"),
128 0.001f)
129 << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
130
131 << get_mixed_3a(data_path)
132 << get_mixed_4a(data_path)
133 << get_mixed_5a(data_path)
134 // 4 inception A blocks
135 << get_inceptionA_block(data_path, "Mixed_5b")
136 << get_inceptionA_block(data_path, "Mixed_5c")
137 << get_inceptionA_block(data_path, "Mixed_5d")
138 << get_inceptionA_block(data_path, "Mixed_5e")
139 // reduction A block
140 << get_reductionA_block(data_path)
141 // 7 inception B blocks
142 << get_inceptionB_block(data_path, "Mixed_6b")
143 << get_inceptionB_block(data_path, "Mixed_6c")
144 << get_inceptionB_block(data_path, "Mixed_6d")
145 << get_inceptionB_block(data_path, "Mixed_6e")
146 << get_inceptionB_block(data_path, "Mixed_6f")
147 << get_inceptionB_block(data_path, "Mixed_6g")
148 << get_inceptionB_block(data_path, "Mixed_6h")
149 // reduction B block
150 << get_reductionB_block(data_path)
151 // 3 inception C blocks
152 << get_inceptionC_block(data_path, "Mixed_7b")
153 << get_inceptionC_block(data_path, "Mixed_7c")
154 << get_inceptionC_block(data_path, "Mixed_7d")
155 << PoolingLayer(PoolingLayerInfo(PoolingType::AVG))
156 << FlattenLayer()
157 << FullyConnectedLayer(
158 1001U,
159 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Logits_Logits_weights.npy"),
160 get_weights_accessor(data_path, "/cnn_data/inceptionv4_model/Logits_Logits_biases.npy"))
161 << SoftmaxLayer()
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000162 << OutputLayer(get_output_accessor(label, 5));
Georgios Pinitas240cfa62018-02-26 19:58:04 +0000163
Georgios Pinitasd8734b52017-12-22 15:27:52 +0000164 // Finalize graph
165 graph.finalize(target_hint, enable_tuning, enable_memory_management);
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}