我需要对caffe中矩阵的所有元素求和,
但正如我注意到的,cblas 函数 ( 'math_functions.hpp'
& 'math_functions.cpp'
) 的 caffe 包装器使用cblas_sasum
函数caffe_cpu_asum
来计算向量中元素的绝对值之和。
由于我是 cblas 的新手,我试图找到一个合适的函数来摆脱那里的absolute,但似乎 cblas 中没有具有该属性的函数。
有什么建议吗?
我需要对caffe中矩阵的所有元素求和,
但正如我注意到的,cblas 函数 ( 'math_functions.hpp'
& 'math_functions.cpp'
) 的 caffe 包装器使用cblas_sasum
函数caffe_cpu_asum
来计算向量中元素的绝对值之和。
由于我是 cblas 的新手,我试图找到一个合适的函数来摆脱那里的absolute,但似乎 cblas 中没有具有该属性的函数。
有什么建议吗?
有一种使用 cblas 函数的方法,虽然它有点尴尬。
你需要做的是定义一个“全1”向量,然后在这个向量和你的矩阵之间做一个点积,结果就是总和。
让我们myBlob
成为一个 caffe Blob,您要对其元素求和:
vector<Dtype> mult_data( myBlob.count(), Dtype(1) );
Dtype sum = caffe_cpu_dot( myBlob.count(), &mult_data[0], myBlob.cpu_data() );
这个技巧用于layer的实现"Reduction"
。
为了使这个答案既符合 GPU 标准,需要分配一个Blob
formult_data
而不是 a std::vector
(因为你需要它pgu_data()
):
vector<int> sum_mult_shape(1, diff_.count());
Blob<Dtype> sum_multiplier_(sum_mult_shape);
const Dtype* mult_data = sum_multiplier_.cpu_data();
Dtype sum = caffe_cpu_dot( myBlob.count(), &mult_data[0], myBlob.cpu_data() );
对于 GPU,(在'.cu'
源文件中):
vector<int> sum_mult_shape(1, diff_.count());
Blob<Dtype> sum_multiplier_(sum_mult_shape);
const Dtype* mult_data = sum_multiplier_.gpu_data();
Dtype sum;
caffe_gpu_dot( myBlob.count(), &mult_data[0], myBlob.gpu_data(), &sum );
数组所有元素的求和非常简单,可以通过单个 for 循环来实现。您只需要使用适当的编译选项通过 SIMD 指令对其进行矢量化。
对于 caffe 中的 Blob,您可以使用.cpu_data()
获取数组的原始指针,然后使用 for 循环。