我试图理解用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();
来自Caffe文档:
因为我们经常对的值和梯度感兴趣 在Blob中,Blob存储两个内存块,即数据和diff。的 前者是我们传递的普通数据,后者是 网络计算出的梯度。
此外,因为实际值可以存储在CPU上和 GPU,有两种不同的访问方式:const方式, 不会改变值,而可变的方式会改变 值:
const Dtype* cpu_data() const; Dtype* mutable_cpu_data();
因此,根据上面的描述,以上最新代码块中定义的bottom_data[0].cpu_data()
是否只是存储在CPU寄存器中的数组,该数组包含输入数据和有关错误的偏导数?如果是这样,我如何在Keras中复制此类代码?在Keras(图层已被评估或只是一个空的形状)中甚至有意义吗?
谢谢!
答案 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将在后台执行所有必要的操作。