2017-01-16 11 views
0

내 제품 층에 (top_diff * bottom_data) .* (2*weight)을 곱해야합니다. 먼저 caffe_cpu_gemm에서 행렬 곱셈 (result = top_diff * bottom_data)을 계산 한 다음 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)을 수행하고 그 후 weightdot product을한다고 생각합니다. 어떻게해야하지?!

많은 감사 !!!! 모든 조언을 부탁드립니다!

답변

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'레이어를 사용할 수도 있습니다.