我需要伪逆和转置函数来在 caffe 中实现一个图层。所以我正在使用 Armadillo 库来做到这一点。但是如何将 Caffe Blobs(2-D) 转换为犰狳垫,反之亦然?
问问题
571 次
2 回答
0
Caffe blob 是一个 4 维矩阵,我相信犰狳的pinv(A)
and .t()
ortrans(A)
旨在与 2 维类型的矩阵一起使用mat
。
你可以得到一个二维犰狳矩阵向量的向量来表示一个 4 维 Caffe blob。你可以这样做:
using namespace arma;
using namespace caffe;
vector<vector<mat>> blob2vvmat (Blob m) {
vector<vector<mat>> vvm;
for (int i=0; i<m.shape().at(0); i++) {
vector<mat> vm;
for (int j=0; i<m.shape().at(1); i++) {
mat M (m.shape().at(2), m.shape().at(3));
for (int k=0; i<m.shape().at(2); i++) {
for (int l=0; i<m.shape().at(3); i++) {
M(k,l) = m.data_at(i, j, k, l);
}
}
vm.push_back(M);
}
vvm.push_back(vm);
}
return vvm;
}
我没有测试代码,但理论上应该可以工作,除非你不是在寻找矩阵向量的向量。
如果您知道行、列、高和 4d 大小,则可以使用 MATLAB 或 octave 上的符号库,甚至更好:Mathematica to derived and equation 来计算 4d 矩阵的伪逆和转置并将其移植到您的使用该ccode(expr)
功能的程序。
希望这可以帮助!
于 2015-06-06T22:24:07.333 回答
0
虽然,我还没有找到犰狳和咖啡斑点之间的转换方法。但我注意到 caffe 使用 MKL 库进行 CPU 计算,它具有两个必需的功能,即伪逆和转置。如果 caffe 未配置为使用 MKL,我可以轻松实现转置函数(这比使用犰狳完成它然后在 O(mn) 时间内转换数据类型要好)。
于 2015-06-08T01:53:11.040 回答