내 제품 층에 (top_diff * bottom_data) .* (2*weight)
을 곱해야합니다. 먼저 caffe_cpu_gemm
에서 행렬 곱셈 (result = top_diff * bottom_data
)을 계산 한 다음 weight
과 result
사이에서 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
)을 수행하고 그 후 weight
와 dot product
을한다고 생각합니다. 어떻게해야하지?!
많은 감사 !!!! 모든 조언을 부탁드립니다!