首页 > 代码库 > caffe源码分析--poolinger_layer.cpp

caffe源码分析--poolinger_layer.cpp


caffe源码分析--poolinger_layer.cpp


对于采样层,cafffe里实现了最大采样和平均采样的算法。

最大采样,给定一个扫描窗口,找最大值,

平均采样,扫描窗口内所有值的平均值。


其实对于caffe的实现一直有个疑问,

就是每一层貌似没有绑定一个激活函数?

看ufldl教程,感觉激活函数是必要存在的。

这怎么解释呢?


看到源码中,看到一些激活函数,比如sigmoid_layer.cpp和sigmoid_layer.cu。

也就是说,激活函数作为layer层面来实现了。当然,还有tanh_layer和relu_layer。


那,这个意思是说,让我们建立网络的时候更加随意,可自由搭配激活函数吗?

但是,我看了caffe自带的那些例子,貌似很少见到用了激活函数layer的,顶多看到用了relu_layer,其他的没见过。

这意思是说,激活函数不重要吗?真是费解啊。


// Copyright 2013 Yangqing Jia

#include <algorithm>
#include <cfloat>
#include <vector>

#include "caffe/layer.hpp"
#include "caffe/vision_layers.hpp"
#include "caffe/util/math_functions.hpp"

using std::max;
using std::min;

namespace caffe {

template <typename Dtype>
void PoolingLayer<Dtype>::SetUp(const vector<Blob<Dtype>*>& bottom,
      vector<Blob<Dtype>*>* top) {
  CHECK_EQ(bottom.size(), 1) << "PoolingLayer takes a single blob as input.";
  CHECK_EQ(top->size(), 1) << "PoolingLayer takes a single blob as output.";
  KSIZE_ = this->layer_param_.kernelsize();//核大小
  STRIDE_ = this->layer_param_.stride();//步长
  CHANNELS_ = bottom[0]->channels();//通道
  HEIGHT_ = bottom[0]->height();//高
  WIDTH_ = bottom[0]->width();//宽
  POOLED_HEIGHT_ = static_cast<int>(
      ceil(static_cast<float>(HEIGHT_ - KSIZE_) / STRIDE_)) + 1;//计算采样之后的高
  POOLED_WIDTH_ = static_cast<int>(
      ceil(static_cast<float>(WIDTH_ - KSIZE_) / STRIDE_)) + 1;//计算采样之后的宽
  (*top)[0]->Reshape(bottom[0]->num(), CHANNELS_, POOLED_HEIGHT_,//采样之后大小
      POOLED_WIDTH_);
  // If stochastic pooling, we will initialize the random index part.
  if (this->layer_param_.pool() == LayerParameter_PoolMethod_STOCHASTIC) {
    rand_idx_.Reshape(bottom[0]->num(), CHANNELS_, POOLED_HEIGHT_,
      POOLED_WIDTH_);
  }
}

// TODO(Yangqing): Is there a faster way to do pooling in the channel-first
// case?
template <typename Dtype>
void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
      vector<Blob<Dtype>*>* top) {
  const Dtype* bottom_data = http://www.mamicode.com/bottom[0]->cpu_data();//采样层输入>
本文作者:linger
本文链接:http://blog.csdn.net/lingerlanlan/article/details/38294169