神经网络理论基础及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基于Socket实现的简单聊天程序示例
Aug 05 Python
python使用pycharm环境调用opencv库
Feb 11 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
Python设计模式之代理模式实例详解
Jan 19 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
python使用递归的方式建立二叉树
Jul 03 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 Python
深入理解Python 多线程
Jun 16 Python
python使用glob检索文件的操作
May 20 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
php实现微信企业转账功能
2018/10/02 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
js left,right,mid函数
2008/06/10 Javascript
javascript模仿msgbox提示效果代码
2008/06/10 Javascript
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
postman+json+springmvc测试批量添加实例
2018/03/31 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
Vertbaudet西班牙网上商店:婴儿服装、童装、母婴用品和儿童家具
2019/10/16 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
歌唱比赛获奖感言
2014/01/21 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript
Java Spring读取和存储详细操作
2022/08/05 Java/Android