1 #ifndef CAFFE_BASE_CONVOLUTION_LAYER_HPP_
2 #define CAFFE_BASE_CONVOLUTION_LAYER_HPP_
6 #include "caffe/blob.hpp"
7 #include "caffe/layer.hpp"
8 #include "caffe/proto/caffe.pb.h"
9 #include "caffe/util/im2col.hpp"
17 template <
typename Dtype>
35 void forward_cpu_gemm(
const Dtype* input,
const Dtype* weights,
36 Dtype* output,
bool skip_im2col =
false);
37 void forward_cpu_bias(Dtype* output,
const Dtype* bias);
38 void backward_cpu_gemm(
const Dtype* input,
const Dtype* weights,
40 void weight_cpu_gemm(
const Dtype* input,
const Dtype* output, Dtype*
42 void backward_cpu_bias(Dtype* bias,
const Dtype* input);
45 void forward_gpu_gemm(
const Dtype* col_input,
const Dtype* weights,
46 Dtype* output,
bool skip_im2col =
false);
47 void forward_gpu_bias(Dtype* output,
const Dtype* bias);
48 void backward_gpu_gemm(
const Dtype* input,
const Dtype* weights,
50 void weight_gpu_gemm(
const Dtype* col_input,
const Dtype* output, Dtype*
52 void backward_gpu_bias(Dtype* bias,
const Dtype* input);
57 return (*bottom_shape_)[channel_axis_ + i];
61 virtual bool reverse_dimensions() = 0;
63 virtual void compute_output_shape() = 0;
79 const vector<int>* bottom_shape_;
81 int num_spatial_axes_;
94 bool force_nd_im2col_;
98 inline void conv_im2col_cpu(
const Dtype* data, Dtype* col_buff) {
99 if (!force_nd_im2col_ && num_spatial_axes_ == 2) {
100 im2col_cpu(data, conv_in_channels_,
103 pad_.cpu_data()[0],
pad_.cpu_data()[1],
112 inline void conv_col2im_cpu(
const Dtype* col_buff, Dtype* data) {
113 if (!force_nd_im2col_ && num_spatial_axes_ == 2) {
114 col2im_cpu(col_buff, conv_in_channels_,
117 pad_.cpu_data()[0],
pad_.cpu_data()[1],
127 inline void conv_im2col_gpu(
const Dtype* data, Dtype* col_buff) {
128 if (!force_nd_im2col_ && num_spatial_axes_ == 2) {
129 im2col_gpu(data, conv_in_channels_,
132 pad_.cpu_data()[0],
pad_.cpu_data()[1],
136 im2col_nd_gpu(data, num_spatial_axes_, num_kernels_im2col_,
142 inline void conv_col2im_gpu(
const Dtype* col_buff, Dtype* data) {
143 if (!force_nd_im2col_ && num_spatial_axes_ == 2) {
144 col2im_gpu(col_buff, conv_in_channels_,
147 pad_.cpu_data()[0],
pad_.cpu_data()[1],
151 col2im_nd_gpu(col_buff, num_spatial_axes_, num_kernels_col2im_,
159 int num_kernels_im2col_;
160 int num_kernels_col2im_;
161 int conv_out_channels_;
162 int conv_in_channels_;
163 int conv_out_spatial_dim_;
168 Blob<Dtype> col_buffer_;
169 Blob<Dtype> bias_multiplier_;
174 #endif // CAFFE_BASE_CONVOLUTION_LAYER_HPP_