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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
Python读写Redis数据库操作示例
Mar 18 Python
python中map、any、all函数用法分析
Apr 21 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
使用pyqt 实现重复打开多个相同界面
Dec 13 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
python3中确保枚举值代码分析
Dec 02 Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 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 文件状态缓存带来的问题
2008/12/14 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
Laravel框架FormRequest中重写错误处理的方法
2019/02/18 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
js轮播图代码分享
2016/07/14 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
javascript 使用正则test( )第一次是 true,第二次是false
2017/02/22 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
基于python编写的微博应用
2014/10/17 Python
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Python用户自定义异常的实现
2020/12/25 Python
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
六月份红领巾广播稿
2014/02/03 职场文书
化妆品店促销方案
2014/02/24 职场文书
小学开学典礼主持词
2014/03/19 职场文书
倡议书格式
2014/08/30 职场文书
技术股东合作协议书
2014/12/02 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
男生贾里读书笔记
2015/06/30 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python