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使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
May 20 Python
Python实现的多线程http压力测试代码
Feb 08 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
Python实现Linux监控的方法
May 16 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
python和c语言哪个更适合初学者
Jun 22 Python
详解python logging日志传输
Jul 01 Python
k-means & DBSCAN 总结
Apr 27 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
PHP英文字母大小写转换函数小结
2014/05/03 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php绘制一条弧线的方法
2015/01/24 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
Seajs的学习笔记
2014/03/04 Javascript
js分页工具实例
2015/01/28 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
JavaScript中实现Map的示例代码
2015/09/09 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
使用vue构建多页面应用的示例
2020/10/22 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
Python处理Excel文件实例代码
2017/06/20 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
Django 通过JS实现ajax过程详解
2019/07/30 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
四年大学生活的个人自我评价
2013/12/11 职场文书
电子商务个人自荐信
2013/12/12 职场文书
土木建筑学生自我评价
2014/01/14 职场文书
食品安全检查制度
2014/02/03 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
环保项目建议书
2014/08/26 职场文书
课外访万家心得体会
2014/09/03 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书