BasicBackPropagatingNeuralNetwork.py

Go to the documentation of this file.
00001 import random
00002 
00003 class BasicBackPropagatingNeuralNetwork:
00004     def __init__(self, numInputs,  numOutputs, numLayers, numNodesPerLayer, learnRate=0.25, threshold=1, sigCoef=0.5):
00005         self.weights = []
00006         self.nodes = []
00007         self.lambd = learnRate
00008         self.a = sigCoef
00009 
00010         self.nodes.append([])
00011         for x in range(numInputs):
00012             self.nodes[0].append([0,0,threshold])
00013         for x in range(numLayers):
00014             self.nodes.append([])
00015             for y in range(numNodesPerLayer):
00016                 self.nodes[x+1].append([0,0,threshold])
00017         self.nodes.append([])
00018         for x in range(numOutputs):
00019             self.nodes[-1].append([0,0,threshold])
00020 
00021         for x in range(numLayers+3):
00022             self.weights.append([])
00023         for x in range(numInputs):
00024             self.weights[0].append(1)
00025         for x in range(numLayers+1):
00026             for y in range(len(self.nodes[x])*len(self.nodes[x+1])):
00027                 self.weights[x+1].append(self.rand())
00028         for x in range(numOutputs):
00029             self.weights[-1].append(1)
00030 
00031     def rand(self):
00032         return random.uniform(0,1)
00033 
00034     def sigmoid(self, inpt):
00035         output = 1/(1+(2.71828183**((-self.a)*inpt)))
00036         return output
00037 
00038     def sigMyZ(self, nodeLoc):
00039         d = self.nodes[nodeLoc[0]][nodeLoc[1]][0]
00040         theta = self.nodes[nodeLoc[0]][nodeLoc[1]][2]
00041         z = self.sigmoid(d + theta)
00042         self.nodes[nodeLoc[0]][nodeLoc[1]][0] = z
00043 
00044     def passX(self, nodeLoc):
00045         if nodeLoc[0]>0:
00046             self.sigMyZ(nodeLoc)
00047 
00048         z = self.nodes[nodeLoc[0]][nodeLoc[1]][0]
00049         lenOfNextLayer = len(self.nodes[nodeLoc[0]+1])
00050         for nextNode in range(lenOfNextLayer):
00051             self.nodes[nodeLoc[0]+1][nextNode][0] += (self.weights[nodeLoc[0]+1][(nodeLoc[1]*lenOfNextLayer)+nextNode]*z)
00052 
00053     def runOnce(self, inpt, returns):
00054         output = []
00055 
00056         for x in range(len(self.nodes[0])):
00057             self.nodes[0][x][0] = inpt[x]
00058 
00059         for x in range(len(self.nodes)-1):
00060             for y in range(len(self.nodes[x])):
00061                 self.passX([x,y])
00062 
00063         for x in range(len(self.nodes[-1])):
00064             self.sigMyZ([-1,x])
00065             output.append(self.nodes[-1][x][0])
00066 
00067         if returns == 1:
00068             return output
00069 
00070     def backProp(self, y):
00071 
00072         for x in range(len(self.nodes[-1])):
00073             z = self.nodes[-1][x][0]
00074             self.nodes[-1][x][0] = 0
00075             self.nodes[-1][x][1] = (z*(1-z)*(y[x]-z))
00076             dTheta = self.nodes[-1][x][1]*self.lambd
00077             self.nodes[-1][x][2] += dTheta
00078             count = 0
00079             for weight in range(x,len(self.weights[-2]),len(self.nodes[-1])):
00080                 self.weights[-2][weight] += (dTheta*self.nodes[-2][count][0])
00081                 count += 1
00082 
00083 
00084         for layer in range(2,len(self.nodes)):
00085             lenOfThisLayer = len(self.nodes[(-layer)])
00086             lenOfNextLayer = len(self.nodes[(-layer)+1])
00087             for currentNode in range(lenOfThisLayer):
00088                 z = self.nodes[-layer][currentNode][0]
00089                 self.nodes[-layer][currentNode][0] = 0
00090                 g = 0
00091                 for nextNode in range(lenOfNextLayer):
00092                     g += (self.nodes[(-layer)+1][nextNode][1]*self.weights[-layer][(currentNode*lenOfNextLayer)+nextNode])
00093                 self.nodes[-layer][currentNode][1] = (z*(1-z)*g)
00094                 dTheta = self.nodes[-layer][currentNode][1]*(self.lambd)
00095                 self.nodes[-layer][currentNode][2] += dTheta
00096                 count = 0
00097                 for weight in range(currentNode,len(self.weights[(-layer)-1]),lenOfThisLayer):
00098                     self.weights[(-layer)-1][weight] += (dTheta*self.nodes[(-layer)-1][count][0])
00099                     count += 1
00100 
00101     def getLayers(self):
00102         return self.nodes
00103 
00104     def getWeights(self):
00105         return self.weights
00106 
00107 

© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved; If you reference this document or any part of this document you must use the citation verbatim (including the link) "© Copyright 2008-2009 Vyper Logix Corp., All Right Reserved."

Notice: This source code contained in this document is NOT open source and is NOT being distributed as open source.

122,241 lines of code and growing...