кофе на заказ евклидов - PullRequest
0 голосов
/ 03 июля 2018

Мне нужно сделать довольно простую вещь, используя платформу caffe. Я хочу создать новый пользовательский евклидов слой C ++. Этот слой должен установить все значения нижнего [1] BLOB (данные истинности земли) на соответствующее значение bottom [0] BLOB, когда это соответствующее значение ниже определенного значения. Потери L2 будут затем рассчитываться между этим измененным дном [1] и дном [0]. Функция backward_cpu () также должна быть изменена.

Это можно легко сделать в Matlab / Python, найдя индексы bottom [0] ниже этого порогового значения. Но как эффективно кодировать это в c ++ с использованием BLOB-структур среды caffe, мне не по силам, тем более что мне также потребуется реализация на GPU. Я мог бы последовательно перебирать все элементы BLOB, но это было бы неэффективно. Могу ли я привести данные BLOB в вектор <>, который более эффективно обрабатывается в c ++?

Например, в отношении кода cpu_forward:

template <typename Dtype>
void EuclideanLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>&   bottom,
const vector<Blob<Dtype>*>& top) {
int count = bottom[0]->count();
threshold = 60;
caffe_sub(
  count,
  bottom[0]->cpu_data(),
  bottom[1]->cpu_data(),
  diff_.mutable_cpu_data());
float* data = blob->mutable_cpu_data();
for (int i =0; i < count; i++) {
  if data[1][i] < threshold {
    data[1][i] = data[0][i];
  }
}
Dtype dot = caffe_cpu_dot(count, diff_.cpu_data(), diff_.cpu_data());
Dtype loss = dot / bottom[0]->num() / Dtype(2);
top[0]->mutable_cpu_data()[0] = loss;
}

К сожалению, я не совсем понимаю, как следующие строки вычисляют евклидову стоимость S = ∑i = (yi − h (xi)) ^ 2, чтобы изменить код:

Dtype dot = caffe_cpu_dot(count, diff_.cpu_data(), diff_.cpu_data());
Dtype loss = dot / bottom[0]->num() / Dtype(2);
top[0]->mutable_cpu_data()[0] = loss;

Я бы хотел, чтобы точечное произведение теперь вычислялось между измененным дном [1] и дном [0]. Есть предложения?

...