29 #include "utils/Utils.h"
36 class GraphResNetV1_50Example :
public Example
39 GraphResNetV1_50Example() : cmd_parser(), common_opts(cmd_parser), common_params(), graph(0,
"ResNetV1_50")
42 bool do_setup(
int argc,
char **argv)
override
45 cmd_parser.parse(argc, argv);
46 cmd_parser.validate();
52 if (common_params.help)
54 cmd_parser.print_help(argv[0]);
59 std::cout << common_params << std::endl;
62 std::string data_path = common_params.data_path;
65 const std::array<float, 3> mean_rgb{{122.68f, 116.67f, 104.01f}};
66 std::unique_ptr<IPreprocessor> preprocessor =
67 std::make_unique<CaffePreproccessor>(mean_rgb,
false );
70 const auto operation_layout = common_params.data_layout;
71 const TensorShape tensor_shape =
79 graph << common_params.target << common_params.fast_math_hint
85 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(2, 2, 3, 3))
94 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
100 add_residual_block(data_path,
"block1", weights_layout, 64, 3, 2);
101 add_residual_block(data_path,
"block2", weights_layout, 128, 4, 2);
102 add_residual_block(data_path,
"block3", weights_layout, 256, 6, 2);
103 add_residual_block(data_path,
"block4", weights_layout, 512, 3, 1);
110 PadStrideInfo(1, 1, 0, 0))
118 config.
use_tuner = common_params.enable_tuner;
121 config.
mlgo_file = common_params.mlgo_file;
125 graph.finalize(common_params.target, config);
130 void do_run()
override
142 void add_residual_block(
const std::string &data_path,
143 const std::string &
name,
145 unsigned int base_depth,
146 unsigned int num_units,
149 for (
unsigned int i = 0; i < num_units; ++i)
151 std::stringstream unit_path_ss;
152 unit_path_ss <<
"/cnn_data/resnet50_model/" <<
name <<
"_unit_" << (i + 1) <<
"_bottleneck_v1_";
153 std::stringstream unit_name_ss;
154 unit_name_ss <<
name <<
"/unit" << (i + 1) <<
"/bottleneck_v1/";
156 std::string unit_path = unit_path_ss.str();
157 std::string unit_name = unit_name_ss.str();
159 unsigned int middle_stride = 1;
161 if (i == (num_units - 1))
163 middle_stride = stride;
169 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
170 PadStrideInfo(1, 1, 0, 0))
171 .
set_name(unit_name +
"conv1/convolution")
177 .
set_name(unit_name +
"conv1/BatchNorm")
178 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
183 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
184 PadStrideInfo(middle_stride, middle_stride, 1, 1))
185 .
set_name(unit_name +
"conv2/convolution")
191 .
set_name(unit_name +
"conv2/BatchNorm")
192 <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
197 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr),
198 PadStrideInfo(1, 1, 0, 0))
199 .
set_name(unit_name +
"conv3/convolution")
205 .
set_name(unit_name +
"conv2/BatchNorm");
211 1U, 1U, base_depth * 4,
213 std::unique_ptr<arm_compute::graph::ITensorAccessor>(
nullptr), PadStrideInfo(1, 1, 0, 0))
214 .
set_name(unit_name +
"shortcut/convolution")
221 .
set_name(unit_name +
"shortcut/BatchNorm");
223 graph <<
EltwiseLayer(std::move(left), std::move(right), EltwiseOperation::Add)
226 else if (middle_stride > 1)
230 PadStrideInfo(middle_stride, middle_stride, 0, 0),
true))
231 .
set_name(unit_name +
"shortcut/MaxPool");
233 graph <<
EltwiseLayer(std::move(left), std::move(right), EltwiseOperation::Add)
239 graph <<
EltwiseLayer(std::move(left), std::move(right), EltwiseOperation::Add)
243 graph <<
ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
263 int main(
int argc,
char **argv)
265 return arm_compute::utils::run_example<GraphResNetV1_50Example>(argc, argv);