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...