当前位置:   article > 正文

Python3实现BP神经网络_python,神经网络

python,神经网络

主要是实现了这位大佬的代码,顺便加了一些自己的理解http://www.cnblogs.com/Finley/p/5946000.html

  1. import math
  2. import random
  3. random.seed(0)
  4. def rand(a,b): #随机函数
  5. return (b-a)*random.random()+a
  6. def make_matrix(m,n,fill=0.0):#创建一个指定大小的矩阵
  7. mat = []
  8. for i in range(m):
  9. mat.append([fill]*n)
  10. return mat
  11. #定义sigmoid函数和它的导数
  12. def sigmoid(x):
  13. return 1.0/(1.0+math.exp(-x))
  14. def sigmoid_derivate(x):
  15. return x*(1-x) #sigmoid函数的导数
  16. class BPNeuralNetwork:
  17. def __init__(self):#初始化变量
  18. self.input_n = 0
  19. self.hidden_n = 0
  20. self.output_n = 0
  21. self.input_cells = []
  22. self.hidden_cells = []
  23. self.output_cells = []
  24. self.input_weights = []
  25. self.output_weights = []
  26. self.input_correction = []
  27. self.output_correction = []
  28. #三个列表维护:输入层,隐含层,输出层神经元
  29. def setup(self,ni,nh,no):
  30. self.input_n = ni+1 #输入层+偏置项
  31. self.hidden_n = nh #隐含层
  32. self.output_n = no #输出层
  33. #初始化神经元
  34. self.input_cells = [1.0]*self.input_n
  35. self.hidden_cells= [1.0]*self.hidden_n
  36. self.output_cells= [1.0]*self.output_n
  37. #初始化连接边的边权
  38. self.input_weights = make_matrix(self.input_n,self.hidden_n) #邻接矩阵存边权:输入层->隐藏层
  39. self.output_weights = make_matrix(self.hidden_n,self.output_n) #邻接矩阵存边权:隐藏层->输出层
  40. #随机初始化边权:为了反向传导做准备--->随机初始化的目的是使对称失效
  41. for i in range(self.input_n):
  42. for h in range(self.hidden_n):
  43. self.input_weights[i][h] = rand(-0.2 , 0.2) #由输入层第i个元素到隐藏层第j个元素的边权为随机值
  44. for h in range(self.hidden_n):
  45. for o in range(self.output_n):
  46. self.output_weights[h][o] = rand(-2.0, 2.0) #由隐藏层第i个元素到输出层第j个元素的边权为随机值
  47. #保存校正矩阵,为了以后误差做调整
  48. self.input_correction = make_matrix(self.input_n , self.hidden_n)
  49. self.output_correction = make_matrix(self.hidden_n,self.output_n)
  50. #输出预测值
  51. def predict(self,inputs):
  52. #对输入层进行操作转化样本
  53. for i in range(self.input_n-1):
  54. self.input_cells[i] = inputs[i] #n个样本从0~n-1
  55. #计算隐藏层的输出,每个节点最终的输出值就是权值*节点值的加权和
  56. for j in range(self.hidden_n):
  57. total = 0.0
  58. for i in range(self.input_n):
  59. total+=self.input_cells[i]*self.input_weights[i][j]
  60. # 此处为何是先i再j,以隐含层节点做大循环,输入样本为小循环,是为了每一个隐藏节点计算一个输出值,传输到下一层
  61. self.hidden_cells[j] = sigmoid(total) #此节点的输出是前一层所有输入点和到该点之间的权值加权和
  62. for k in range(self.output_n):
  63. total = 0.0
  64. for j in range(self.hidden_n):
  65. total+=self.hidden_cells[j]*self.output_weights[j][k]
  66. self.output_cells[k] = sigmoid(total) #获取输出层每个元素的值
  67. return self.output_cells[:] #最后输出层的结果返回
  68. #反向传播算法:调用预测函数,根据反向传播获取权重后前向预测,将结果与实际结果返回比较误差
  69. def back_propagate(self,case,label,learn,correct):
  70. #对输入样本做预测
  71. self.predict(case) #对实例进行预测
  72. output_deltas = [0.0]*self.output_n #初始化矩阵
  73. for o in range(self.output_n):
  74. error = label[o] - self.output_cells[o] #正确结果和预测结果的误差:0,1,-1
  75. output_deltas[o]= sigmoid_derivate(self.output_cells[o])*error#误差稳定在0~1内
  76. #隐含层误差
  77. hidden_deltas = [0.0]*self.hidden_n
  78. for h in range(self.hidden_n):
  79. error = 0.0
  80. for o in range(self.output_n):
  81. error+=output_deltas[o]*self.output_weights[h][o]
  82. hidden_deltas[h] = sigmoid_derivate(self.hidden_cells[h])*error
  83. #反向传播算法求W
  84. #更新隐藏层->输出权重
  85. for h in range(self.hidden_n):
  86. for o in range(self.output_n):
  87. change = output_deltas[o]*self.hidden_cells[h]
  88. #调整权重:上一层每个节点的权重学习*变化+矫正率
  89. self.output_weights[h][o] += learn*change + correct*self.output_correction[h][o]
  90. #更新输入->隐藏层的权重
  91. for i in range(self.input_n):
  92. for h in range(self.hidden_n):
  93. change = hidden_deltas[h]*self.input_cells[i]
  94. self.input_weights[i][h] += learn*change + correct*self.input_correction[i][h]
  95. self.input_correction[i][h] = change
  96. #获取全局误差
  97. error = 0.0
  98. for o in range(len(label)):
  99. error = 0.5*(label[o]-self.output_cells[o])**2 #平方误差函数
  100. return error
  101. def train(self,cases,labels,limit=10000,learn=0.05,correct=0.1):
  102. for i in range(limit): #设置迭代次数
  103. error = 0.0
  104. for j in range(len(cases)):#对输入层进行访问
  105. label = labels[j]
  106. case = cases[j]
  107. error+=self.back_propagate(case,label,learn,correct) #样例,标签,学习率,正确阈值
  108. def test(self): #学习异或
  109. cases = [
  110. [0, 0],
  111. [0, 1],
  112. [1, 0],
  113. [1, 1],
  114. ] #测试样例
  115. labels = [[0], [1], [1], [0]] #标签
  116. self.setup(2,5,1) #初始化神经网络:输入层,隐藏层,输出层元素个数
  117. self.train(cases,labels,10000,0.05,0.1) #可以更改
  118. for case in cases:
  119. print(self.predict(case))
  120. if __name__ == '__main__':
  121. nn = BPNeuralNetwork()
  122. nn.test()


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/94838
推荐阅读
相关标签
  

闽ICP备14008679号