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


Posted in Python onDecember 15, 2017

一、多层前向神经网络

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

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

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

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

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

二、设计神经网络结构

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

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

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

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

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

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

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

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

三、交叉验证方法

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

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

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

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

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

四、BP算法

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

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

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

4.1、算法详细介绍

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

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

1、由输入层向前传送:

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

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

由输入层到隐藏层:

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

由隐藏层到输出层:

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

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

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

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

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

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

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

即每一层的输出为:

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

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

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

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

对于隐藏层:

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

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

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

偏向更新:

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

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模块

import numpy as np

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

def tanh(x):
  return np.tanh(x)
def tanh_deriv(x):
  return 1.0 - np.tanh(x)*np.tanh(x)
def logistic(x):
  return 1/(1 + np.exp(-x))
def logistic_derivative(x):
  return logistic(x)*(1-logistic(x))

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

class NeuralNetwork:
  def __init__(self, layers, activation='tanh'):
    """
    :param layers: A list containing the number of units in each layer.
    Should be at least two values
    :param activation: The activation function to be used. Can be
    "logistic" or "tanh"
    """
    if activation == 'logistic':
      self.activation = logistic
      self.activation_deriv = logistic_derivative
    elif activation == 'tanh':
      self.activation = tanh
      self.activation_deriv = tanh_deriv
 
    self.weights = []
    for i in range(1, len(layers) - 1):
      self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)
      self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)

实现算法

def fit(self, X, y, learning_rate=0.2, epochs=10000):
    X = np.atleast_2d(X)
    temp = np.ones([X.shape[0], X.shape[1]+1])
    temp[:, 0:-1] = X
    X = temp
    y = np.array(y)
 
    for k in range(epochs):
      i = np.random.randint(X.shape[0])
      a = [X[i]]
 
      for l in range(len(self.weights)):
        a.append(self.activation(np.dot(a[l], self.weights[l])))
      error = y[i] - a[-1]
      deltas = [error * self.activation_deriv(a[-1])]
 
      for l in range(len(a) - 2, 0, -1):
        deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))
      deltas.reverse()
 
      for i in range(len(self.weights)):
        layer = np.atleast_2d(a[i])
        delta = np.atleast_2d(deltas[i])
        self.weights[i] += learning_rate * layer.T.dot(delta)

实现预测

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

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

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

结果如下:

([0, 0], array([ 0.99738862]))
([0, 1], array([ 0.00091329]))
([1, 0], array([ 0.00086846]))
([1, 1], array([ 0.99751259]))

总结

以上就是本文关于神经网络理论基础及Python实现详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python服务器与android客户端socket通信实例
Nov 12 Python
在Django的模型中添加自定义方法的示例
Jul 21 Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
tensorflow建立一个简单的神经网络的方法
Feb 10 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
对python添加模块路径的三种方法总结
Oct 16 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
May 04 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
浅谈机器学习需要的了解的十大算法
Dec 15 #Python
python实现协同过滤推荐算法完整代码示例
Dec 15 #Python
python3大文件解压和基本操作
Dec 15 #Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 #Python
numpy自动生成数组详解
Dec 15 #Python
Python3实现发送QQ邮件功能(附件)
Dec 23 #Python
numpy排序与集合运算用法示例
Dec 15 #Python
You might like
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
php中用数组的方法设置cookies
2011/04/21 PHP
PHP实现的连贯操作、链式操作实例
2014/07/08 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
JavaScript常用标签和方法总结
2015/09/01 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
python绘图方法实例入门
2015/05/19 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
python构建深度神经网络(DNN)
2018/03/10 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
《中华少年》教学反思
2014/02/15 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技