*/
#include "ConvolutionSpec.h"
+#include "PaddingUtils.h"
#include "ShapeQuery.h"
#include <cassert>
{
assert(spatial_axis < num_spatial_axes());
- if (_param.pad().size() == 0)
- {
- if (_param.has_pad_h() || _param.has_pad_w())
- {
- assert(num_spatial_axes() == 2);
- return (spatial_axis == 0) ? _param.pad_h() : _param.pad_w();
- }
- // NOTE default pad is 0
- return 0;
- }
-
- // NOTE pad and pad_h/pad_w cannot be specified at the same time
- // Please refer to Caffe for details. You may find the relevant implementation
- // from BaseConvolutionLayer<Dtype>::LayerSetUp in base_conv_layer.cpp.
- assert(!_param.has_pad_h());
- assert(!_param.has_pad_w());
-
- if (_param.pad().size() == 1)
- {
- return _param.pad(0);
- }
+ auto raw_padding = build_raw_padding().with(_param);
+ auto spatial_padding = build_spatial_padding(num_spatial_axes()).with(raw_padding);
- assert(_param.pad().size() == num_spatial_axes());
- return _param.pad(spatial_axis);
+ return spatial_padding.value(spatial_axis);
}
uint32_t ConvolutionSpec::stride(uint32_t spatial_axis) const
*/
#include "PoolingSpec.h"
+#include "PaddingUtils.h"
#include <map>
#include <cassert>
uint32_t PoolingSpec::vertical_pad(void) const
{
- if (_param.has_pad_h())
- {
- return _param.pad_h();
- }
-
- if (_param.has_pad())
- {
- return _param.pad();
- }
-
- // NOTE Default padding is 0
- return 0;
+ // NOTE The input of Pooling SHOULD BE a rank-4 tensor.
+ // Reference: PoolingLayer<Dtype>::Reshape in pooling_layer.cpp
+ auto raw_padding = build_raw_padding().with(_param);
+ auto spatial_padding = build_spatial_padding(2 /* SPATIAL RANK */).with(raw_padding);
+ return spatial_padding.value(0 /* H */);
}
uint32_t PoolingSpec::horizontal_pad(void) const
{
- if (_param.has_pad_w())
- {
- return _param.pad_w();
- }
-
- if (_param.has_pad())
- {
- return _param.pad();
- }
-
- // NOTE Default padding is 0
- return 0;
+ // NOTE The input of Pooling SHOULD BE a rank-4 tensor.
+ // Reference: PoolingLayer<Dtype>::Reshape in pooling_layer.cpp
+ auto raw_padding = build_raw_padding().with(_param);
+ auto spatial_padding = build_spatial_padding(2 /* SPATIAL RANK */).with(raw_padding);
+ return spatial_padding.value(1 /* W */);
}
uint32_t PoolingSpec::vertical_stride(void) const