Caffe中的Armadillo用于伪逆和转置

时间:2015-06-06 20:07:22

标签: c++ armadillo caffe

我需要伪逆和转置函数来实现caffe中的Layer。所以我使用Armadillo库来做到这一点。但是如何将Caffe Blobs(2-D)转换为犰狳Mat,反之亦然?

2 个答案:

答案 0 :(得分:0)

Caffe blob是一个四维矩阵,我相信犰狳pinv(A).t()trans(A)意味着与{{1}类型的二维矩阵一起使用1}}。

你可以得到一个二维犰狳矩阵向量的向量来表示一个四维的Caffe blob。你可以这样做:

mat

我还没有测试代码,但理论上这应该可行,除非你不是在寻找矩阵向量的向量。

如果你知道你的行,列,高度和4d大小,你可以在MATLAB或八度音程上使用符号库,甚至更好:Mathematica导出和方程来计算4d矩阵和端口的伪逆和转置使用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; } 函数将其添加到您的程序中。

希望这有帮助!

答案 1 :(得分:0)

虽然,我还没有找到犰狳和caffe blob之间的转换方式。 但我注意到caffe使用MKL库进行CPU计算,它具有两个必需的功能,即伪逆和转置。 如果caffe未配置为使用MKL,我可以轻松实现转置功能(这比使用armadillo完成它然后在O(mn)时间内转换数据类型更好)。