神经网络理论基础及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调用新浪微博API项目实践
Jul 28 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 Python
Django如何自定义model创建数据库索引的顺序
Jun 20 Python
使用python进行广告点击率的预测的实现
Jul 04 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
django之自定义软删除Model的方法
Aug 14 Python
python迭代器常见用法实例分析
Nov 22 Python
如何通过Django使用本地css/js文件
Jan 20 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
python中tab键是什么意思
Jun 18 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
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
详解php用static方法的原因
2018/09/12 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
python利用datetime模块计算时间差
2015/08/04 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
Python多线程多进程实例对比解析
2020/03/12 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
自荐书范文范例
2014/02/13 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
检讨书范文500字
2015/01/28 职场文书
2015年暑期见闻
2015/07/14 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
python如何正确使用yield
2021/05/21 Python