神经网络理论基础及Python实现的内容详解
- 更新时间:2020-07-28 09:38:06
- 编辑:吴承恩
一、多层前向神经网络
多层前向神经网络由三部分组成:输出层、隐藏层、输出层,每层由单元组成;
输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层;
除去输入层之外,隐藏层和输出层的层数和为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-foldcrossvalidation,即每一次选择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模块
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实现机械分词之逆向最大匹配算法代码示例
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
相关教程
-
基于循环神经网络(RNN)的古诗生成详细写法代码
这篇文章主要为大家详细介绍了基于循环神经网络(RNN)的古诗生成器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
发布时间:2020-07-17
-
TensorFlow实现卷积神经网络基础知识点
这篇文章主要为大家详细介绍了TensorFlow实现卷积神经网络,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
发布时间:2019-11-22
-
Python实现八皇后问题实例代码分析
这篇文章主要给大家介绍了关于利用Python实现八皇后问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学
发布时间:2019-09-01
-
Mac用python实现简单的目录树展示实例讲解
今天小编就为大家分享一篇在Mac下使用python实现简单的目录树展示方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
发布时间:2019-06-07
-
Python实现网页截图的实例
这篇文章主要介绍了Python实现网页截图(PyQT5)过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
发布时间:2020-02-25
-
实例解析Python实现动态加载模块、类、函数的方法
这篇文章主要介绍了Python实现动态加载模块、类、函数的方法,结合实例形式分析了Python动态加载模块、类及函数的实现方法及操作技巧,需要的朋友可以参考下
发布时间:2020-02-10
-
怎么用python实现简单的文字识别
这篇文章主要为大家详细介绍了基于百度云文字识别API,python实现的简单文字识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
发布时间:2020-02-26
-
python实现剪切功能
这篇文章主要为大家详细介绍了一段python代码编写实现的剪切功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
发布时间:2019-12-04
-
python实现读取并显示图片的方法以及实例演示
在本篇文章里我们给大家详细通过实例总结了python实现读取并显示图片的方法,有需要的朋友们可以学习测试下。
发布时间:2018-10-29
-
实例详解Python实现排列组合、破解密码算法
这篇文章主要介绍了Python实现的排列组合、破解密码算法,结合实例形式分析了Python排列组合、密码破解相关数学运算操作技巧,需要的朋友可以参考下
发布时间:2020-01-09
-
Python实现插入排序算法示例效果
这篇文章主要介绍了Python实现的直接插入排序算法,结合实例形式分析了Python直接插入排序算法的定义与使用相关操作技巧,代码备有较为详尽的注释便于理解,需要的朋友可以参考下
发布时间:2020-01-27
-
实例详解Python实现数据结构线性链表(单链表)算法
这篇文章主要介绍了Python实现数据结构线性链表(单链表)算法,结合实例形式分析了Python单链表的定义、节点插入、删除、打印等相关操作技巧,需要的朋友可以参考下
发布时间:2020-01-27
-
深度学习:卷积神经网络从入门到精通
大小:223.4 MB深度学习电子书
-
卷积神经网络的Python实现
卷积神经网络是深度学习重要的模型之一。本书是卷积神经网络领域的入门读物,假定读者不具备任何机器学习知识。书中尽可能少地使用数学知识,从机器学习的概念讲起,以卷积神经网络的zui新发展结束。 本书首先简单介绍了机器学习的基本概念,详细讲解了线性模型、神经网络和卷积神经网络模型,然后介绍了基于梯度下降法的优化方法和梯度反向传播算法,接着介绍了训练网络前的准备工作、神经网络实战、卷积神经网络的应用及其发展。针对
大小:8455 MB MB神经网络
-
Python神经网络编程
这是一本自己动手用Python编写神经网络的力作,详细介绍了理解神经网络如何工作所必须的基础知识,并介绍了所需的微积分知识和树莓派知识,欢迎下载
大小:11.5 MBPython编程电子书
-
图解深度学习与神经网络
本书是以TensorFlow 为工具介绍神经网络和深度学习的入门书,内容循序渐进,以简单示例和图例的形式,展示神经网络和深度学习背后的数学基础原理,帮助读者更好地理解复杂抽象的公式。
大小:174.5 MBTensorFlow电子书
-
神经网络编程实战:Java语言实现
大小:51.2 MB神经网络电子书
-
神经网络与深度学习应用实战
本书结合实际应用介绍神经网络和深度学习等技术领域相关信息。从结构上重点介绍了前馈型神经网络、反馈型神经网络,以及自组织竞争型神经网络,并针对当下深度学习中比较重要的网络进
大小:112.5 MB神经网络电子书
-
神经网络算法与实现:基于Java语言
本书结合Java编程语言,由浅入深地介绍了神经网络算法的应用,涉及神经网络的构建、神经网络的结构、神经网络的学习、感知机、自组织映射等核心概念,适合对神经网络技术感兴趣的开发人员和业余读者阅读
大小:32 MB神经网络电子书