return padding;
}
-Padding same_padding(const nnfw::util::feature::Shape &ifm_shape,
- const nnfw::util::feature::Shape &ofm_shape, const Stride &stride, uint32_t kw,
+Padding same_padding(const nnfw::util::feature::Shape &ifm_shape, const Stride &stride, uint32_t kw,
uint32_t kh)
{
Padding padding;
// padding_to_beginning = total_padding / 2
// padding_to_end = (total_padding + 1)/2.
//
- const int32_t vertical_needed_input = (ofm_shape.H - 1) * stride.vertical + kh;
+ const int32_t out_size_height = (ifm_shape.H + stride.vertical - 1) / stride.vertical;
+ const int32_t out_size_width = (ifm_shape.W + stride.horizontal - 1) / stride.horizontal;
+
+ const int32_t vertical_needed_input = (out_size_height - 1) * stride.vertical + kh;
const int32_t vertical_total_padding = std::max(0, vertical_needed_input - ifm_shape.H);
- const int32_t horizontal_needed_input = (ofm_shape.W - 1) * stride.horizontal + kw;
+ const int32_t horizontal_needed_input = (out_size_width - 1) * stride.horizontal + kw;
const int32_t horizontal_total_padding = std::max(0, horizontal_needed_input - ifm_shape.W);
padding.top = vertical_total_padding / 2;
param.stride = stride;
param.padding = (padding_type == ANEURALNETWORKS_PADDING_SAME)
- ? same_padding(ifm_shape, ofm_shape, stride, ker_shape.W, ker_shape.H)
+ ? same_padding(ifm_shape, stride, ker_shape.W, ker_shape.H)
: valid_padding();
param.activation = static_cast<FuseCode>(_ctx.at(activation_index).asScalar<int32_t>());
param.stride = stride;
param.padding = (padding_type == ANEURALNETWORKS_PADDING_SAME)
- ? same_padding(ifm_shape, ofm_shape, stride, ker_shape.W, ker_shape.H)
+ ? same_padding(ifm_shape, stride, ker_shape.W, ker_shape.H)
: valid_padding();
param.multipler = multiplier;
param.stride.horizontal = hstride;
param.padding = (padding_type == ANEURALNETWORKS_PADDING_SAME)
- ? same_padding(ifm_shape, ofm_shape, param.stride, kw, kh)
+ ? same_padding(ifm_shape, param.stride, kw, kh)
: valid_padding();
param.activation = static_cast<FuseCode>(_ctx.at(activation_index).asScalar<int32_t>());
param.stride.horizontal = hstride;
param.padding = (padding_type == ANEURALNETWORKS_PADDING_SAME)
- ? same_padding(ifm_shape, ofm_shape, param.stride, kw, kh)
+ ? same_padding(ifm_shape, param.stride, kw, kh)
: valid_padding();
param.activation = static_cast<FuseCode>(_ctx.at(activation_index).asScalar<int32_t>());
param.stride.horizontal = hstride;
param.padding = (padding_type == ANEURALNETWORKS_PADDING_SAME)
- ? same_padding(ifm_shape, ofm_shape, param.stride, kw, kh)
+ ? same_padding(ifm_shape, param.stride, kw, kh)
: valid_padding();
param.activation = static_cast<FuseCode>(_ctx.at(activation_index).asScalar<int32_t>());