如何在caffe中的矩阵之间进行点积?
How to do dot product between matrices in caffe?
在内积层,我需要乘(top_diff * bottom_data) .* (2*weight)
。首先我们计算 (result = top_diff * bottom_data
) 作为 caffe_cpu_gemm
中的矩阵乘法,然后在 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
),然后在 dot product
中执行 weight
。我该怎么办?!
非常感谢!!!!如有任何建议,我们将不胜感激!
如果你只是想在两个矩阵之间进行点积,你可以使用下面的函数在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' 层,它已经这样做了。
在内积层,我需要乘(top_diff * bottom_data) .* (2*weight)
。首先我们计算 (result = top_diff * bottom_data
) 作为 caffe_cpu_gemm
中的矩阵乘法,然后在 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
),然后在 dot product
中执行 weight
。我该怎么办?!
非常感谢!!!!如有任何建议,我们将不胜感激!
如果你只是想在两个矩阵之间进行点积,你可以使用下面的函数在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' 层,它已经这样做了。