49 template <
typename T,
typename TB>
54 const int width_in = src.
shape().x();
55 const int height_in = src.
shape().y();
56 const int depth_in = src.
shape().z();
57 const int width_out = dst.
shape().x();
58 const int height_out = dst.
shape().y();
59 const int depth_out = dst.
shape().z();
60 const int width_weights = weights.
shape().x();
61 const int height_weights = weights.
shape().y();
62 const int depth_weights = weights.
shape().z();
63 const int pad_left = info.
pad_left();
64 const int pad_top = info.
pad_top();
65 const int stride_xi = info.
stride().first;
66 const int stride_yi = info.
stride().second;
68 auto output_wh =
scaled_dimensions(width_in, height_in, width_weights, height_weights, info, dilation);
70 const int start_xi = (dilation.
x() * (width_weights - 1) + 1) / 2 - pad_left;
71 const int start_yi = (dilation.
y() * (height_weights - 1) + 1) / 2 - pad_top;
72 const int end_xi = output_wh.first * stride_xi;
73 const int end_yi = output_wh.second * stride_yi;
74 const int num_batches = src.
shape().total_size() / (width_in * height_in * depth_in);
76 for(
int r = 0; r < num_batches; ++r)
78 for(
int yi = start_yi; yi < start_yi + end_yi; yi += stride_yi)
80 for(
int xi = start_xi; xi < start_xi + end_xi; xi += stride_xi)
82 for(
int ofm = 0; ofm < depth_out; ++ofm)
85 const int offset_in = r * width_in * height_in * depth_in;
86 const int xo = (xi - start_xi) / stride_xi;
87 const int yo = (yi - start_yi) / stride_yi;
88 const int offset_out = xo + yo * width_out + ofm * width_out * height_out + r * width_out * height_out * depth_out;
95 offset_in, ofm * width_weights * height_weights * depth_weights, ofm, offset_out,
97 width_in, height_in, depth_in,
98 width_weights, height_weights, dilation.
x(), dilation.
y());
106 template <
typename T,
typename TB>
SimpleTensor< T > convolution_layer(const SimpleTensor< T > &src, const SimpleTensor< T > &weights, const SimpleTensor< TB > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation)
DataType data_type() const override
Data type of the tensor.
Strides PermutationVector
Permutation vector.
TensorShape shape() const override
Shape of the tensor.
src info() -> set_format(Format::S16)
This file contains all available output stages for GEMMLowp on OpenCL.
size_t y() const
Semantic accessor for height as y.
std::pair< unsigned int, unsigned int > stride() const
Get the stride.
Padding and stride information class.
DataLayout data_layout() const override
Data layout of the tensor.
#define ARM_COMPUTE_ASSERT(X)
Simple tensor object that stores elements in a consecutive chunk of memory.
unsigned int pad_left() const
Get the left padding.
Class for specifying the size of an image or rectangle.
Num samples, height, width, channels.
const std::pair< unsigned int, unsigned int > scaled_dimensions(unsigned int width, unsigned int height, unsigned int kernel_width, unsigned int kernel_height, const PadStrideInfo &pad_stride_info, const Size2D &dilation=Size2D(1U, 1U))
Returns expected width and height of output scaled tensor depending on dimensions rounding mode...
SimpleTensor< T > convolution_layer_nchw(const SimpleTensor< T > &src, const SimpleTensor< T > &weights, const SimpleTensor< TB > &bias, SimpleTensor< T > &dst, const PadStrideInfo &info, const Size2D &dilation)
QuantizationInfo quantization_info() const override
Quantization info in case of asymmetric quantized type.
void convolution3d(const SimpleTensor< T > &in, const SimpleTensor< T > &weights, const SimpleTensor< TB > &bias, SimpleTensor< T > &out, int i_offset, int w_offset, int b_offset, int o_offset, int xi, int yi, int width_in, int height_in, int depth_in, int width_weights, int height_weights, int dilation_x=1, int dilation_y=1)
size_t x() const
Semantic accessor for width as x.
int fixed_point_position() const override
Number of bits for the fractional part.
convolution configure & src
unsigned int pad_top() const
Get the top padding.