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一行输出不显示的问题
Dec 03 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
Dec 12 Python
详解Django定时任务模块设计与实践
Jul 24 Python
Apache部署Django项目图文详解
Jul 30 Python
如何基于Python创建目录文件夹
Dec 31 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
Python利用命名空间解析XML文档
Aug 10 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
Django model class Meta原理解析
Nov 14 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
Dec 10 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
python编程项目中线上问题排查与解决
Nov 01 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
一个简单php扩展介绍与开发教程
2010/08/19 PHP
解析php中const与define的应用区别
2013/06/18 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
jquery blockUI 遮罩不能消失与不能提交的解决方法
2011/09/17 Javascript
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
Python实现区域填充的示例代码
2021/02/03 Python
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
手工社团活动方案
2014/02/17 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
安全检查汇报材料
2014/12/26 职场文书
药品开票员岗位职责
2015/04/15 职场文书
关于远足的感想
2015/08/10 职场文书
Mysql如何实现不存在则插入,存在则更新
2022/03/25 MySQL