Как реализовать мини-пакетный градиентный спуск в C, начиная со стохастического? - PullRequest
0 голосов
/ 31 мая 2019

Я сделал стохастический NN, но вариация слишком велика, поэтому я хочу пойти на партию, но, насколько я пытался, я не могу получить приемлемые результаты, я не могу понять, когда у меня естьпроделал вперед, как я могу объединить данные для обновления весов.

Существует входной слой, один скрытый и один выход.

Пока я попытался добавить все дельты вместе и усреднитьих, но с плохими результатами.Это моя стохастическая версия на одну эпоху.

for( np = 1 ; np <= numPattern ; np++) {    /* repeat for all the training patterns */
            p = ranpat[np];
            for( j = 1 ; j <= numHid ; j++ ) {    /* compute hidden unit activations */
                SumH[p][j] = WeightIH[0][j] ;
                for( i = 1 ; i <= numIn ; i++ ) {
                    SumH[p][j] += allData[p].in[i] * WeightIH[i][j] ;
                }
                Hidden[p][j] = 1.0/(1.0 + exp(-SumH[p][j])) ;
            }
            for( k = 1 ; k <= numOut ; k++ ) {    /* compute output unit activations and errors */
                SumO[p][k] = WeightHO[0][k] ;
                for( j = 1 ; j <= numHid ; j++ ) {
                    SumO[p][k] += Hidden[p][j] * WeightHO[j][k] ;
                }
                Output[p][k] = 1.0/(1.0 + exp(-SumO[p][k])) ;   /* Sigmoidal Outputs*/
                Error -= ( allData[p].out[k] * log( Output[p][k] ) + ( 1.0 - allData[p].out[k] ) * log( 1.0 - Output[p][k] ) ) ;    /*Cross-Entropy Error*/
                DeltaO[k] = allData[p].out[k] - Output[p][k];    /* Sigmoidal Outputs, Cross-Entropy Error */
            }


            for( j = 1 ; j <= numHid ; j++ ) {    /* 'back-propagate' errors to hidden layer */
                SumDOW[j] = 0.0 ;
                for( k = 1 ; k <= numOut ; k++ ) {
                    SumDOW[j] += WeightHO[j][k] * DeltaO[k] ;
                }
                DeltaH[j] = SumDOW[j] * Hidden[p][j] * (1.0 - Hidden[p][j]) ;
            }
            for( j = 1 ; j <= numHid ; j++ ) {     /* update weights WeightIH */
                DeltaWeightIH[0][j] = eta * DeltaH[j];
                WeightIH[0][j] += DeltaWeightIH[0][j] ;
                for( i = 1 ; i <= numIn ; i++ ) {
                    DeltaWeightIH[i][j] = eta * allData[p].in[i] * DeltaH[j];
                    WeightIH[i][j] += DeltaWeightIH[i][j] ;
                }
            }
            for( k = 1 ; k <= numOut ; k ++ ) {    /* update weights WeightHO */
                DeltaWeightHO[0][k] = eta * DeltaO[k];
                WeightHO[0][k] += DeltaWeightHO[0][k] ;
                for( j = 1 ; j <= numHid ; j++ ) {
                    DeltaWeightHO[j][k] = eta * Hidden[p][j] * DeltaO[k];
                    WeightHO[j][k] += DeltaWeightHO[j][k] ;
                }
            }
        }
...