Python使用numpy实现BP神经网络


Posted in Python onMarch 10, 2018

本文完全利用numpy实现一个简单的BP神经网络,由于是做regression而不是classification,因此在这里输出层选取的激励函数就是f(x)=x。BP神经网络的具体原理此处不再介绍。

import numpy as np 
 
class NeuralNetwork(object): 
  def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate): 
    # Set number of nodes in input, hidden and output layers.设定输入层、隐藏层和输出层的node数目 
    self.input_nodes = input_nodes 
    self.hidden_nodes = hidden_nodes 
    self.output_nodes = output_nodes 
 
    # Initialize weights,初始化权重和学习速率 
    self.weights_input_to_hidden = np.random.normal(0.0, self.hidden_nodes**-0.5,  
                    ( self.hidden_nodes, self.input_nodes)) 
 
    self.weights_hidden_to_output = np.random.normal(0.0, self.output_nodes**-0.5,  
                    (self.output_nodes, self.hidden_nodes)) 
    self.lr = learning_rate 
     
    # 隐藏层的激励函数为sigmoid函数,Activation function is the sigmoid function 
    self.activation_function = (lambda x: 1/(1 + np.exp(-x))) 
   
  def train(self, inputs_list, targets_list): 
    # Convert inputs list to 2d array 
    inputs = np.array(inputs_list, ndmin=2).T  # 输入向量的shape为 [feature_diemension, 1] 
    targets = np.array(targets_list, ndmin=2).T  
 
    # 向前传播,Forward pass 
    # TODO: Hidden layer 
    hidden_inputs = np.dot(self.weights_input_to_hidden, inputs) # signals into hidden layer 
    hidden_outputs = self.activation_function(hidden_inputs) # signals from hidden layer 
 
     
    # 输出层,输出层的激励函数就是 y = x 
    final_inputs = np.dot(self.weights_hidden_to_output, hidden_outputs) # signals into final output layer 
    final_outputs = final_inputs # signals from final output layer 
     
    ### 反向传播 Backward pass,使用梯度下降对权重进行更新 ### 
     
    # 输出误差 
    # Output layer error is the difference between desired target and actual output. 
    output_errors = (targets_list-final_outputs) 
 
    # 反向传播误差 Backpropagated error 
    # errors propagated to the hidden layer 
    hidden_errors = np.dot(output_errors, self.weights_hidden_to_output)*(hidden_outputs*(1-hidden_outputs)).T 
 
    # 更新权重 Update the weights 
    # 更新隐藏层与输出层之间的权重 update hidden-to-output weights with gradient descent step 
    self.weights_hidden_to_output += output_errors * hidden_outputs.T * self.lr 
    # 更新输入层与隐藏层之间的权重 update input-to-hidden weights with gradient descent step 
    self.weights_input_to_hidden += (inputs * hidden_errors * self.lr).T 
  
  # 进行预测   
  def run(self, inputs_list): 
    # Run a forward pass through the network 
    inputs = np.array(inputs_list, ndmin=2).T 
     
    #### 实现向前传播 Implement the forward pass here #### 
    # 隐藏层 Hidden layer 
    hidden_inputs = np.dot(self.weights_input_to_hidden, inputs) # signals into hidden layer 
    hidden_outputs = self.activation_function(hidden_inputs) # signals from hidden layer 
     
    # 输出层 Output layer 
    final_inputs = np.dot(self.weights_hidden_to_output, hidden_outputs) # signals into final output layer 
    final_outputs = final_inputs # signals from final output layer  
     
    return final_outputs

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python版微信红包分配算法
May 04 Python
python写入xml文件的方法
May 08 Python
Python解析最简单的验证码
Jan 07 Python
Django小白教程之Django用户注册与登录
Apr 22 Python
python3.6的venv模块使用详解
Aug 01 Python
python解析json串与正则匹配对比方法
Dec 20 Python
python实现生成字符串大小写字母和数字的各种组合
Jan 01 Python
在Pycharm terminal中字体大小设置的方法
Jan 16 Python
python元组的概念知识点
Nov 19 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
python实现日常记账本小程序
Mar 10 #Python
python实现简单神经网络算法
Mar 10 #Python
TensorFlow saver指定变量的存取
Mar 10 #Python
TensorFLow用Saver保存和恢复变量
Mar 10 #Python
tensorflow创建变量以及根据名称查找变量
Mar 10 #Python
Python2中文处理纪要的实现方法
Mar 10 #Python
python实现冒泡排序算法的两种方法
Mar 10 #Python
You might like
PHP以及MYSQL日期比较方法
2012/11/29 PHP
php购物车实现方法
2015/01/03 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
js left,right,mid函数
2008/06/10 Javascript
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
python实现将内容分行输出
2015/11/05 Python
python的else子句使用指南
2016/02/27 Python
学习python分支结构
2019/05/17 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
环保倡议书怎么写
2014/05/16 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
pandas数值排序的实现实例
2021/07/25 Python