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中的pass语句使用方法讲解
May 14 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
python实现kMeans算法
Dec 21 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
Tensorflow 查看变量的值方法
Jun 14 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
python wxpython 实现界面跳转功能
Dec 17 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 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
星际争霸中的热键
2020/03/04 星际争霸
理解php原理的opcodes(操作码)
2010/10/26 PHP
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
php实现遍历多维数组的方法
2015/11/25 PHP
JS查看对象功能代码
2008/04/25 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
vue调用语音播放的方法
2019/09/27 Javascript
jquery实现上传文件进度条
2020/03/26 jQuery
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python lambda表达式用法实例分析
2018/12/25 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
pip安装python库的方法总结
2019/08/02 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
英国顶级家庭折扣店:The Works
2017/09/06 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
2014国培学习感言
2014/03/05 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
个人整改措施书面材料
2014/10/24 职场文书
2014年医务科工作总结
2014/12/18 职场文书
销售开票员岗位职责
2015/04/15 职场文书
会议通知范文
2015/04/15 职场文书
《月光曲》教学反思
2016/02/16 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
Go 中的空白标识符下划线
2022/03/25 Golang