Python实现的三层BP神经网络算法示例


Posted in Python onFebruary 07, 2018

本文实例讲述了Python实现的三层BP神经网络算法。分享给大家供大家参考,具体如下:

这是一个非常漂亮的三层反向传播神经网络的python实现,下一步我准备试着将其修改为多层BP神经网络。

下面是运行演示函数的截图,你会发现预测的结果很惊人!

Python实现的三层BP神经网络算法示例

提示:运行演示函数的时候,可以尝试改变隐藏层的节点数,看节点数增加了,预测的精度会否提升

import math
import random
import string
random.seed(0)
# 生成区间[a, b)内的随机数
def rand(a, b):
 return (b-a)*random.random() + a
# 生成大小 I*J 的矩阵,默认零矩阵 (当然,亦可用 NumPy 提速)
def makeMatrix(I, J, fill=0.0):
 m = []
 for i in range(I):
  m.append([fill]*J)
 return m
# 函数 sigmoid,这里采用 tanh,因为看起来要比标准的 1/(1+e^-x) 漂亮些
def sigmoid(x):
 return math.tanh(x)
# 函数 sigmoid 的派生函数, 为了得到输出 (即:y)
def dsigmoid(y):
 return 1.0 - y**2
class NN:
 ''' 三层反向传播神经网络 '''
 def __init__(self, ni, nh, no):
  # 输入层、隐藏层、输出层的节点(数)
  self.ni = ni + 1 # 增加一个偏差节点
  self.nh = nh
  self.no = no
  # 激活神经网络的所有节点(向量)
  self.ai = [1.0]*self.ni
  self.ah = [1.0]*self.nh
  self.ao = [1.0]*self.no
  # 建立权重(矩阵)
  self.wi = makeMatrix(self.ni, self.nh)
  self.wo = makeMatrix(self.nh, self.no)
  # 设为随机值
  for i in range(self.ni):
   for j in range(self.nh):
    self.wi[i][j] = rand(-0.2, 0.2)
  for j in range(self.nh):
   for k in range(self.no):
    self.wo[j][k] = rand(-2.0, 2.0)
  # 最后建立动量因子(矩阵)
  self.ci = makeMatrix(self.ni, self.nh)
  self.co = makeMatrix(self.nh, self.no)
 def update(self, inputs):
  if len(inputs) != self.ni-1:
   raise ValueError('与输入层节点数不符!')
  # 激活输入层
  for i in range(self.ni-1):
   #self.ai[i] = sigmoid(inputs[i])
   self.ai[i] = inputs[i]
  # 激活隐藏层
  for j in range(self.nh):
   sum = 0.0
   for i in range(self.ni):
    sum = sum + self.ai[i] * self.wi[i][j]
   self.ah[j] = sigmoid(sum)
  # 激活输出层
  for k in range(self.no):
   sum = 0.0
   for j in range(self.nh):
    sum = sum + self.ah[j] * self.wo[j][k]
   self.ao[k] = sigmoid(sum)
  return self.ao[:]
 def backPropagate(self, targets, N, M):
  ''' 反向传播 '''
  if len(targets) != self.no:
   raise ValueError('与输出层节点数不符!')
  # 计算输出层的误差
  output_deltas = [0.0] * self.no
  for k in range(self.no):
   error = targets[k]-self.ao[k]
   output_deltas[k] = dsigmoid(self.ao[k]) * error
  # 计算隐藏层的误差
  hidden_deltas = [0.0] * self.nh
  for j in range(self.nh):
   error = 0.0
   for k in range(self.no):
    error = error + output_deltas[k]*self.wo[j][k]
   hidden_deltas[j] = dsigmoid(self.ah[j]) * error
  # 更新输出层权重
  for j in range(self.nh):
   for k in range(self.no):
    change = output_deltas[k]*self.ah[j]
    self.wo[j][k] = self.wo[j][k] + N*change + M*self.co[j][k]
    self.co[j][k] = change
    #print(N*change, M*self.co[j][k])
  # 更新输入层权重
  for i in range(self.ni):
   for j in range(self.nh):
    change = hidden_deltas[j]*self.ai[i]
    self.wi[i][j] = self.wi[i][j] + N*change + M*self.ci[i][j]
    self.ci[i][j] = change
  # 计算误差
  error = 0.0
  for k in range(len(targets)):
   error = error + 0.5*(targets[k]-self.ao[k])**2
  return error
 def test(self, patterns):
  for p in patterns:
   print(p[0], '->', self.update(p[0]))
 def weights(self):
  print('输入层权重:')
  for i in range(self.ni):
   print(self.wi[i])
  print()
  print('输出层权重:')
  for j in range(self.nh):
   print(self.wo[j])
 def train(self, patterns, iterations=1000, N=0.5, M=0.1):
  # N: 学习速率(learning rate)
  # M: 动量因子(momentum factor)
  for i in range(iterations):
   error = 0.0
   for p in patterns:
    inputs = p[0]
    targets = p[1]
    self.update(inputs)
    error = error + self.backPropagate(targets, N, M)
   if i % 100 == 0:
    print('误差 %-.5f' % error)
def demo():
 # 一个演示:教神经网络学习逻辑异或(XOR)------------可以换成你自己的数据试试
 pat = [
  [[0,0], [0]],
  [[0,1], [1]],
  [[1,0], [1]],
  [[1,1], [0]]
 ]
 # 创建一个神经网络:输入层有两个节点、隐藏层有两个节点、输出层有一个节点
 n = NN(2, 2, 1)
 # 用一些模式训练它
 n.train(pat)
 # 测试训练的成果(不要吃惊哦)
 n.test(pat)
 # 看看训练好的权重(当然可以考虑把训练好的权重持久化)
 #n.weights()
if __name__ == '__main__':
 demo()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
Python素数检测实例分析
Jun 15 Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
Python2随机数列生成器简单实例
Sep 04 Python
Python3中条件控制、循环与函数的简易教程
Nov 21 Python
Django框架实现的简单分页功能示例
Dec 04 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
Python判断三段线能否构成三角形的代码
Apr 12 Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 Python
python中对列表的删除和添加方法详解
Feb 24 Python
Python 12306抢火车票脚本
Feb 07 #Python
django限制匿名用户访问及重定向的方法实例
Feb 07 #Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 #Python
Python实现的径向基(RBF)神经网络示例
Feb 06 #Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 #Python
初探TensorFLow从文件读取图片的四种方式
Feb 06 #Python
用十张图详解TensorFlow数据读取机制(附代码)
Feb 06 #Python
You might like
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php跨服务器访问方法小结
2015/05/12 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
js实现打字小游戏
2019/12/17 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
跟老齐学Python之数据类型总结
2014/09/24 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
高中毕业生自我鉴定例文
2013/12/29 职场文书
人事主管岗位职责
2014/01/30 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
Golang ort 中的sortInts 方法
2022/04/24 Golang