Пример
Я пытаюсь понять конкретный код, написанный на 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
vector:
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 хранит два фрагмента.воспоминаний, данных и различий.Первые - это обычные данные, которые мы передаем, а вторые - градиент, вычисляемый сетью.
Кроме того, поскольку фактические значения могут храниться как в ЦП, так и в графическом процессоре, существует два разныхспособы доступа к ним: постоянный путь, который не изменяет значения, и изменяемый способ, который изменяет значения:
const Dtype* cpu_data() const; Dtype* mutable_cpu_data();
Таким образом, согласно описанию выше,bottom_data[0].cpu_data()
определено в последнем кодовом блоке выше просто как массив, сохраненный в регистрах ЦП, содержащий входные данные и частную производную по ошибке?Если так, как я мог бы воспроизвести такой код в Keras?Это даже важно в Керасе (где слой уже оценен или просто пустая форма)?
Спасибо!