|
|
@@ -68,6 +68,8 @@ class BaseConvolutionLayer : public Layer<Dtype> { |
|
|
Blob<int> stride_;
|
|
|
/// @brief The spatial dimensions of the padding.
|
|
|
Blob<int> pad_;
|
|
|
+ /// @brief The spatial dimensions of the dilation.
|
|
|
+ Blob<int> dilation_;
|
|
|
/// @brief The spatial dimensions of the convolution input.
|
|
|
Blob<int> conv_input_shape_;
|
|
|
/// @brief The spatial dimensions of the col_buffer.
|
|
|
@@ -99,11 +101,12 @@ class BaseConvolutionLayer : public Layer<Dtype> { |
|
|
conv_input_shape_.cpu_data()[1], conv_input_shape_.cpu_data()[2],
|
|
|
kernel_shape_.cpu_data()[0], kernel_shape_.cpu_data()[1],
|
|
|
pad_.cpu_data()[0], pad_.cpu_data()[1],
|
|
|
- stride_.cpu_data()[0], stride_.cpu_data()[1], col_buff);
|
|
|
+ stride_.cpu_data()[0], stride_.cpu_data()[1],
|
|
|
+ dilation_.cpu_data()[0], dilation_.cpu_data()[1], col_buff);
|
|
|
} else {
|
|
|
im2col_nd_cpu(data, num_spatial_axes_, conv_input_shape_.cpu_data(),
|
|
|
col_buffer_shape_.data(), kernel_shape_.cpu_data(),
|
|
|
- pad_.cpu_data(), stride_.cpu_data(), col_buff);
|
|
|
+ pad_.cpu_data(), stride_.cpu_data(), dilation_.cpu_data(), col_buff);
|
|
|
}
|
|
|
}
|
|
|
inline void conv_col2im_cpu(const Dtype* col_buff, Dtype* data) {
|
|
|
@@ -112,11 +115,12 @@ class BaseConvolutionLayer : public Layer<Dtype> { |
|
|
conv_input_shape_.cpu_data()[1], conv_input_shape_.cpu_data()[2],
|
|
|
kernel_shape_.cpu_data()[0], kernel_shape_.cpu_data()[1],
|
|
|
pad_.cpu_data()[0], pad_.cpu_data()[1],
|
|
|
- stride_.cpu_data()[0], stride_.cpu_data()[1], data);
|
|
|
+ stride_.cpu_data()[0], stride_.cpu_data()[1],
|
|
|
+ dilation_.cpu_data()[0], dilation_.cpu_data()[1], data);
|
|
|
} else {
|
|
|
col2im_nd_cpu(col_buff, num_spatial_axes_, conv_input_shape_.cpu_data(),
|
|
|
col_buffer_shape_.data(), kernel_shape_.cpu_data(),
|
|
|
- pad_.cpu_data(), stride_.cpu_data(), data);
|
|
|
+ pad_.cpu_data(), stride_.cpu_data(), dilation_.cpu_data(), data);
|
|
|
}
|
|
|
}
|
|
|
#ifndef CPU_ONLY
|
|
|
@@ -126,12 +130,13 @@ class BaseConvolutionLayer : public Layer<Dtype> { |
|
|
conv_input_shape_.cpu_data()[1], conv_input_shape_.cpu_data()[2],
|
|
|
kernel_shape_.cpu_data()[0], kernel_shape_.cpu_data()[1],
|
|
|
pad_.cpu_data()[0], pad_.cpu_data()[1],
|
|
|
- stride_.cpu_data()[0], stride_.cpu_data()[1], col_buff);
|
|
|
+ stride_.cpu_data()[0], stride_.cpu_data()[1],
|
|
|
+ dilation_.cpu_data()[0], dilation_.cpu_data()[1], col_buff);
|
|
|
} else {
|
|
|
im2col_nd_gpu(data, num_spatial_axes_, num_kernels_im2col_,
|
|
|
conv_input_shape_.gpu_data(), col_buffer_.gpu_shape(),
|
|
|
kernel_shape_.gpu_data(), pad_.gpu_data(),
|
|
|
- stride_.gpu_data(), col_buff);
|
|
|
+ stride_.gpu_data(), dilation_.gpu_data(), col_buff);
|
|
|
}
|
|
|
}
|
|
|
inline void conv_col2im_gpu(const Dtype* col_buff, Dtype* data) {
|
|
|
@@ -140,12 +145,13 @@ class BaseConvolutionLayer : public Layer<Dtype> { |
|
|
conv_input_shape_.cpu_data()[1], conv_input_shape_.cpu_data()[2],
|
|
|
kernel_shape_.cpu_data()[0], kernel_shape_.cpu_data()[1],
|
|
|
pad_.cpu_data()[0], pad_.cpu_data()[1],
|
|
|
- stride_.cpu_data()[0], stride_.cpu_data()[1], data);
|
|
|
+ stride_.cpu_data()[0], stride_.cpu_data()[1],
|
|
|
+ dilation_.cpu_data()[0], dilation_.cpu_data()[1], data);
|
|
|
} else {
|
|
|
col2im_nd_gpu(col_buff, num_spatial_axes_, num_kernels_col2im_,
|
|
|
conv_input_shape_.gpu_data(), col_buffer_.gpu_shape(),
|
|
|
kernel_shape_.gpu_data(), pad_.gpu_data(), stride_.gpu_data(),
|
|
|
- data);
|
|
|
+ dilation_.gpu_data(), data);
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
|
|