Как сделать точечный продукт между матрицами в кафе?

Во внутреннем слое продукта мне нужно умножить (top_diff * bottom_data) .* (2*weight), Сначала мы рассчитаем (result = top_diff * bottom_data) как матричное умножение в caffe_cpu_gemm а затем сделать dot product между weight а также result,

Более подробное объяснение определяется следующим образом:

const Dtype* weight = this->blobs_[0]->cpu_data();
     if (this->param_propagate_down_[0]) {
            const Dtype* top_diff = top[0]->cpu_diff();
            const Dtype* bottom_data = bottom[0]->cpu_data();
caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1.,
        top_diff, bottom_data, (Dtype)1., this->blobs_[0]->mutable_cpu_diff());
}

Для большего понимания я проверил math_function.c, Это реализовано следующим образом:

template<>
void caffe_cpu_gemm<float>(const CBLAS_TRANSPOSE TransA,
    const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K,
    const float alpha, const float* A, const float* B, const float beta,
    float* C) {
  int lda = (TransA == CblasNoTrans) ? K : M;
  int ldb = (TransB == CblasNoTrans) ? N : K;
  cblas_sgemm(CblasRowMajor, TransA, TransB, M, N, K, alpha, A, lda, B,
      ldb, beta, C, N);
}

Я думаю, что я должен выполнить умножение (result = top_diff * bottom_data) в caffe_cpu_gemm() и после этого делай dot product с weight, как мне быть?!

Большое спасибо!!!! Любой совет будет принят во внимание!

1 ответ

Решение

Если вы просто хотите выполнить точечное произведение между двумя матрицами, вы можете использовать следующую функцию для умножения матриц на CPU,

void caffe_mul<float>(const int n, const float* a, const float* b, float* y)

Если вы хотите сделать ту же операцию на GPU, используйте этот шаблон

void caffe_gpu_mul<float>(const int N, const float* a, const float* b, float* y)

a и b - это ваши матрицы, а c будет содержать конечный результат. N - общее количество элементов в вашей матрице.

Вы также можете использовать слой Eltwise, который уже делает это.

Другие вопросы по тегам