Как использовать обученную нейронную сеть как функцию, используя кодер MATLAB? - PullRequest
0 голосов
/ 14 ноября 2018

Я обучил простую нейронную сеть, которая просто умножает 4 числа и дает 1 число в качестве вывода.

  ( output(x0) = in1(x0)*in2(x0)*in3(x0) *in4(x0)). 

или описание:
description

Моя нейронная сеть имеет 4 входа и 1 выход, [10 10] - скрытый слой.Я использовал genFunction для генерации файла .m из сети. Затем я использовал кодер MATLAB для генерации функции C ++.Я генерирую код со следующими типами ввода: типы ввода:
input types

Моя проблема в том, что когда я тестирую код C ++, он дает только 2 первых выборки для вывода.

Я храню свои записи в std :: vector, размер которого равен 400 (каждый входной размер равен 100)

До сих пор я сделал следующее (хотя желаемого вывода нет):

 std::vector<double> Multiplier(std::vector<double>& input)
 {
   double* X_data = new double[input.size()];
   X_data = vec2ar(input);
   int X_size[2];
   X_size[0] = 4;
   X_size[1] = 100;
   double* Y_data = new double[input.size()];
   int Y_size[100];

В то время как оригинал был:

void multiplier(const double X_data[], const int X_size[2], double Y_data[], int
Y_size[2])
{
 double Xp1_data[800];
 int Xp1_size[2];
 int j;
 double a1_data[2000];
 int coffset;
 int a1_size[2];
 int boffset;
 double tmp_data[2000];
 int k;
 double b_a1_data[2000];

И для получения результата:

std::vector<double> output;
output = ar2vec(Y_data);
return output;

Все, что я хочу, это то, что у нас есть 4 вектора, и дайте им этоФункция просто умножает соответствующие выборки, как показано в «описании» (в моем случае у нас есть 4 вектора размером 100, и мы ожидаем выход с размером 100).

И для функций ar2vec и vec2ar:

std::vector<double> ar2vec(double arr[])
{
std::vector<double> vec;
copy(&arr[0], &arr[100], std::back_inserter(vec));
return vec;
}

double* vec2ar(std::vector<double> vec)
{
double * arr = new double[vec.size()];
copy(vec.begin(), vec.end(), arr);
return arr;
} 

Как исправить мою проблему?

1 Ответ

0 голосов
/ 15 ноября 2018

По умолчанию MATLAB Coder генерирует код, который хранит матрицы и массивы ND в главном порядке столбцов. Типичная раскладка в C и C ++ - это порядок следования строк. Чтобы обеспечить правильное поведение, данные должны быть преобразованы из основной строки в главную столбец перед вызовом сгенерированного кода, а затем обратно в главную строку, чтобы использовать выходные данные.

Начиная с MATLAB R2018a, MATLAB Coder предоставляет возможность генерировать основной код строки. Включение этого параметра избавит вас от необходимости преобразовывать большинство данных, если ваш код уже хранит данные в главном порядке строк. примечания к выпуску описывают это, а в документации есть раздел, описывающий эти опции с MATLAB Coder.

...