Keras эквивалентно методу Caffe 'cpu_data ()'? - PullRequest
0 голосов
/ 25 января 2019

Пример

Я пытаюсь понять конкретный код, написанный на 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?Это даже важно в Керасе (где слой уже оценен или просто пустая форма)?

Спасибо!

1 Ответ

0 голосов
/ 26 января 2019

bottom_data[0].cpu_data() - это метод , который вернет вам постоянный указатель на память первого входного двоичного объекта.При необходимости данные сначала будут скопированы из памяти графического процессора.

Вам не нужно оперировать такими низкоуровневыми концепциями в Керасе.

Посмотрите на этот код из примера Keras :

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

Здесь вы возвращаете результат скалярного произведения между входным тензором и ядром слоя.

В отличие от Caffe, в Keras вы (в основном) определяете операции над тензорами , а не над массивами памяти.Тензорные данные будут заполнены фактическими данными о времени выполнения при запуске сеанса.Бэкэнд Keras позаботится обо всех операциях с памятью, необходимых для выполнения операции K.dot (которая также возвращает тензор).

Кроме того, вы можете выбрать, какое устройство будет использоваться для размещения вашего тензора: FAQ .Опять же, Керас будет выполнять все необходимые операции под капотом.

...