Search code examples
c++neural-networkbackpropagation

I'm not sure how to refer to the weights in this Neural Network Train method


I'm writing my own implementation of a Neural Network class in C++. I'm not sure how to refer to the weights this statement:

in = in + (inputs [l] * calcWeights [l]) ;

The reason is because there could be more weights than inputs. Here is my code:

void Train (int numInputs, int numOutputs, double inputs [], double outputs []) {
    // Set the Random Seed:
    srand (time (0)) ;

    // Weights (n input(s) * n output(s) = n weight branch(es)):
    double calcWeights [numInputs * numOutputs] ;

    // Errors (n input(s) * n output(s) = n error branch(es)):
    double errors [numInputs * numOutputs] ;

    // Set the Weights to random:
    for (int j = 0 ; j < numInputs ; j = j + 1) {
        calcWeights [j] = ((-1 * numInputs) + (((double) rand ()) % (1 * numInputs))) ;
    }

    // Train:
    int i = 0 ;
    double in = 0 ;
    double out [numOutputs] ;
    while (i < 14999) {
        // Get the estimated output:
        for (int k = 0 ; k < numOutputs ; k = k + 1) {
            for (int l = 0 ; l < numInputs ; l = l + 1) {
                in = in + (inputs [l] * calcWeights [l]) ;
            }

            out [k] = in + GetBias () ;
        }

        for (int m = 0 ; m < numOutputs ; m = m + 1) {
            error [m] = outputs [m] - out [m]
        }

        // Increment the iterator:
        i = i + 1 ;
    }
}

Solution

  • From your clarification in comments, I believe modifying your loop a bit will give you what you want.

    for (int k = 0 ; k < numOutputs ; k = k + 1) {
        in = 0; //Reset in to 0 at the beginning of each output loop
    
        for (int l = 0 ; l < numInputs ; l = l + 1) {
            in = in + (inputs [l] * calcWeights [l + k*numInputs]) ;
        }
    
        out [k] = in + GetBias () ;
    }
    

    You should also make sure you initialize all the weights above.

    for (int j = 0 ; j < (numInputs * numOutputs) ; j = j + 1) {
        calcWeights [j] = ((-1 * numInputs) + (((double) rand ()) % (1 * numInputs))) ;
    }
    

    For a couple of style choices I just want to point out that you can replace k = k + 1 with simply ++k. Likewise you can replace in = in + ...; with in += ...;