0

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

4

2 回答 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 回答