文章目录
- 1. 人工神经网络简介
- 1.1 生物神经网络
- 1.2 人工神经网络
- 2. 人工神经网络原理
- 2.1 ANN的基本构造
- 2.1.1 神经元的结构模型
- 2.1.2 网络拓扑结构
- 2.2 学习规则
- 2.3 学习算法
- 3. 人工神经网络特点
- 4. 人工神经网络的Python应用
- 5. 源码仓库地址
1. 人工神经网络简介
1.1 生物神经网络
人工神经网络的灵感来自其生物学对应物。生物神经网络使大脑能够以复杂的方式处理大量信息。大脑的生物神经网络由大约1000亿个神经元组成,这是大脑的基本处理单元。神经元通过彼此之间巨大的连接(称为突触)来执行其功能。
人体神经元模型如下图所示:
- 接收区(receptive zone):树突接收到输入信息。
- 触发区(trigger zone):位于轴突和细胞体交接的地方,决定是否产生神经冲动。
- 传导区(conducting zone):由轴突进行神经冲动的传递。
- 输出区(output zone):神经冲动的目的就是要让神经末梢,突触的神经递质或电力释出,才能影响下一个接受的细胞(神经元、肌肉细胞或是腺体细胞),此称为突触传递。
1.2 人工神经网络
人工神经网络定义为:人工神经网络是一种由具有自适应性的简单单元构成的广泛并行互联的网络,它的组织结构能够模拟生物神经系统对真实世界所做出的交互反应。
人工神经网络的结构如下图所示:
- 输入层:输入层接收特征向量 x 。
- 输出层:输出层产出最终的预测 h 。
- 隐含层:隐含层介于输入层与输出层之间,之所以称之为隐含层,是因为当中产生的值并不像输入层使用的样本矩阵 X 或者输出层用到的标签矩阵 y 那样直接可见。
人工神经网络由一个输入层和一个输出层组成,其中输入层从外部源(数据文件,图像,硬件传感器等)接收数据,一个或多个隐藏层处理数据,输出层提供一个或多个数据点基于网络的功能。根据不同的问题,可以加入多个隐藏层,由图中这种全连接改为部 分连接,甚至是环形连接等。
2. 人工神经网络原理
人工神经网络的强大之处在于,它拥有很强的学习能力。在得到一个训练集之后,它能通过学习提取所观察事物的各个部分的特征,将特征之间用不同网络节点连接,通过训练连接的网络权重,改变每一个连接的强度,直到顶层的输出得到正确的答案。
神经网络算法大致过程如下:
第一步,我们要预先设定一种网络结构和激活函数,这一步其实很困难,因为网络结构可以无限拓展,要知道什么样的结构才符合我们的问题需要做大量的试验。
第二步,初始化模型中的权重。模型中的每一个连接都会有一个权重,在初始化的时候可以都随机给予一个值。
第三步,就是根据输入数据和权重来预测结果。由于最开始的参数都是随机设置的,所以获得的结果肯定与真实的结果差距比较大,所以在这里要计算一个误差,误差反映了预测结果和真实结果的差距有多大。
最后一步,模型要调节权重。这里我们可以参与的就是需要设置一个“学习率”,这个学习率是针对误差的,每次获得误差后,连接上的权重都会按照误差的这个比率来进行调整,从而期望在下次计算时获得一个较小的误差。经过若干次循环这个过程,我们可以选择达到一个比较低的损失值的时候停止并输出模型,也可以选择一个确定的循环轮次来结束。
2.1 ANN的基本构造
人工神经网络是许多神经元经联接而成的网络结构。因此,ANN的构造有两层含义:1. 神经元的结构;2. 网络互联结构(拓扑结构)。
2.1.1 神经元的结构模型
根据前面对生物神经元的分析,应具有以下特点:
(a) 神经元是一个多输入、单输出的元件。
(b) 神经元是一个具有非线性输入/输出特性的元件。表现在只有当来自各神经突触的活动电位达到一定强度后,该神经才能被激活,释放出神经传递化学物质,发出本身的活动电位脉冲。
(c) 神经元的连接具有可塑性,表现在其活动电位脉冲的传递强度依靠神经传递化学物质的释放量及突触间隙的变化量,可以进行调节。
(d) 神经元的输出响应,是各个输入的综合结果。
2.1.2 网络拓扑结构
网络拓扑结构即神经元的联接形式,从大的方面来看,ANN网络拓扑结构可分为层次结构、模块结构和层次模块结构等几种。
1.层次结构:神经元的联接按层次排列。
2.模块结构:主要特点是将整个网络按功能划分为不同的模块,每个模块内部的神经元紧密互联,并完成各自特定的功能,模块之间再互联以完成整体功能。
3.层次模块结构:将模块结构和层次结构结合起来,使之更接近人脑神经系统的结构,这也是目前为人们广泛注意的一种新型网络互联模式。
根据网络中神经元的层数不同,可将神经网络分为单层网络和多层网络;
根据同层网络神经元之间有无相互联接以及后层神经元与前层神经元有无反馈作用的不同,可将神经网络分为以下多种。
(a)前向网络: 网络中的神经元分层排列,每个神经元只与前一层神经元相连,层间神经元无连接。最上一层为输出层,最下一层为输入层,中间层称为隐层。
(b)从输出到输入有反馈的前向网络: 从输出到输入有反馈环节的前向网络。
(c)层内互连前向网络: 通过层内神经元的相互连接,可以实现同一层神经元间的相互制约,从而可以将层内神经元分为几组,让每组作为一个整体来动作。
(d)互连网络:分为局部互连和全互连两种。全互连网络中每个神经元的输出都与其他神经元相连;而局部互连网络中,有些神经元间没有连接关系。
2.2 学习规则
神经网络要能工作必须首先进行学习,学习规则多种多样,一般可以归结为以下两类:
(1)有指导学习:不但需要学习用的输入事例(训练样本,通常为一矢量),同时还要求与之对应的表示所需期望输出的目标矢量。进行学习时,首先计算一个输入矢量的网络输出,然后同相应的目标输出比较,比较结果的误差用来按规定的算法改变加权。
(2)无指导学习:不要求有目标矢量,网络通过自身的“经历”来学会某种功能,在学习时,关键不在于网络实际输出是否与外部的期望输出相一致,而在于调整权重以反映学习样本的分布,因此整个训练过程实质是抽取训练样本集的统计特性。特别适用于对未知事物的研究。
工程实践中,有指导学习和无指导学习并不是相互冲突的,目前已经出现了一些融合有指导学习和无指导学习的训练算法。如在应用有指导学习训练一个网络后,再利用一些后期的无指导学习来使得网络自适应于环境的变化。
2.3 学习算法
学习算法是人工神经网络研究的主要内容和中心环节,许多性能各异的神经网络的差异也主要体现在学习算法的不同上,同时,对于神经网络学习算法也是至今人们研究得最多的一个方面。
截止目前,人们已先后提出了误差反向传播算法(BP算法)、Hopfield算法、自适应共振理论算法(ART算法)、自组织特征映射算法(Kohonen算法)等。
误差反向传播算法简称BP算法,它是Werbos等人提出的一个有监督训练的多层神经网络算法。在网络学习阶段,其每一个训练范例在网络中经过两个方向的传递计算。一遍向前传播计算,从输入层开始传递至各层,经过处理后产生一个输出,由此可得到一个该实际输出与其理想输出之差的误差矢量;此后,再进行反向传播计算,即从输出层开始至输入层结束,根据误差矢量并以一定的速度对各权值依次进行修正。
BP算法有很强的数学基础,扩展了神经网络的应用范围,已有许多成功的应用实例,对神经网络研究的再次兴起起过很大作用。
3. 人工神经网络特点
优点:
(1)具有自学习功能 。
(2)具有联想存储功能。
(3)具有高速寻找优化解的能力。
缺点:
(1)神经网络需要大量数据,非常消耗资源,开销也非常大的,而且训练时间长,还需要耗费很大的人力物力。
(2)神经网络在概括方面很不好。
(3)神经网络是不透明的。
4. 人工神经网络的Python应用
在 Scikit 中神经网络被称为多层感知器(Multi-layer Perceptron),它可以用于分类或回归的非线性函数。用于分类的模块是 MLPClassifier,而用于回归的模块则是 MLPRegressor。
MLPClassifier 主要用来做分类,下面用 MLPClassifier 在鸢尾花数据上做测试。其函数原型如下:
clf = MLPClassifier(solver=’sgd’,activation=’relu’,alpha=1e-4,hidden_layer_sizes=(50,50),random_state=1,max_iter=10,verbose=10,learning_rate_init=.1)
参数说明:
hidden_layer_sizes:例如hidden_layer_sizes=(50, 50),表示有两层隐藏层,第一层隐藏层有50个神经元,第二层也有50个神经元。
Activation:{‘identity’, ‘logistic’, ‘tanh’, ‘relu’},默认‘relu’。
solver: {‘lbfgs’, ‘sgd’, ‘adam’}, 默认adam,用来优化权重。
alpha:float,可选的,默认0.0001,正则化项参数。
learning_rate:学习率,用于权重更新,只有当solver为’sgd’时使用,{‘constant’,’invscaling’, ‘adaptive’},默认constant。
random_state:int 或RandomState,可选,默认None,随机数生成器的状态或种子。
max_iter:int,可选,默认200,最大迭代次数。
verbose:bool, 可选,默认False,是否将过程打印到stdout。
测试代码如下:
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris() # 导入数据集
X = iris['data'] # 获取自变量数据
y = iris['target'] # 获取因变量数据
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.2) # 分割训练集和测试集
clf = MLPClassifier(solver='adam', alpha=1e-5, \
hidden_layer_sizes=(3,3), random_state=1,max_iter=100000,) # 创建神经网络分类器对象
clf.fit(X, y) # 训练模型
clf.score(X_test,y_test) # 模型评分
结果如下:
score= 0.9666666666666667
5. 源码仓库地址
🌼 图像处理、机器学习的常用算法汇总