Python实现的人工神经网络算法示例【基于反向传播算法】


Posted in Python onNovember 11, 2017

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

注意:本程序使用Python3编写,额外需要安装numpy工具包用于矩阵运算,未测试python2是否可以运行。

本程序实现了《机器学习》书中所述的反向传播算法训练人工神经网络,理论部分请参考我的读书笔记。

在本程序中,目标函数是由一个输入x和两个输出y组成,
x是在范围【-3.14, 3.14】之间随机生成的实数,而两个y值分别对应 y1 = sin(x),y2 = 1。

随机生成一万份训练样例,经过网络的学习训练后,再用随机生成的五份测试数据验证训练结果。

调节算法的学习速率,以及隐藏层个数、隐藏层大小,训练新的网络,可以观察到参数对于学习结果的影响。

算法代码如下:

#!usr/bin/env python3
# -*- coding:utf-8 -*-
import numpy as np
import math
# definition of sigmoid funtion
# numpy.exp work for arrays.
def sigmoid(x):
  return 1 / (1 + np.exp(-x))
# definition of sigmoid derivative funtion
# input must be sigmoid function's result
def sigmoid_output_to_derivative(result):
  return result*(1-result)
# init training set
def getTrainingSet(nameOfSet):
  setDict = {
    "sin": getSinSet(),
    }
  return setDict[nameOfSet]
def getSinSet():
  x = 6.2 * np.random.rand(1) - 3.14
  x = x.reshape(1,1)
  # y = np.array([5 *x]).reshape(1,1)
  # y = np.array([math.sin(x)]).reshape(1,1)
  y = np.array([math.sin(x),1]).reshape(1,2)
  return x, y
def getW(synapse, delta):
  resultList = []
  # 遍历隐藏层每个隐藏单元对每个输出的权值,比如8个隐藏单元,每个隐藏单元对两个输出各有2个权值
  for i in range(synapse.shape[0]):
    resultList.append(
      (synapse[i,:] * delta).sum()
      )
  resultArr = np.array(resultList).reshape(1, synapse.shape[0])
  return resultArr
def getT(delta, layer):
  result = np.dot(layer.T, delta)
  return result
def backPropagation(trainingExamples, etah, input_dim, output_dim, hidden_dim, hidden_num):
  # 可行条件
  if hidden_num < 1:
    print("隐藏层数不得小于1")
    return
  # 初始化网络权重矩阵,这个是核心
  synapseList = []
  # 输入层与隐含层1
  synapseList.append(2*np.random.random((input_dim,hidden_dim)) - 1)
  # 隐含层1与隐含层2, 2->3,,,,,,n-1->n
  for i in range(hidden_num-1):
    synapseList.append(2*np.random.random((hidden_dim,hidden_dim)) - 1)
  # 隐含层n与输出层
  synapseList.append(2*np.random.random((hidden_dim,output_dim)) - 1)
  iCount = 0
  lastErrorMax = 99999
  # while True:
  for i in range(10000):
    errorMax = 0
    for x, y in trainingExamples:
      iCount += 1
      layerList = []
      # 正向传播
      layerList.append(
        sigmoid(np.dot(x,synapseList[0]))
        )
      for j in range(hidden_num):
        layerList.append(
          sigmoid(np.dot(layerList[-1],synapseList[j+1]))
          )
      # 对于网络中的每个输出单元k,计算它的误差项
      deltaList = []
      layerOutputError = y - layerList[-1]
      # 收敛条件
      errorMax = layerOutputError.sum() if layerOutputError.sum() > errorMax else errorMax
      deltaK = sigmoid_output_to_derivative(layerList[-1]) * layerOutputError
      deltaList.append(deltaK)
      iLength = len(synapseList)
      for j in range(hidden_num):
        w = getW(synapseList[iLength - 1 - j], deltaList[j])
        delta = sigmoid_output_to_derivative(layerList[iLength - 2 - j]) * w
        deltaList.append(delta)
      # 更新每个网络权值w(ji)
      for j in range(len(synapseList)-1, 0, -1):
        t = getT(deltaList[iLength - 1 -j], layerList[j-1])
        synapseList[j] = synapseList[j] + etah * t
      t = getT(deltaList[-1], x)
      synapseList[0] = synapseList[0] + etah * t
    print("最大输出误差:")
    print(errorMax)
    if abs(lastErrorMax - errorMax) < 0.0001:
      print("收敛了")
      print("####################")
      break
    lastErrorMax = errorMax
  # 测试训练好的网络
  for i in range(5):
    xTest, yReal = getSinSet()
    layerTmp = sigmoid(np.dot(xTest,synapseList[0]))
    for j in range(1, len(synapseList), 1):
      layerTmp = sigmoid(np.dot(layerTmp,synapseList[j]))
    yTest = layerTmp
    print("x:")
    print(xTest)
    print("实际的y:")
    print(yReal)
    print("神经元网络输出的y:")
    print(yTest)
    print("最终输出误差:")
    print(np.abs(yReal - yTest))
    print("#####################")
  print("迭代次数:")
  print(iCount)
if __name__ == '__main__':
  import datetime
  tStart = datetime.datetime.now()
  # 使用什么样的训练样例
  nameOfSet = "sin"
  x, y = getTrainingSet(nameOfSet)
  # setting of parameters
  # 这里设置了学习速率。
  etah = 0.01
  # 隐藏层数
  hidden_num = 2
  # 网络输入层的大小
  input_dim = x.shape[1]
  # 隐含层的大小
  hidden_dim = 100
  # 输出层的大小
  output_dim = y.shape[1]
  # 构建训练样例
  trainingExamples = []
  for i in range(10000):
    x, y = getTrainingSet(nameOfSet)
    trainingExamples.append((x, y))
  # 开始用反向传播算法训练网络
  backPropagation(trainingExamples, etah, input_dim, output_dim, hidden_dim, hidden_num)
  tEnd = datetime.datetime.now()
  print("time cost:")
  print(tEnd - tStart)

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

Python 相关文章推荐
linux下python抓屏实现方法
May 22 Python
Python获取央视节目单的实现代码
Jul 25 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Python实现的概率分布运算操作示例
Aug 14 Python
python实现贪吃蛇游戏
Mar 21 Python
Python (Win)readline和tab补全的安装方法
Aug 27 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
Python多进程编程常用方法解析
Mar 26 Python
Python decorator拦截器代码实例解析
Apr 04 Python
python中使用input()函数获取用户输入值方式
May 03 Python
python适合做数据挖掘吗
Jun 16 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 #Python
python基础练习之几个简单的游戏
Nov 10 #Python
Python实现购物车功能的方法分析
Nov 10 #Python
Python实现的单向循环链表功能示例
Nov 10 #Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 #Python
浅谈Python处理PDF的方法
Nov 10 #Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 #Python
You might like
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
Bootstrap模态框(modal)垂直居中的实例代码
2016/08/18 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
jquery实现抽奖功能
2020/10/22 jQuery
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
Python OS模块常用函数说明
2015/05/23 Python
linux下python使用sendmail发送邮件
2018/05/22 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
pandas-resample按时间聚合实例
2019/12/27 Python
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
新大陆软件面试题
2016/11/24 面试题
公证委托书大全
2014/04/04 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
先进典型事迹材料
2014/12/29 职场文书
开除员工通知
2015/04/22 职场文书
2015年统战工作总结
2015/05/19 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
微信小程序实现录音Record功能
2021/05/09 Javascript
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python