ONE - On-device Neural Engine
Loading...
Searching...
No Matches
onert::backend::train::ops::DepthwiseConvolutionLayer Class Reference

#include <DepthwiseConvolutionLayer.h>

Collaboration diagram for onert::backend::train::ops::DepthwiseConvolutionLayer:

Public Member Functions

 DepthwiseConvolutionLayer ()
 
void configureBackward (IPortableTensor *back_prop_input, IPortableTensor *grad_weights, IPortableTensor *grad_bias, const IPortableTensor *back_prop_output, const ir::Activation activation)
 
void forward (bool training) override
 
void backward () override
 
- Public Member Functions inherited from onert::exec::train::ITrainableFunction
virtual ~ITrainableFunction ()=default
 
virtual std::optional< backend::train::LayerScopeTensorsregisterLayerScopeTensors ()
 
- Public Member Functions inherited from onert::backend::cpu::ops::DepthwiseConvolutionLayer
 DepthwiseConvolutionLayer ()=default
 
void convFloat32 ()
 
void convQ8uPerTensor ()
 
void convQ8uPerChannel ()
 
void convQ8i ()
 
void convQ8iHybridPerChannel ()
 
void configure (const IPortableTensor *input, const IPortableTensor *kernel, const IPortableTensor *bias, const uint32_t paddingLeft, const uint32_t paddingRight, const uint32_t paddingTop, const uint32_t paddingBottom, const uint32_t strideW, const uint32_t strideH, const uint32_t multiplier, const uint32_t dilationWidth, const uint32_t dilationHeight, const ir::Activation activation, IPortableTensor *output, const std::shared_ptr< ExternalContext > &external_context)
 
void run () override
 
- Public Member Functions inherited from onert::exec::IFunction
virtual ~IFunction ()=default
 
virtual void prepare ()
 

Additional Inherited Members

- Protected Attributes inherited from onert::backend::cpu::ops::DepthwiseConvolutionLayer
const IPortableTensor_input {nullptr}
 
const IPortableTensor_kernel {nullptr}
 
const IPortableTensor_bias {nullptr}
 
IPortableTensor_output {nullptr}
 
uint32_t _paddingLeft {0}
 
uint32_t _paddingTop {0}
 
uint32_t _paddingRight {0}
 
uint32_t _paddingBottom {0}
 
uint32_t _strideWidth {0}
 
uint32_t _strideHeight {0}
 
uint32_t _multiplier {0}
 
uint32_t _dilationWidth {1}
 
uint32_t _dilationHeight {1}
 
ir::Activation _activation {ir::Activation::NONE}
 

Detailed Description

Definition at line 30 of file DepthwiseConvolutionLayer.h.

Constructor & Destructor Documentation

◆ DepthwiseConvolutionLayer()

onert::backend::train::ops::DepthwiseConvolutionLayer::DepthwiseConvolutionLayer ( )

Definition at line 28 of file DepthwiseConvolutionLayer.cc.

29 : cpu::ops::DepthwiseConvolutionLayer(), _grad_weights{nullptr}, _grad_bias{nullptr},
30 _back_prop_input{nullptr}, _back_prop_output{nullptr}, _act_back_prop_output{nullptr},
31 _use_padded_filter{false}, _padded_filter{nullptr}, _filter_buffers{nullptr},
32 _filter_dim_buffers{nullptr}
33{
34 // DO NOTHING
35}

Member Function Documentation

◆ backward()

void onert::backend::train::ops::DepthwiseConvolutionLayer::backward ( )
overridevirtual

Implements onert::exec::train::ITrainableFunction.

Definition at line 111 of file DepthwiseConvolutionLayer.cc.

112{
113 const auto data_type = _back_prop_output->data_type();
114 assert(data_type == _input->data_type());
115 switch (data_type)
116 {
117 case OperandType::FLOAT32:
118 {
119 assert(data_type == _grad_bias->data_type());
120 backwardFloat32();
121 break;
122 }
123 default:
124 throw std::runtime_error{"train DepthwiseConvolutionLayer: unsupported data type"};
125 }
126}
ir::DataType data_type() const override final

References onert::backend::cpu::ops::DepthwiseConvolutionLayer::_input, and onert::backend::IPortableTensor::data_type().

◆ configureBackward()

void onert::backend::train::ops::DepthwiseConvolutionLayer::configureBackward ( IPortableTensor back_prop_input,
IPortableTensor grad_weights,
IPortableTensor grad_bias,
const IPortableTensor back_prop_output,
const ir::Activation  activation 
)

Definition at line 37 of file DepthwiseConvolutionLayer.cc.

42{
43 _back_prop_input = back_prop_input;
44 _back_prop_output = back_prop_output;
45 _grad_weights = grad_weights;
46 _grad_bias = grad_bias;
47
48 if (_dilationWidth != 1 || _dilationHeight != 1)
49 throw std::runtime_error("train DepthwiseConvolutionLayer: Unsupported dilation yet");
50
51 if (activation != ir::Activation::NONE)
52 {
53 _act_back_prop_output = std::make_unique<BackPropTensor>(_back_prop_output->get_info());
54 _act_back_prop_output->setBuffer(
55 std::make_shared<basic::Allocator>(_act_back_prop_output->total_size()));
56 }
57
58 const int64_t k_packet_size = [&]() {
59 const auto data_type = _back_prop_output->data_type();
60 switch (data_type)
61 {
62 case OperandType::FLOAT32:
63 {
64 return nnfw::cker::eigen_support::kPacketSize<float>();
65 }
66 default:
67 throw std::runtime_error("train DepthwiseConvolutionLayer: unsupported data type");
68 }
69 }();
70
71 const auto incoming_shape = getShape(_back_prop_output);
72 const int out_depth = incoming_shape.Dims(3);
73
74 const int padded_filter_inner_dim_size =
75 ((out_depth + k_packet_size - 1) / k_packet_size) * k_packet_size;
76
77 // prepare out_bprop and in_bprop buffer for cker
78 // NOTE The Eigen library uses both main thread as well as a thread pool.
79 // Therefore, it needs to add an additional memory buffer for main thread.
80 const int thread_count = nnfw::cker::eigen_support::getThreadCount() + 1;
81
82 auto filter_dim_buffers_info = ir::OperandInfo(_back_prop_input->get_info());
83 filter_dim_buffers_info.shape({thread_count, padded_filter_inner_dim_size});
84 _filter_dim_buffers = std::make_unique<Tensor>(filter_dim_buffers_info);
85 _filter_dim_buffers->setBuffer(
86 std::make_shared<basic::Allocator>(_filter_dim_buffers->total_size()));
87
88 _use_padded_filter = (out_depth % k_packet_size) == 0 ? false : true;
89
90 const auto filter_shape = getShape(_kernel);
91 const int batch = incoming_shape.Dims(0);
92
93 const int filter_rows = filter_shape.Dims(1);
94 const int filter_cols = filter_shape.Dims(2);
95 const int filter_spatial_size = filter_rows * filter_cols;
96
97 // prepare padded_filter buffer for cker
98 auto padded_filter_info = ir::OperandInfo(_kernel->get_info());
99 padded_filter_info.shape({batch, filter_spatial_size, padded_filter_inner_dim_size});
100 _padded_filter = std::make_unique<Tensor>(padded_filter_info);
101 _padded_filter->setBuffer(std::make_shared<basic::Allocator>(_padded_filter->total_size()));
102
103 auto filter_buffers_info = ir::OperandInfo(_kernel->get_info());
104 filter_buffers_info.shape({thread_count, filter_spatial_size, padded_filter_inner_dim_size});
105 _filter_buffers = std::make_unique<Tensor>(filter_buffers_info);
106 _filter_buffers->setBuffer(std::make_shared<basic::Allocator>(_filter_buffers->total_size()));
107}
const ir::OperandInfo & get_info() const
nnfw::cker::Shape getShape(const IPortableTensor *tensor)
Get shape of tensor.

References onert::backend::cpu::ops::DepthwiseConvolutionLayer::_dilationHeight, onert::backend::cpu::ops::DepthwiseConvolutionLayer::_dilationWidth, onert::backend::cpu::ops::DepthwiseConvolutionLayer::_kernel, onert::backend::IPortableTensor::data_type(), onert::backend::IPortableTensor::get_info(), onert::backend::train::ops::getShape(), nnfw::cker::eigen_support::getThreadCount(), and onert::ir::NONE.

◆ forward()

void onert::backend::train::ops::DepthwiseConvolutionLayer::forward ( bool  training)
overridevirtual

The documentation for this class was generated from the following files: