Guest User

Untitled

a guest
Oct 22nd, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.88 KB | None | 0 0
  1. import numpy as np
  2.  
  3. class BackPropagationNetwork:
  4.  
  5. layerCount = 0
  6. shape = None
  7. weights = []
  8.  
  9.  
  10. def __init__(self, layerSize):
  11.  
  12. self.layerCount = len(layerSize) - 1
  13. self.shape = layerSize
  14.  
  15. self._layerInput = []
  16. self._layerOutput = []
  17.  
  18. for (l1,l2) in zip(layerSize[:-1], layerSize[1:]):
  19. self.weights.append(np.random.normal(scale = 0.005,size = (l2,l1+1)))
  20.  
  21. def Run(self, input):
  22.  
  23. lnCases = input.shape[0]
  24.  
  25. self._layerInput = []
  26. self._layerOutput = []
  27.  
  28. for index in range(self.layerCount):
  29. if index == 0:
  30. layerInput = self.weights[0].dot(np.vstack([input.T,np.ones([1, lnCases])]))
  31. else:
  32. layerInput = self.weights[index].dot(np.vstack([self._layerOutput[-1],np.ones([1, lnCases])]))
  33.  
  34. self._layerInput.append(layerInput)
  35. self._layerOutput.append(self.sgm(layerInput))
  36.  
  37. return self._layerOutput[-1].T
  38.  
  39. def sgm(self, x, Derivative = False): #the function
  40. if not Derivative:
  41. return np.maximum(0,x)
  42. #return np.tanh(x)
  43. else:
  44. x[x<=0] = 0
  45. x[x>0] = 1
  46. #return (1-(np.tanh(x))**2)
  47. return x
  48.  
  49.  
  50. def TrainEpoch(self, input, target, trainingRate = 0.2):
  51.  
  52. delta = []
  53. lnCases = input.shape[0]
  54.  
  55. self.Run(input)
  56.  
  57. for index in reversed(range(self.layerCount)):
  58. if index == self.layerCount - 1:
  59.  
  60. output_delta = self._layerOutput[index] - target.T
  61. error = np.sum(output_delta**2)
  62. delta.append(output_delta * self.sgm(self._layerInput[index],True))
  63. else:
  64. delta_pullback = self.weights[index+1].T.dot(delta[-1])
  65. delta.append(delta_pullback[:-1,:]*self.sgm(self._layerInput[index], True))
  66.  
  67.  
  68. for index in range(self.layerCount):
  69. delta_index = self.layerCount - 1 - index
  70.  
  71. if index == 0:
  72. layerOutput = np.vstack([input.T, np.ones([1,lnCases])])
  73. else:
  74. layerOutput = np.vstack([self._layerOutput[index - 1],np.ones([1,self._layerOutput[index - 1].shape[1]])])
  75.  
  76. weightDelta = np.sum(
  77. layerOutput[None,:,:].transpose(2,0,1)*delta[delta_index][None,:,:].transpose(2,1,0)
  78. , axis = 0)
  79.  
  80. self.weights[index] -= trainingRate*weightDelta
  81.  
  82. return error
  83.  
  84.  
  85.  
  86. if __name__ == "__main__":
  87. bpn = BackPropagationNetwork((4,10,1))
  88. print(bpn.shape)
  89. print(bpn.weights)
  90. from sklearn import datasets
  91. iris = datasets.load_iris()
  92. X = iris.data[:, :4] #
  93. y = iris.target
  94. y.shape = (150,1)
  95.  
  96. lvInput = X
  97. lvTarget = y
  98.  
  99. lnMax = 1000
  100. lnErr = 1e-5
  101.  
  102. for i in range(100000):
  103. err = bpn.TrainEpoch(lvInput, lvTarget)
  104. if i % 2500== 0:
  105. print("Iteration {0} t Error: {1:0.6f}".format(i,err))
  106. if err <= lnErr:
  107. print("Minimim error reached at iteration {0}".format(i))
  108. break
  109.  
  110.  
  111. lvOutput = bpn.Run(lvInput)
  112.  
  113. print("input: {0} n Output :{1}".format(lvInput, lvOutput))
Add Comment
Please, Sign In to add comment