Мне нужна псевдообратная и транспонированная функция для реализации Layer в caffe. Поэтому я использую библиотеку Armadillo для этого. Но как я могу конвертировать Caffe Blobs (2-D) в броненосец Mat и наоборот?
Капля 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)
функция.
Надеюсь это поможет!
Хотя я не нашел способа преобразования между каплями броненосца и кофе.
Но я заметил, что caffe использует библиотеку MKL для вычислений ЦП, которая имеет обе необходимые функции: псевдообратную и транспонированную.
В случае, если caffe не настроен на использование MKL, я могу легко реализовать функцию для транспонирования (что было бы лучше, чем сделать это с помощью броненосца, а затем преобразовать типы данных за O (mn) времени).