我需要伪逆和转置函数来实现caffe中的Layer。所以我使用Armadillo库来做到这一点。但是如何将Caffe Blobs(2-D)转换为犰狳Mat,反之亦然?
答案 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)时间内转换数据类型更好)。