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) 时间内转换数据类型要好)。