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 requests 使用快速入门
Aug 31 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
python爬虫基本知识
Mar 05 Python
Python生成器generator用法示例
Aug 10 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
Python补齐字符串长度的实例
Nov 15 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
python爬虫工具例举说明
Nov 30 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 15 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 Python
Python 统计序列中元素的出现频度
Apr 26 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/05/26 PHP
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
php发送post请求的三种方法
2014/02/11 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
jquery 学习笔记一
2010/04/07 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
js创建对象的方式总结
2015/01/10 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
javascript常用函数(1)
2015/11/04 Javascript
深入理解js中this的用法
2016/05/28 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
js动态引入的四种方法
2018/05/05 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
[05:24]TI9采访——教练
2019/08/24 DOTA
深入浅析python定时杀进程
2016/06/06 Python
Python中生成Epoch的方法
2017/04/26 Python
详解Python 解压缩文件
2019/04/09 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
文明教师事迹材料
2014/01/16 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
村党组织公开承诺书
2015/04/30 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书