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 相关文章推荐
Python字符遍历的艺术
Sep 06 Python
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
Python PyQt4实现QQ抽屉效果
Apr 20 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
Python根据字符串调用函数过程解析
Nov 05 Python
python re的findall和finditer的区别详解
Nov 15 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
python获取字符串中的email
Mar 31 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
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
mac下Apache + MySql + PHP搭建网站开发环境
2014/06/02 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
document.compatMode介绍
2009/05/21 Javascript
js两行代码按指定格式输出日期时间
2011/10/21 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
Python Trie树实现字典排序
2014/03/28 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
python asyncio 协程库的使用
2021/01/21 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
挑战杯创业计划书的写作指南
2014/01/07 职场文书
理财投资建议书
2014/03/12 职场文书
幼儿园中班开学寄语
2014/04/03 职场文书
主题团日活动总结
2014/06/25 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python