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进阶教程之动态类型详解
Aug 30 Python
将Python的Django框架与认证系统整合的方法
Jul 24 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
python小程序基于Jupyter实现天气查询的方法
Mar 27 Python
Python操作Jira库常用方法解析
Apr 10 Python
详解python如何引用包package
Jun 07 Python
Python DES加密实现原理及实例解析
Jul 17 Python
python如何实现递归转非递归
Feb 25 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面试题附答案
2009/01/07 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
深入理解js中this的用法
2016/05/28 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
Python类属性与实例属性用法分析
2015/05/09 Python
不要用强制方法杀掉python线程
2017/02/26 Python
Python语言快速上手学习方法
2018/12/14 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
django orm模块中的 is_delete用法
2020/05/20 Python
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
《和田的维吾尔》教学反思
2014/04/14 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
小学生作文评语大全
2014/04/21 职场文书
作风建设年活动总结
2014/08/27 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
电话营销开场白
2015/05/29 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python
Python代码实现双链表
2022/05/25 Python