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中的split()函数的使用方法
Apr 07 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
Python 函数基础知识汇总
Mar 09 Python
基于python实现简单日历
Jul 28 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
python 根据时间来生成唯一的字符串方法
Jan 14 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
详解Python3 pickle模块用法
Sep 16 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 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开发文件系统实例讲解
2006/10/09 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
让python json encode datetime类型
2010/12/28 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
python3 字符串知识点学习笔记
2020/02/08 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
大学生表扬信范文
2014/01/09 职场文书
优质服务活动实施方案
2014/05/02 职场文书
公司离职证明样本
2014/09/13 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
商务邀请函
2015/01/30 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
给下属加薪申请报告
2015/05/15 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书