summaryrefslogtreecommitdiff
path: root/src/caffe/layers/conv_layer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/caffe/layers/conv_layer.cpp')
-rw-r--r--src/caffe/layers/conv_layer.cpp32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp
index 928ef5ee..5cf26970 100644
--- a/src/caffe/layers/conv_layer.cpp
+++ b/src/caffe/layers/conv_layer.cpp
@@ -10,10 +10,18 @@ namespace caffe {
template <typename Dtype>
void ConvolutionLayer<Dtype>::compute_output_shape() {
- this->height_out_ = (this->height_ + 2 * this->pad_h_ - this->kernel_h_)
- / this->stride_h_ + 1;
- this->width_out_ = (this->width_ + 2 * this->pad_w_ - this->kernel_w_)
- / this->stride_w_ + 1;
+ // input_shape_ + 1 to skip channel axis
+ const int* input_shape_data = this->input_shape_.cpu_data() + 1;
+ const int* kernel_shape_data = this->kernel_shape_.cpu_data();
+ const int* stride_data = this->stride_.cpu_data();
+ const int* pad_data = this->pad_.cpu_data();
+ this->output_shape_.clear();
+ for (int i = 0; i < this->num_spatial_axes_; ++i) {
+ const int input_dim = input_shape_data[i];
+ const int output_dim = (input_dim + 2 * pad_data[i] - kernel_shape_data[i])
+ / stride_data[i] + 1;
+ this->output_shape_.push_back(output_dim);
+ }
}
template <typename Dtype>
@@ -24,11 +32,11 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
const Dtype* bottom_data = bottom[i]->cpu_data();
Dtype* top_data = top[i]->mutable_cpu_data();
for (int n = 0; n < this->num_; ++n) {
- this->forward_cpu_gemm(bottom_data + bottom[i]->offset(n), weight,
- top_data + top[i]->offset(n));
+ this->forward_cpu_gemm(bottom_data + n * this->bottom_dim_, weight,
+ top_data + n * this->top_dim_);
if (this->bias_term_) {
const Dtype* bias = this->blobs_[1]->cpu_data();
- this->forward_cpu_bias(top_data + top[i]->offset(n), bias);
+ this->forward_cpu_bias(top_data + n * this->top_dim_, bias);
}
}
}
@@ -47,20 +55,20 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top,
if (this->bias_term_ && this->param_propagate_down_[1]) {
Dtype* bias_diff = this->blobs_[1]->mutable_cpu_diff();
for (int n = 0; n < this->num_; ++n) {
- this->backward_cpu_bias(bias_diff, top_diff + top[i]->offset(n));
+ this->backward_cpu_bias(bias_diff, top_diff + n * this->top_dim_);
}
}
if (this->param_propagate_down_[0] || propagate_down[i]) {
for (int n = 0; n < this->num_; ++n) {
// gradient w.r.t. weight. Note that we will accumulate diffs.
if (this->param_propagate_down_[0]) {
- this->weight_cpu_gemm(bottom_data + bottom[i]->offset(n),
- top_diff + top[i]->offset(n), weight_diff);
+ this->weight_cpu_gemm(bottom_data + n * this->bottom_dim_,
+ top_diff + n * this->top_dim_, weight_diff);
}
// gradient w.r.t. bottom data, if necessary.
if (propagate_down[i]) {
- this->backward_cpu_gemm(top_diff + top[i]->offset(n), weight,
- bottom_diff + bottom[i]->offset(n));
+ this->backward_cpu_gemm(top_diff + n * this->top_dim_, weight,
+ bottom_diff + n * this->bottom_dim_);
}
}
}