aboutsummaryrefslogtreecommitdiff
path: root/examples/graph_resnext50.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/graph_resnext50.cpp')
-rw-r--r--examples/graph_resnext50.cpp121
1 files changed, 66 insertions, 55 deletions
diff --git a/examples/graph_resnext50.cpp b/examples/graph_resnext50.cpp
index 97eb85ccd1..12a1507c4c 100644
--- a/examples/graph_resnext50.cpp
+++ b/examples/graph_resnext50.cpp
@@ -22,6 +22,7 @@
* SOFTWARE.
*/
#include "arm_compute/graph.h"
+
#include "support/ToolchainSupport.h"
#include "utils/CommonGraphOptions.h"
#include "utils/GraphUtils.h"
@@ -35,8 +36,7 @@ using namespace arm_compute::graph_utils;
class GraphResNeXt50Example : public Example
{
public:
- GraphResNeXt50Example()
- : cmd_parser(), common_opts(cmd_parser), common_params(), graph(0, "ResNeXt50")
+ GraphResNeXt50Example() : cmd_parser(), common_opts(cmd_parser), common_params(), graph(0, "ResNeXt50")
{
}
bool do_setup(int argc, char **argv) override
@@ -49,14 +49,15 @@ public:
common_params = consume_common_graph_parameters(common_opts);
// Return when help menu is requested
- if(common_params.help)
+ if (common_params.help)
{
cmd_parser.print_help(argv[0]);
return false;
}
// Checks
- ARM_COMPUTE_EXIT_ON_MSG(arm_compute::is_data_type_quantized_asymmetric(common_params.data_type), "QASYMM8 not supported for this graph");
+ ARM_COMPUTE_EXIT_ON_MSG(arm_compute::is_data_type_quantized_asymmetric(common_params.data_type),
+ "QASYMM8 not supported for this graph");
// Print parameter values
std::cout << common_params << std::endl;
@@ -66,28 +67,33 @@ public:
// Create input descriptor
const auto operation_layout = common_params.data_layout;
- const TensorShape tensor_shape = permute_shape(TensorShape(224U, 224U, 3U, common_params.batches), DataLayout::NCHW, operation_layout);
- TensorDescriptor input_descriptor = TensorDescriptor(tensor_shape, common_params.data_type).set_layout(operation_layout);
+ const TensorShape tensor_shape =
+ permute_shape(TensorShape(224U, 224U, 3U, common_params.batches), DataLayout::NCHW, operation_layout);
+ TensorDescriptor input_descriptor =
+ TensorDescriptor(tensor_shape, common_params.data_type).set_layout(operation_layout);
// Set weights trained layout
const DataLayout weights_layout = DataLayout::NCHW;
- graph << common_params.target
- << common_params.fast_math_hint
+ graph << common_params.target << common_params.fast_math_hint
<< InputLayer(input_descriptor, get_input_accessor(common_params))
<< ScaleLayer(get_weights_accessor(data_path, "/cnn_data/resnext50_model/bn_data_mul.npy"),
get_weights_accessor(data_path, "/cnn_data/resnext50_model/bn_data_add.npy"))
- .set_name("bn_data/Scale")
+ .set_name("bn_data/Scale")
<< ConvolutionLayer(
- 7U, 7U, 64U,
- get_weights_accessor(data_path, "/cnn_data/resnext50_model/conv0_weights.npy", weights_layout),
- get_weights_accessor(data_path, "/cnn_data/resnext50_model/conv0_biases.npy"),
- PadStrideInfo(2, 2, 2, 3, 2, 3, DimensionRoundingType::FLOOR))
- .set_name("conv0/Convolution")
- << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name("conv0/Relu")
- << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, operation_layout, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::FLOOR))).set_name("pool0");
-
- add_residual_block(data_path, weights_layout, /*ofm*/ 256, /*stage*/ 1, /*num_unit*/ 3, /*stride_conv_unit1*/ 1);
+ 7U, 7U, 64U,
+ get_weights_accessor(data_path, "/cnn_data/resnext50_model/conv0_weights.npy", weights_layout),
+ get_weights_accessor(data_path, "/cnn_data/resnext50_model/conv0_biases.npy"),
+ PadStrideInfo(2, 2, 2, 3, 2, 3, DimensionRoundingType::FLOOR))
+ .set_name("conv0/Convolution")
+ << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
+ .set_name("conv0/Relu")
+ << PoolingLayer(PoolingLayerInfo(PoolingType::MAX, 3, operation_layout,
+ PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::FLOOR)))
+ .set_name("pool0");
+
+ add_residual_block(data_path, weights_layout, /*ofm*/ 256, /*stage*/ 1, /*num_unit*/ 3,
+ /*stride_conv_unit1*/ 1);
add_residual_block(data_path, weights_layout, 512, 2, 4, 2);
add_residual_block(data_path, weights_layout, 1024, 3, 6, 2);
add_residual_block(data_path, weights_layout, 2048, 4, 3, 2);
@@ -121,10 +127,14 @@ private:
CommonGraphParams common_params;
Stream graph;
- void add_residual_block(const std::string &data_path, DataLayout weights_layout,
- unsigned int base_depth, unsigned int stage, unsigned int num_units, unsigned int stride_conv_unit1)
+ void add_residual_block(const std::string &data_path,
+ DataLayout weights_layout,
+ unsigned int base_depth,
+ unsigned int stage,
+ unsigned int num_units,
+ unsigned int stride_conv_unit1)
{
- for(unsigned int i = 0; i < num_units; ++i)
+ for (unsigned int i = 0; i < num_units; ++i)
{
std::stringstream unit_path_ss;
unit_path_ss << "/cnn_data/resnext50_model/stage" << stage << "_unit" << (i + 1) << "_";
@@ -135,54 +145,55 @@ private:
std::string unit_name = unit_name_ss.str();
PadStrideInfo pad_grouped_conv(1, 1, 1, 1);
- if(i == 0)
+ if (i == 0)
{
- pad_grouped_conv = (stage == 1) ? PadStrideInfo(stride_conv_unit1, stride_conv_unit1, 1, 1) : PadStrideInfo(stride_conv_unit1, stride_conv_unit1, 0, 1, 0, 1, DimensionRoundingType::FLOOR);
+ pad_grouped_conv = (stage == 1) ? PadStrideInfo(stride_conv_unit1, stride_conv_unit1, 1, 1)
+ : PadStrideInfo(stride_conv_unit1, stride_conv_unit1, 0, 1, 0, 1,
+ DimensionRoundingType::FLOOR);
}
SubStream right(graph);
- right << ConvolutionLayer(
- 1U, 1U, base_depth / 2,
- get_weights_accessor(data_path, unit_path + "conv1_weights.npy", weights_layout),
- get_weights_accessor(data_path, unit_path + "conv1_biases.npy"),
- PadStrideInfo(1, 1, 0, 0))
- .set_name(unit_name + "conv1/convolution")
- << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(unit_name + "conv1/Relu")
-
- << ConvolutionLayer(
- 3U, 3U, base_depth / 2,
- get_weights_accessor(data_path, unit_path + "conv2_weights.npy", weights_layout),
- std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
- pad_grouped_conv, 32)
- .set_name(unit_name + "conv2/convolution")
+ right << ConvolutionLayer(1U, 1U, base_depth / 2,
+ get_weights_accessor(data_path, unit_path + "conv1_weights.npy", weights_layout),
+ get_weights_accessor(data_path, unit_path + "conv1_biases.npy"),
+ PadStrideInfo(1, 1, 0, 0))
+ .set_name(unit_name + "conv1/convolution")
+ << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
+ .set_name(unit_name + "conv1/Relu")
+
+ << ConvolutionLayer(3U, 3U, base_depth / 2,
+ get_weights_accessor(data_path, unit_path + "conv2_weights.npy", weights_layout),
+ std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr), pad_grouped_conv,
+ 32)
+ .set_name(unit_name + "conv2/convolution")
<< ScaleLayer(get_weights_accessor(data_path, unit_path + "bn2_mul.npy"),
get_weights_accessor(data_path, unit_path + "bn2_add.npy"))
- .set_name(unit_name + "conv1/Scale")
- << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(unit_name + "conv2/Relu")
+ .set_name(unit_name + "conv1/Scale")
+ << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
+ .set_name(unit_name + "conv2/Relu")
- << ConvolutionLayer(
- 1U, 1U, base_depth,
- get_weights_accessor(data_path, unit_path + "conv3_weights.npy", weights_layout),
- get_weights_accessor(data_path, unit_path + "conv3_biases.npy"),
- PadStrideInfo(1, 1, 0, 0))
- .set_name(unit_name + "conv3/convolution");
+ << ConvolutionLayer(1U, 1U, base_depth,
+ get_weights_accessor(data_path, unit_path + "conv3_weights.npy", weights_layout),
+ get_weights_accessor(data_path, unit_path + "conv3_biases.npy"),
+ PadStrideInfo(1, 1, 0, 0))
+ .set_name(unit_name + "conv3/convolution");
SubStream left(graph);
- if(i == 0)
+ if (i == 0)
{
- left << ConvolutionLayer(
- 1U, 1U, base_depth,
- get_weights_accessor(data_path, unit_path + "sc_weights.npy", weights_layout),
- std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
- PadStrideInfo(stride_conv_unit1, stride_conv_unit1, 0, 0))
- .set_name(unit_name + "sc/convolution")
+ left << ConvolutionLayer(1U, 1U, base_depth,
+ get_weights_accessor(data_path, unit_path + "sc_weights.npy", weights_layout),
+ std::unique_ptr<arm_compute::graph::ITensorAccessor>(nullptr),
+ PadStrideInfo(stride_conv_unit1, stride_conv_unit1, 0, 0))
+ .set_name(unit_name + "sc/convolution")
<< ScaleLayer(get_weights_accessor(data_path, unit_path + "sc_bn_mul.npy"),
get_weights_accessor(data_path, unit_path + "sc_bn_add.npy"))
- .set_name(unit_name + "sc/scale");
+ .set_name(unit_name + "sc/scale");
}
graph << EltwiseLayer(std::move(left), std::move(right), EltwiseOperation::Add).set_name(unit_name + "add");
- graph << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)).set_name(unit_name + "Relu");
+ graph << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU))
+ .set_name(unit_name + "Relu");
}
}
};
@@ -192,7 +203,7 @@ private:
* Model is based on:
* https://arxiv.org/abs/1611.05431
* "Aggregated Residual Transformations for Deep Neural Networks"
- * Saining Xie, Ross Girshick, Piotr Dollar, Zhuowen Tu, Kaiming He
+ * Saining Xie, Ross Girshick, Piotr Dollar, Zhuowen Tu, Kaiming He.
*
* @note To list all the possible arguments execute the binary appended with the --help option
*