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 字符串格式化代码
Mar 17 Python
Python实现的Kmeans++算法实例
Apr 26 Python
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 Python
Python实现保证只能运行一个脚本实例
Jun 24 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
Python字符串对象实现原理详解
Jul 01 Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 Python
Python三元运算与lambda表达式实例解析
Nov 30 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
详解Python生成器和基于生成器的协程
Jun 03 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
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
php pthreads多线程的安装与使用
2016/01/19 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
JavaScript中获取元素索引的函数
2010/09/10 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
JavaScript获取用户所在城市及地理位置
2018/04/21 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
每天学点Vue源码之vm.$mount挂载函数
2019/03/11 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python实现在windows下操作word的方法
2015/04/28 Python
Python实现将xml导入至excel
2015/11/20 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
String是最基本的数据类型吗?
2013/06/13 面试题
元旦晚会邀请函
2014/02/01 职场文书
商业融资计划书
2014/04/29 职场文书
公司踏青活动方案
2014/08/16 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
民政局离婚协议书范本
2014/10/20 职场文书
先进班组材料范文
2014/12/25 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书