Keras 相当于 Caffe 的 'cpu_data()' 方法?

Keras equivalent of Caffe's 'cpu_data()' method?

例子

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

很明显,Caffe中的layer可以定义成下面的例子:

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 文档:

As we are often interested in the values as well as the gradients of the blob, a Blob stores two chunks of memories, data and diff. The former is the normal data that we pass along, and the latter is the gradient computed by the network.

Further, as the actual values could be stored either on the CPU and on the GPU, there are two different ways to access them: the const way, which does not change the values, and the mutable way, which changes the values:

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

那么根据上面的描述,上面最近的代码块中定义的 bottom_data[0].cpu_data() 是否只是一个存储在 CPU 寄存器中的数组,其中包含输入数据和关于误差的偏导数?如果是这样,我怎么能在 Keras 中复制这样的代码?它在 Keras 中是否更重要(图层已经被评估或只是一个空的形状)?

谢谢!

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

你不需要在Keras中操作这么低级的概念。

Keras example看这段代码:

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

在这里你 return 输入张量和层的内核之间的点积结果。

与 Caffe 不同,在 Keras 中,您(主要)在 张量 上定义操作,而不是在内存数组上。当 运行 一个会话时,张量将填充有关执行时间的实际数据。 Keras 后端将处理执行 K.dot 操作(这也是 return 一个张量)所需的所有内存操作。

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