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编程之字符串模板(Template)用法实例分析
Jul 22 Python
Python对列表中的各项进行关联详解
Aug 15 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
如何使用Python实现自动化水军评论
Jun 26 Python
为什么说Python可以实现所有的算法
Oct 04 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
pycharm下pyqt4安装及环境配置的教程
Apr 24 Python
Visual Studio code 配置Python开发环境
Sep 11 Python
如何在pycharm中快捷安装pip命令(如pygame)
May 31 Python
Python 居然可以在 Excel 中画画你知道吗
Feb 15 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
从零开始的异世界生活:第二季延期后,B站上架了第二部剧场版
2020/05/06 日漫
php 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
详解Vue中的自定义指令
2020/12/07 Vue.js
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
javascript实现倒计时关闭广告
2021/02/09 Javascript
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python守护线程用法实例
2017/06/23 Python
详解python实现数据归一化处理的方式:(0,1)标准化
2019/07/17 Python
flask 实现token机制的示例代码
2019/11/07 Python
django框架auth模块用法实例详解
2019/12/10 Python
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
毕业生的求职信范文分享
2013/12/04 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
党员党性分析材料
2014/02/17 职场文书
爱心助学感谢信
2015/01/21 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书