Я хочу создать функцию, которая вычисляет выход нейронной сети. Элементы моего NN
является входным вектором 19D и выходным вектором 19D. Я выбираю один скрытый слой с 50 нейронами. Мой код следующий, но я не совсем уверен, работает ли он правильно.
double *BuildPlanner::neural_tactics(){norm(); //normalize input vector
ReadFromFile(); // load weights W1 W2 b1
double hiddenLayer [50][1];for(int h=0; h<50; h++){
hiddenLayer[h][0] =0;
for(int f = 0; f < 19; f++){
hiddenLayer[h][0] = hiddenLayer[h][0] + W1[h][f]*input1[f][0];
}
}
double HiddenLayer[50][1];
for(int h=0; h<50; h++){
HiddenLayer[h][0] = tanh(hiddenLayer[h][0] + b1[h][0]);
}
double outputLayer[50][1];
for(int h=0; h<19; h++){
for(int k=0; k<50; k++){
outputLayer[h][0] = outputLayer[h][0] + W2[h][k]*HiddenLayer[k][0];
}
}
double Output[19];
for(int h=0; h<19; h++){
Output[h] = tanh(outputLayer[h][0]);
}
return Output;
}
На самом деле я не совсем уверен насчет умножения матриц. W1 * вход + b1, где размер
из матриц 50×19 * 19×1 + 50×1 и W2 * outHiddenLayer 19×50 * 50×1!
Ваше умножение матриц выглядит хорошо для меня, но есть и другие проблемы — `outputLayer равен 50×1, но а) вы перебираете только первые 19 элементов, и б) у вас есть это на RHS вашего уравнения
outputLayer[h][0] = outputLayer[h][0] + W2[h][k]...
до того, как этот элемент был когда-либо определен. Это может быть причиной всех ваших проблем. Кроме того, хотя я предполагаю, что вы делаете outputLayer
2-мерный, чтобы они выглядели как матрица, он совершенно бесплатный и замедляет работу, когда второе измерение имеет размер 1 — просто объявите его, а остальные как
double outputLayer[50];
так как это вектор, и они всегда одномерны, это сделает ваш код более понятным.
Других решений пока нет …