Caffe 中的犰狳用于伪逆和转置
Armadillo in Caffe for pseudo-inverse and transpose
我需要伪逆和转置函数来实现caffe 中的层。所以我正在使用 Armadillo 库来做到这一点。但是如何将 Caffe Blob(2-D) 转换为犰狳垫,反之亦然?
Caffe blob 是一个 4 维矩阵,我相信犰狳的 pinv(A)
和 .t()
或 trans(A)
应该与 [=14= 类型的二维矩阵一起使用].
您可以获得二维犰狳矩阵向量的向量来表示 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 推导和方程计算 4d 矩阵的伪逆和转置并使用 ccode(expr)
函数将其移植到您的程序中。
希望对您有所帮助!
尽管如此,我还没有找到在犰狳和咖啡斑点之间进行转换的方法。
但我注意到 caffe 使用 MKL 库进行 CPU 计算,它具有两个必需的函数,即伪逆和转置。
万一 caffe 没有配置为使用 MKL,我可以很容易地实现一个转置函数(这比使用犰狳完成它然后在 O(mn) 时间内转换数据类型要好)。
我需要伪逆和转置函数来实现caffe 中的层。所以我正在使用 Armadillo 库来做到这一点。但是如何将 Caffe Blob(2-D) 转换为犰狳垫,反之亦然?
Caffe blob 是一个 4 维矩阵,我相信犰狳的 pinv(A)
和 .t()
或 trans(A)
应该与 [=14= 类型的二维矩阵一起使用].
您可以获得二维犰狳矩阵向量的向量来表示 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 推导和方程计算 4d 矩阵的伪逆和转置并使用 ccode(expr)
函数将其移植到您的程序中。
希望对您有所帮助!
尽管如此,我还没有找到在犰狳和咖啡斑点之间进行转换的方法。 但我注意到 caffe 使用 MKL 库进行 CPU 计算,它具有两个必需的函数,即伪逆和转置。 万一 caffe 没有配置为使用 MKL,我可以很容易地实现一个转置函数(这比使用犰狳完成它然后在 O(mn) 时间内转换数据类型要好)。