40 template <
typename T,
typename TB>
47 const int width_in = src.
shape().x();
48 const int height_in = src.
shape().y();
49 const int depth_in = src.
shape().z();
51 const int width_out =
dst.shape().x();
52 const int height_out =
dst.shape().y();
53 const int depth_out =
dst.shape().z();
55 const int width_weights = weights.
shape().x();
56 const int height_weights = weights.
shape().y();
57 const int depth_weights = weights.
shape().z();
59 const int pad_left = info.
pad_left();
60 const int pad_top = info.
pad_top();
61 const int stride_xi = info.
stride().first;
62 const int stride_yi = info.
stride().second;
64 auto output_wh =
scaled_dimensions(width_in, height_in, width_weights, height_weights, info);
66 const int start_xi = width_weights / 2 - pad_left;
67 const int start_yi = height_weights / 2 - pad_top;
68 const int end_xi = output_wh.first * stride_xi;
69 const int end_yi = output_wh.second * stride_yi;
70 const int num_batches = src.
shape().total_size() / (width_in * height_in * depth_in);
72 for(
int r = 0; r < num_batches; ++r)
75 for(
int yi = start_yi; yi < start_yi + end_yi; yi += stride_yi)
77 for(
int xi = start_xi; xi < start_xi + end_xi; xi += stride_xi)
79 for(
int ofm = 0; ofm < depth_out; ++ofm)
82 const int offset_in = r * width_in * height_in * depth_in;
83 const int xo = (xi - start_xi) / stride_xi;
84 const int yo = (yi - start_yi) / stride_yi;
85 const int offset_out = xo + yo * width_out + ofm * width_out * height_out + r * width_out * height_out * depth_out;
92 offset_in, count * width_weights * height_weights * depth_weights, count, offset_out,
94 width_in, height_in, depth_in,
95 width_weights, height_weights);
SimpleTensor< T > locally_connected(const SimpleTensor< T > &src, const SimpleTensor< T > &weights, const SimpleTensor< TB > &bias, const TensorShape &output_shape, const PadStrideInfo &info)
DataType data_type() const override
Data type of the tensor.
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.
std::pair< unsigned int, unsigned int > stride() const
Get the stride.
Padding and stride information class.
#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.
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...
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)
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.