Keras是否等同于Caffe的'cpu_data()'方法?

时间:2019-01-25 20:21:38

标签: python c++ keras caffe

示例

我试图理解用C ++版本的Caffe编写的特定代码,以将其移植到Python版本的Keras中。

很明显,Caffe中的图层可以定义为以下示例:

template <typename Dtype>
void ROIPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top) {

其中bottom是接收输入的一维数组,top是产生输出的一维数组。

然后不久,已经使用bottom向量设置了很少的参数:

template <typename Dtype>
void ROIPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top) {
  ROIPoolingParameter roi_pool_param = this->layer_param_.roi_pooling_param();
  CHECK_GT(roi_pool_param.pooled_h(), 0)
      << "pooled_h must be > 0";
  CHECK_GT(roi_pool_param.pooled_w(), 0)
      << "pooled_w must be > 0";
  pooled_height_ = roi_pool_param.pooled_h();
  pooled_width_ = roi_pool_param.pooled_w();
  spatial_scale_ = roi_pool_param.spatial_scale();
  LOG(INFO) << "Spatial scale: " << spatial_scale_;
}

template <typename Dtype>
void ROIPoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top) {
  channels_ = bottom[0]->channels();
  height_ = bottom[0]->height();
  width_ = bottom[0]->width();
  top[0]->Reshape(bottom[1]->num(), channels_, pooled_height_,
      pooled_width_);
  max_idx_.Reshape(bottom[1]->num(), channels_, pooled_height_,
      pooled_width_);
}

如果我们进一步扩展代码,它们将使用cpu_data方法:

template <typename Dtype>
void ROIPoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,
      const vector<Blob<Dtype>*>& top) {
  const Dtype* bottom_data = bottom[0]->cpu_data();
  const Dtype* bottom_rois = bottom[1]->cpu_data();

reference to full code


问题

来自Caffe文档:

  

因为我们经常对的值和梯度感兴趣   在Blob中,Blob存储两个内存块,即数据和diff。的   前者是我们传递的普通数据,后者是   网络计算出的梯度。

     

此外,因为实际值可以存储在CPU上和   GPU,有两种不同的访问方式:const方式,   不会改变值,而可变的方式会改变   值:

     

const Dtype* cpu_data() const; Dtype* mutable_cpu_data();

因此,根据上面的描述,以上最新代码块中定义的bottom_data[0].cpu_data()是否只是存储在CPU寄存器中的数组,该数组包含输入数据和有关错误的偏导数?如果是这样,我如何在Keras中复制此类代码?在Keras(图层已被评估或只是一个空的形状)中甚至有意义吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

bottom_data[0].cpu_data()方法,它将为您返回指向第一个输入Blob内存的常量指针。如有必要,将首先从GPU内存复制数据。

您无需在Keras中处理如此低级的概念。

Keras example中查看以下代码:

def call(self, x):
    return K.dot(x, self.kernel)

此处返回输入张量与图层内核之间的点积结果。

与Caffe不同,在Keras中,您(通常)在张量而非内存阵列上定义操作。运行会话时,张量将在执行时填充实际数据。 Keras后端将负责执行K.dot操作(还返回张量)所需的所有内存操作。

此外,您可以选择将用于放置张量的设备:FAQ。同样,Keras将在后台执行所有必要的操作。