Броненосец в Кафе для псевдообратного и транспонированного

Мне нужна псевдообратная и транспонированная функция для реализации Layer в caffe. Поэтому я использую библиотеку Armadillo для этого. Но как я могу конвертировать Caffe Blobs (2-D) в броненосец Mat и наоборот?

0

Решение

Капля Caffe — 4-мерная матрица, я полагаю, броненосец pinv(A) а также .t() или же trans(A) предназначены для использования с 2-мерными матрицами типа mat,

Вы можете получить вектор вектора 2-мерных матриц броненосцев, чтобы представить 4-мерную каплю Caffe. Вы можете сделать это с чем-то вроде:

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 или октаве, или даже лучше: Mathematica для получения и уравнения для вычисления псевдообратной и транспонированной 4d матрицы и переноса ее в программа с использованием ccode(expr) функция.

Надеюсь это поможет!

0

Другие решения

Хотя я не нашел способа преобразования между каплями броненосца и кофе.
Но я заметил, что caffe использует библиотеку MKL для вычислений ЦП, которая имеет обе необходимые функции: псевдообратную и транспонированную.
В случае, если caffe не настроен на использование MKL, я могу легко реализовать функцию для транспонирования (что было бы лучше, чем сделать это с помощью броненосца, а затем преобразовать типы данных за O (mn) времени).

0