perceptron
Summation of Perceptron not working properly. Getting large summation
So I have a run method which summates the weights of the edges in the artificial neural network with the threshold values of the input nodes. Sort of like this: Now my test perceptron should produce a summation of -3, but I am getting a value of 1176!!! What is going on here? Here is the code that I have written for my run() method, constructor, and my main method. Constructor: public class Perceptron { //We want to create a variable which will represent the number of weighted edges //in the 2-dimensional array. protected int num_weighted_Edges; //Inside this class we want to create a data field which is a //2-D array of WeightedEdges. Since the weightedEdges will be in //double data type, we will create a double type 2-dimensional //array. protected WeightedEdge[][] weightedEdges; protected int[] weights; //We set a double field named eta equal to 0.05. protected double eta = 0.05; //We initialize a constructor which only takes a parameter int n. public Perceptron(int n){ //We want to create a new graph which will have n + 1 vertices //, where we also want vertex 0 to act like the output node //as in a neural network. this.num_weighted_Edges = n; weights = new int[num_weighted_Edges]; //First we need to verify that n is a positive real number if (num_weighted_Edges < 0){ throw new RuntimeException("You cannot have a perceptron of negative value"); } else { //Test code for testing if this code works. System.out.println("A perceptron of " + num_weighted_Edges + " input nodes, and 1 output node was created"); } //Now we create a graph object with "n" number of vertices. weightedEdges = new WeightedEdge[num_weighted_Edges + 1][num_weighted_Edges + 1]; //Create a for loop that will iterate the weightedEdges array. //We want to create the weighted edges from vertex 1 and not vertex 0 //since vertex 0 will be the output node, so we set i = 1. for (int i = 1; i < weightedEdges.length; i++){ for (int j = 0; j < weightedEdges[i].length; j++){ //This will create a weighted edge in between [1][0]...[2][0]...[3][0] //The weighted edge will have a random value between -1 and 1 assigned to it. weightedEdges[i][0] = new WeightedEdge(i, j, 1); } } } This is my run() method: //This method will take the input nodes, do a quick verification check on it and //sum up the weights using the simple threshold function described in class to return //either a 1 or -1. 1 meaning fire, and -1 not firing. public int run(int[] weights){ //So this method will act like the summation function. It will take the int parameters //you put into the parameter field and multiply it times the input nodes in the //weighted edge 2 d array. //Setup a summation counter. int sum = 0; if (weights.length != num_weighted_Edges){ throw new RuntimeException("Array coming in has to equal the number of input nodes"); } else { //We iterate the weights array and use the sum counter to sum up weights. for (int i = 0; i < weights.length; i++){ //Create a nested for loop which will iterate over the input nodes for ( int j = 1; j < weightedEdges.length; j++){ for (int k = 0; k < weightedEdges[j].length; k++){ //This takes the weights and multiplies it times the value in the //input nodes. The sum should equal greater than 0 or less than 0. sum += (int) ((weightedEdges[j][0].getWeight()) * i); //Here the plus equals sign takes the product of (weightedEdges[j][0] * i) and //then adds it to the previous value. } } } } System.out.println(sum); //If the sum is greater than 0, we fire the neuron by returning 1. if (sum > 0){ //System.out.println(1); test code return 1; } //Else we don't fire and return -1. else { //System.out.println(-1); test code return -1; } } This is my main method: //Main method which will stimulate the artificial neuron (perceptron, which is the //simplest type of neuron in an artificial network). public static void main(String[] args){ //Create a test perceptron with a user defined set number of nodes. Perceptron perceptron = new Perceptron(7); //Create a weight object that creates an edge between vertices 1 and 2 //with a weight of 1.5 WeightedEdge weight = new WeightedEdge(1, 2, 1.5); //These methods work fine. weight.getStart(); weight.getEnd(); weight.setWeight(2.0); //Test to see if the run class works. (Previously was giving a null pointer, but //fixed now) int[] test_weight_Array = {-1, -1, -1, -1, -1, 1, 1}; //Tested and works to return output of 1 or -1. Also catches exceptions. perceptron.run(test_weight_Array); //Testing a 2-d array to see if the train method works. int[][] test_train_Array = {{1}, {-1}, {1}, {1}, {1}, {1}, {1}, {1}}; //Works and catches exceptions. perceptron.train(test_train_Array); } }
I think you should change sum += (int) ((weightedEdges[j][0].getWeight()) * i); to sum += (int) ((weightedEdges[j][k].getWeight()) * i);
Related Links
Delta component doesnt show in weight learning rule of sigmoid activation MLP
Summation of Perceptron not working properly. Getting large summation