2017-01-16 86 views
0

在内部产品层,我需要乘以(top_diff * bottom_data) .* (2*weight)。首先我们计算(result = top_diff * bottom_data)作为caffe_cpu_gemm中的矩阵乘法,然后在weightresult之间执行dot product如何在咖啡中的矩阵之间做点积?

更多的解释定义如下:

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); 
} 

我觉得我应该在caffe_cpu_gemm()执行乘法(result = top_diff * bottom_data),之后做dot productweight。我应该怎么做?!

非常感谢!任何意见,将不胜感激!

回答

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'图层,它已经做到了。