Python使用numpy实现BP神经网络

本文完全利用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构建深度神经网络(DNN)
  • python实现简单神经网络算法
  • Python实现的径向基(RBF)神经网络示例
  • Python编程实现的简单神经网络算法示例
  • python实现神经网络感知器算法
  • python机器学习之神经网络(三)
  • python机器学习之神经网络(二)
  • Python实现感知器模型、两层神经网络
  • Python与人工神经网络:使用神经网络识别手写图像介绍
  • python构建深度神经网络(续)
(0)

相关推荐

  • python机器学习之神经网络(三)

    前面两篇文章都是参考书本神经网络的原理,一步步写的代码,这篇博文里主要学习了如何使用neurolab库中的函数来实现神经网络的算法. 首先介绍一下neurolab库的配置: 选择你所需要的版本进行下载,下载完成后解压. neurolab需要采用python安装第三方软件包的方式进行安装,这里介绍一种安装方式: (1)进入cmd窗口 (2)进入解压文件所在目录下 (3)输入 setup.py install 这样,在python安装目录的Python27\Lib\site-packages下,就可

  • python实现神经网络感知器算法

    现在我们用python代码实现感知器算法. # -*- coding: utf-8 -*- import numpy as np class Perceptron(object): """ eta:学习率 n_iter:权重向量的训练次数 w_:神经分叉权重向量 errors_:用于记录神经元判断出错次数 """ def __init__(self, eta=0.01, n_iter=2): self.eta = eta self.n_iter

  • python构建深度神经网络(续)

    这篇文章在前一篇文章:python构建深度神经网络(DNN)的基础上,添加了一下几个内容: 1) 正则化项 2) 调出中间损失函数的输出 3) 构建了交叉损失函数 4) 将训练好的网络进行保存,并调用用来测试新数据 1  数据预处理 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-03-12 15:11 # @Author : CC # @File : net_load_data.py from numpy import

  • Python编程实现的简单神经网络算法示例

    本文实例讲述了Python编程实现的简单神经网络算法.分享给大家供大家参考,具体如下: python实现二层神经网络 包括输入层和输出层 # -*- coding:utf-8 -*- #! python2 import numpy as np #sigmoid function def nonlin(x, deriv = False): if(deriv == True): return x*(1-x) return 1/(1+np.exp(-x)) #input dataset x = np.

  • python实现简单神经网络算法

    python实现简单神经网络算法,供大家参考,具体内容如下 python实现二层神经网络 包括输入层和输出层 import numpy as np #sigmoid function def nonlin(x, deriv = False): if(deriv == True): return x*(1-x) return 1/(1+np.exp(-x)) #input dataset x = np.array([[0,0,1], [0,1,1], [1,0,1], [1,1,1]]) #out

  • python构建深度神经网络(DNN)

    本文学习Neural Networks and Deep Learning 在线免费书籍,用python构建神经网络识别手写体的一个总结. 代码主要包括两三部分: 1).数据调用和预处理 2).神经网络类构建和方法建立 3).代码测试文件 1)数据调用: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-03-12 15:11 # @Author : CC # @File : net_load_data.py # @Soft

  • python机器学习之神经网络(二)

    由于Rosenblatt感知器的局限性,对于非线性分类的效果不理想.为了对线性分类无法区分的数据进行分类,需要构建多层感知器结构对数据进行分类,多层感知器结构如下: 该网络由输入层,隐藏层,和输出层构成,能表示种类繁多的非线性曲面,每一个隐藏层都有一个激活函数,将该单元的输入数据与权值相乘后得到的值(即诱导局部域)经过激活函数,激活函数的输出值作为该单元的输出,激活函数类似与硬限幅函数,但硬限幅函数在阈值处是不可导的,而激活函数处处可导.本次程序中使用的激活函数是tanh函数,公式如下: tan

  • Python与人工神经网络:使用神经网络识别手写图像介绍

    人体的视觉系统是一个相当神奇的存在,对于下面的一串手写图像,可以毫不费力的识别出他们是504192,轻松到让人都忘记了其实这是一个复杂的工作. 实际上在我们的大脑的左脑和右脑的皮层都有一个第一视觉区域,叫做V1,里面有14亿视觉神经元.而且,在我们识别上面的图像的时候,工作的不止有V1,还有V2.V3.V4.V5,所以这么一看,我们确实威武. 但是让计算机进行模式识别,就比较复杂了,主要困难在于我们如何给计算机描述一个数字9在图像上应该是怎样的,比如我们跟计算机说,9的上面是一个圈,下右边是1竖

  • Python实现的径向基(RBF)神经网络示例

    本文实例讲述了Python实现的径向基(RBF)神经网络.分享给大家供大家参考,具体如下: from numpy import array, append, vstack, transpose, reshape, \ dot, true_divide, mean, exp, sqrt, log, \ loadtxt, savetxt, zeros, frombuffer from numpy.linalg import norm, lstsq from multiprocessing impor

  • Python实现感知器模型、两层神经网络

    本文实例为大家分享了Python实现感知器模型.两层神经网络,供大家参考,具体内容如下 python 3.4 因为使用了 numpy 这里我们首先实现一个感知器模型来实现下面的对应关系 [[0,0,1], --- 0 [0,1,1], --- 1 [1,0,1], --- 0 [1,1,1]] --- 1 从上面的数据可以看出:输入是三通道,输出是单通道. 这里的激活函数我们使用 sigmoid 函数 f(x)=1/(1+exp(-x)) 其导数推导如下所示: L0=W*X; z=f(L0);

随机推荐