Соббственно решил запрограммировать НС, написал немножко коду, приступил к тестированию. В качестве задачи выбрал возведение символа в верхний регистр
. Т.е. 8 входов, 3 слоя (взял от балды).
в структуре данных на слой больше чем теоретически (первый слой входной). вот ф-я коррекции:
Подскажите ощибку плз (я думаю она тут).
void NNet::ReverseCirculation(double *nout){
double *delta = (double *)malloc(LayerSize * sizeof(double) * 2);
double *delta2 = delta + LayerSize;
//тут будут храниться дельты (те что из формулы)
for(int q = 0; q < LayerSize; ++q)delta[q] = ns[nLayers * LayerSize + q].out * (1 - ns[nLayers * LayerSize + q].out) * (nout[q] - ns[nLayers * LayerSize + q].out);
//заполняю дельты для последнего (выходного слоя)
//nout - желаемый выход сети
for(int i = nLayers; i > 0; --i){
//с последнего до 1 слоя
for(int j = 0; j < LayerSize; ++j){
//правлю все веса для каждого нейрона в слое
double add_ = ns[i * LayerSize + j].out * EducationCoefficient * delta[j];
for(int m = 0; m < LayerSize; ++m)ns[i * LayerSize + j].weights[m] += add_;
}
for(int w = 0; w < LayerSize; ++w){
//вычисляю delt''ы для следующего слоя
double sum = 0;
for(int a = 0; a < LayerSize; ++a)sum += delta[a] * ns[i * LayerSize + a].weights[w];
// это сумма произвдений дельт и весов
delta2[w] = sum * ns[(i - 1) * LayerSize + w].out * (1 - ns[(i - 1) * LayerSize + w].out);
//сохраняю новые дельты
}
double *tmp;
tmp = delta;
delta = delta2;
delta2 = tmp;
//меняю местами
}
free((delta < delta2) ? delta : delta2);
}