神经网络理论基础及Python实现

一、多层前向神经网络

多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;

输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;

除去输入层之外,隐藏层和输出层的层数和为n,则该神经网络称为n层神经网络,如下图为2层的神经网络;

一层中加权求和,根据非线性方程进行转化输出;理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程

二、设计神经网络结构

使用神经网络之前,必须要确定神经网络的层数,以及每层单元的个数;

为了加速学习过程,特征向量在传入输入层前,通常需要标准化到0和1之间;

离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值

比如:特征值A可能去三个值(a0,a1,a2),那么可以使用3个输入单元来代表A

如果A=a0,则代表a0的单元值取1,其余取0;

如果A=a1,则代表a1的单元值取1,其余取0;

如果A=a2,则代表a2的单元值取1,其余取0;

神经网络既解决分类(classification)问题,也可以解决回归(regression)问题。对于分类问题,如果是两类,则可以用一个输出单元(0和1)分别表示两类;如果多余两类,则每一个类别用一个输出单元表示,所以输出层的单元数量通常等一类别的数量。

没有明确的规则来设计最佳个数的隐藏层,一般根据实验测试误差和准确率来改进实验。

三、交叉验证方法

如何计算准确率?最简单的方法是通过一组训练集和测试集,训练集通过训练得到模型,将测试集输入模型得到测试结果,将测试结果和测试集的真实标签进行比较,得到准确率。

在机器学习领域一个常用的方法是交叉验证方法。一组数据不分成2份,可能分为10份,

第1次:第1份作为测试集,剩余9份作为训练集;

第2次:第2份作为测试集,剩余9份作为训练集;

……

这样经过10次训练,得到10组准确率,将这10组数据求平均值得到平均准确率的结果。这里10是特例。一般意义上将数据分为k份,称该算法为K-fold cross validation,即每一次选择k份中的一份作为测试集,剩余k-1份作为训练集,重复k次,最终得到平均准确率,是一种比较科学准确的方法。

四、BP算法

通过迭代来处理训练集中的实例;

对比经过神经网络后预测值与真实值之间的差;

反方向(从输出层=>隐藏层=>输入层)来最小化误差,来更新每个连接的权重;

4.1、算法详细介绍

输入:数据集、学习率、一个多层神经网络构架;

输出:一个训练好的神经网络;

初始化权重和偏向:随机初始化在-1到1之间(或者其他),每个单元有一个偏向;对于每一个训练实例X,执行以下步骤:

1、由输入层向前传送:

结合神经网络示意图进行分析:

由输入层到隐藏层:

由隐藏层到输出层:

两个公式进行总结,可以得到:

Ij为当前层单元值,Oi为上一层的单元值,wij为两层之间,连接两个单元值的权重值,sitaj为每一层的偏向值。我们要对每一层的输出进行非线性的转换,示意图如下:

当前层输出为Ij,f为非线性转化函数,又称为激活函数,定义如下:

即每一层的输出为:

这样就可以通过输入值正向得到每一层的输出值。

2、根据误差反向传送 对于输出层:其中Tk是真实值,Ok是预测值

对于隐藏层:

权重更新:其中l为学习率

偏向更新:

3、终止条件

偏重的更新低于某个阈值;

预测的错误率低于某个阈值;

达到预设一定的循环次数;

4、非线性转化函数

上面提到的非线性转化函数f,一般情况下可以用两种函数:

(1)tanh(x)函数:

  • tanh(x)=sinh(x)/cosh(x)
  • sinh(x)=(exp(x)-exp(-x))/2
  • cosh(x)=(exp(x)+exp(-x))/2

(2)逻辑函数,本文上面用的就是逻辑函数

五、BP神经网络的python实现

需要先导入numpy模块


  1. import numpy as np 

定义非线性转化函数,由于还需要用到给函数的导数形式,因此一起定义


  1. def tanh(x): 
  2.     return np.tanh(x) 
  3. def tanh_deriv(x): 
  4.     return 1.0 - np.tanh(x)*np.tanh(x) 
  5. def logistic(x): 
  6.     return 1/(1 + np.exp(-x)) 
  7. def logistic_derivative(x): 
  8.     return logistic(x)*(1-logistic(x)) 

设计BP神经网络的形式(几层,每层多少单元个数),用到了面向对象,主要是选择哪种非线性函数,以及初始化权重。layers是一个list,里面包含每一层的单元个数。


  1. class NeuralNetwork: 
  2.     def __init__(self, layers, activation='tanh'): 
  3.         """ 
  4.         :param layers: A list containing the number of units in each layer. 
  5.         Should be at least two values 
  6.         :param activation: The activation function to be used. Can be 
  7.         "logistic" or "tanh" 
  8.         """ 
  9.         if activation == 'logistic': 
  10.             self.activation = logistic 
  11.             self.activation_deriv = logistic_derivative 
  12.         elif activation == 'tanh': 
  13.             self.activation = tanh 
  14.             self.activation_deriv = tanh_deriv 
  15.   
  16.         self.weights = [] 
  17.         for i in range(1, len(layers) - 1): 
  18.             self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25) 
  19.             self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25) 

实现算法


  1. def fit(self, X, y, learning_rate=0.2, epochs=10000): 
  2.        X = np.atleast_2d(X) 
  3.        temp = np.ones([X.shape[0], X.shape[1]+1]) 
  4.        temp[:, 0:-1] = X 
  5.        X = temp 
  6.        y = np.array(y) 
  7.  
  8.        for k in range(epochs): 
  9.            i = np.random.randint(X.shape[0]) 
  10.            a = [X[i]] 
  11.  
  12.            for l in range(len(self.weights)): 
  13.                a.append(self.activation(np.dot(a[l], self.weights[l]))) 
  14.            error = y[i] - a[-1] 
  15.            deltas = [error * self.activation_deriv(a[-1])] 
  16.  
  17.            for l in range(len(a) - 2, 0, -1): 
  18.                deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l])) 
  19.            deltas.reverse() 
  20.  
  21.            for i in range(len(self.weights)): 
  22.                layer = np.atleast_2d(a[i]) 
  23.                delta = np.atleast_2d(deltas[i]) 
  24.                self.weights[i] += learning_rate * layer.T.dot(delta) 

实现预测


  1. def predict(self, x): 
  2.        x = np.array(x) 
  3.        temp = np.ones(x.shape[0]+1) 
  4.        temp[0:-1] = x 
  5.        a = temp 
  6.        for l in range(0, len(self.weights)): 
  7.            a = self.activation(np.dot(a, self.weights[l])) 
  8.        return a 

我们给出一组数进行预测,我们上面的程序文件保存名称为BP


  1. from BP import NeuralNetwork 
  2. import numpy as np 
  3.   
  4. nn = NeuralNetwork([2,2,1], 'tanh') 
  5. x = np.array([[0,0], [0,1], [1,0], [1,1]]) 
  6. y = np.array([1,0,0,1]) 
  7. nn.fit(x,y,0.1,10000) 
  8. for i in [[0,0], [0,1], [1,0], [1,1]]: 
  9.     print(i, nn.predict(i)) 

结果如下:


  1. ([0, 0], array([ 0.99738862])) 
  2. ([0, 1], array([ 0.00091329])) 
  3. ([1, 0], array([ 0.00086846])) 
  4. ([1, 1], array([ 0.99751259])) 

本文作者:温梦月

来源:51CTO

时间: 2024-08-03 03:32:13

神经网络理论基础及Python实现的相关文章

深度增强学习实践:让Python小程序玩一款游戏,来训练神经网络

我们这里要简要介绍一下增强学习(RL)--一种为了提高玩游戏效率的训练程序的通用技术.我们的目标是解释其实际实现:我们讲述一些基本理论,然后走马观花地看一下为玩<战舰>游戏而训练神经网络的最小python程序. 导言 增强学习[RL]技术是一种可用于提高效玩游戏效率的学习算法.与督导机器学习[ML]方法一样,增强学习是从数据--这里是指过去玩游戏的数据--中进行学习.然而,尽管督导学习算法只是根据现有的数据进行训练,但RL还挑战如何在收集数据的过程中表现良好性能.具体地说,我们所追求的设计原则

循环神经网络(RNN, Recurrent Neural Networks)介绍

循环神经网络(RNN, Recurrent Neural Networks)介绍    这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/,在这篇文章中,加入了一些新的内容与一些自己的理解.   循环神经网络(Recurrent Neural Networks,RNNs)已经在众多自然语言处理(Natural Language Proce

【榜单】GitHub 最受欢迎深度学习应用项目 Top 16(持续更新)

Neural Style Star:12122 Github 地址:https://github.com/jcjohnson/neural-style 这个项目是用 Torch 对 Leon A. Gatys, Alexander S. Ecker, 和 Matthias Bethge 等人的论文"A Neural Algorithm of Artistic Style"的一个实现.论文中提出一种算法,用卷积神经网络将一幅图像的内容与另一幅图像的风格进行组合.下面是一个将梵高<星

告别Python,用神经网络编写的软件走向2.0时代

有时人们把神经网络称为"机器学习工具箱中的另一种工具".有时你可以用它们来赢得Kaggle的比赛.但是,这种解释完全见木不见林.神经网络不只是另一种分类器,它们代表了我们如何编写软件的根本性转变的开始.可以说是软件的2.0时代.下文简称软件2.0. 我们所熟悉的软件1.0的"经典堆栈"是用Python.C++等语言编写的,它包含了程序员编写的计算机的显式指令.通过编写每行代码,程序员可以通过一些可取的行为来确定程序空间中的某个特定点. 相比之下,软件2.0是用神经网

一文详解神经网络 BP 算法原理及 Python 实现

  什么是梯度下降和链式求导法则 假设我们有一个函数 J(w),如下图所示. 梯度下降示意图 现在,我们要求当 w 等于什么的时候,J(w) 能够取到最小值.从图中我们知道最小值在初始位置的左边,也就意味着如果想要使 J(w) 最小,w的值需要减小.而初始位置的切线的斜率a > 0(也即该位置对应的导数大于0),w = w – a 就能够让 w 的值减小,循环求导更新w直到 J(w) 取得最小值.如果函数J(w)包含多个变量,那么就要分别对不同变量求偏导来更新不同变量的值. 所谓的链式求导法则,

神经网络常用激活函数对比:sigmoid VS sofmax(附python源码)

首发地址:https://yq.aliyun.com/articles/73661 更多深度文章,请关注:https://yq.aliyun.com/cloud Softmax函数与Sigmoid函数之间的区别 作者介绍: Saimadhu Polamuri:是一名自学成才的数据科学家,对数据科学有热爱和兴趣,他认为学习意味着生活,擅长使用python编程,业余时间在quora上回答问题. 领英:https://www.linkedin.com/in/saimadhu/ 博客:http://da

神经网络初学者指南:基于Scikit-Learn的Python模块

编者按:这个帖子概述了使用 Scikit-learn 在 Python 中设置神经网络的方法,其最新版本现在已经内置支持神经网络模型.作者 Jose Portilla 是一名数据科学顾问和培训师,目前在 Udemy 上教授在线课程. 他也是Pierian Data Inc.数据科学部门的主管.雷锋网(公众号:雷锋网)编译,未经许可不得转载. 对于 Python 来说,最受欢迎的机器学习图书馆是 SciKit Learn. 前几天最新版本(0.18)刚刚发布,现在已内置支持神经网络模型. 对 Py

一篇文章教你用 11 行 Python 代码实现神经网络

声明:本文是根据英文教程 A Neural Network in 11 lines of Python(用 11 行 Python 代码实现的神经网络)学习总结而来,关于更详细的神经网络的介绍可以参考我的另一篇博客:从感知机到人工神经网络. 如果你读懂了下面的文章,你会对神经网络有更深刻的认识,有任何问题,请多指教.   Very simple Neural Network 首先确定我们要实现的任务: 输出的为样本为 X 为 4*3,有 4 个样本 3 个属性,每一个样本对于这一个真实值 y,为

人工神经网络之Python 实战

引言:Python是最好最热门的编程语言之一,以简单易学.应用广泛.类库强大而著称,是实现机器学习算法的首选语言.本文以人工神经网络的实战为例,证明需要深入理解算法的原理.优劣势等特点以及应用场景,以能达到应用自如的程度.本文选自<Python大战机器学习:数据科学家的第一个小目标>. 在本次操作前,这里需要导入的包为: 感知机学习算法的原始形式 给出生成线性可分数据集的生成算法: 参数 ■n:正类的样本点数量,也是负类的样本点数量.总的样本点数量为2n. 返回值:所有的样本点组成的数组,形状