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使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
Python对象体系深入分析
Oct 28 Python
python模块之StringIO使用示例
Apr 08 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
使用pycharm生成代码模板的实例
May 23 Python
Python解决走迷宫问题算法示例
Jul 27 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 Python
如何一键升级Python所有包
Nov 05 Python
pandas针对excel处理的实现
Jan 15 Python
python 爬取天气网卫星图片
Jun 07 Python
用Python可视化新冠疫情数据
Jan 18 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
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
2016/01/12 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
js下获取div中的数据的原理分析
2010/04/07 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
如何基于Python创建目录文件夹
2019/12/31 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
花卉与景观设计系大学生求职信
2013/10/01 职场文书
幼儿运动会邀请函
2014/01/17 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
信息总监管理职责范本
2014/03/08 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
捐助感谢信
2015/01/22 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python