Caffe中Tiling图层的目的是什么?

时间:2018-04-20 08:35:08

标签: machine-learning neural-network computer-vision deep-learning caffe

Caffe中Tiling图层的用途是什么?它似乎是一种重塑输入的形式,但是我想知道它究竟是如何工作的以及它可以应用于何处?

这是源代码:

template <typename Dtype>
void TilingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom,
    const vector<Blob<Dtype>*>& top) {
  TilingParameter tiling_param = this->layer_param_.tiling_param();
  tile_dim_ = tiling_param.tile_dim();
  tile_dim_sq_ = tile_dim_ * tile_dim_;
  CHECK(tile_dim_) << "tile_dim must be specified.";
  CHECK_GT(tile_dim_, 0) << "tile_dim must be positive.";
}


template <typename Dtype> void TilingLayer<Dtype>::Reshape(const 
vector<Blob<Dtype>*>& bottom,
    const vector<Blob<Dtype>*>& top) {   
CHECK_EQ(top.size(), 1);   
input_channels_ = bottom[0]->channels();   
input_height_ = bottom[0]->height();   
input_width_ = bottom[0]->width();   
output_channels_ = bottom[0]->channels() / tile_dim_sq_;   
output_width_ = input_width_ * tile_dim_;
output_height_ = input_height_ * tile_dim_;   
count_per_output_map_ = output_width_ * output_height_;   
count_per_input_map_ = input_width_ * input_height_; 
CHECK_EQ(0, input_channels_ % tile_dim_sq_)
      << "The number of input channels for tiling layer must be multiples "
      << "of the tile_dim.";   top[0]->Reshape(bottom[0]->num(), 
input_channels_ / tile_dim_sq_,
  input_height_ * tile_dim_, input_width_ * tile_dim_); }

2 个答案:

答案 0 :(得分:2)

平铺层与平铺层不同,平铺层就像重塑,而平铺层就像repmat。

===============编辑以添加更多细节=========== 对于图块层,如源代码所示,https://github.com/BVLC/caffe/blob/master/src/caffe/layers/tile_layer.cpp

Dtype* top_data = top[0]->mutable_cpu_data();
  for (int i = 0; i < outer_dim_; ++i) {
    for (int t = 0; t < tiles_; ++t) {
      caffe_copy(inner_dim_, bottom_data, top_data);
      top_data += inner_dim_;
    }
    bottom_data += inner_dim_;
  }

顶部数据只是输入数据的tile_倍,当N C H W且tile_dim = 8时,您将得到形状为N C *(H * 8 )*(宽* 8) 但是对于平铺层,它会使该层变平,例如,您有N C H W blob,并且tiling_dim = 8,则在平铺层之后,计数没有变化,但是您得到了形状为N (C / 64)*(H * 8)*(W * 8)的Blob。

答案 1 :(得分:0)

caffe中的

"Tile"层实现了与numpy的tile或Matlab的repmat函数类似的操作:它沿指定维度复制数组的内容。

例如,假设您有一个2D“注意”(或“显着性”)地图,并且您想根据这些权重对特征进行权衡:对“salinet”区域赋予更多权重,而对非“显着”区域赋予更少权重。实现这一目标的一种方法是通过2D显着图将3D特征图乘以(逐个元素)。为此,您需要"Tile"沿渠道维度(从2D到3D)的显着性地图,然后应用"Eltwise"图层。