(5)参数设置对神经网络性能的影响
我在实验中通过调整隐含层节点数,选择不通过的激活函数,设定不同的学习率,
<1>隐含层节点个数 隐含层节点的个数对于识别率的影响并不大,但是节点个数过多会增加运算量,使得训练较慢。
<2>激活函数的选择 激活函数无论对于识别率或收敛速度都有显著的影响。在逼近高次曲线时,S形函数精度比线性函数要高得多,但计算量也要大得多。
<3>学习率的选择 学习率影响着网络收敛的速度,以及网络能否收敛。学习率设置偏小可以保证网络收敛,但是收敛较慢。相反,学习率设置偏大则有可能使网络训练不收敛,影响识别效果。
3. 使用AForge.NET实现神经网络
(1) AForge.NET简介
AForge.NET是一个C#实现的面向人工智能、计算机视觉等领域的开源架构。AForge.NET源代码下的Neuro目录包含一个神经网络的类库。
AForge.NET主页:http://www.aforgenet.com/
AForge.NET代码下载:http://code.google.com/p/aforge/
Aforge.Neuro工程的类图如下:
图10. AForge.Neuro类库类图
下面介绍图9中的几个基本的类: Neuron — 神经元的抽象基类 Layer — 层的抽象基类,由多个神经元组成 Network —神经网络的抽象基类,由多个层(Layer)组成 IActivationFunction - 激活函数(activation function)的接口 IUnsupervisedLearning - 无导师学习(unsupervised learning)算法的接口ISupervisedLearning - 有导师学习(supervised learning)算法的接口
(2)使用Aforge建立BP神经网络
使用AForge建立BP神经网络会用到下面的几个类:
<1> SigmoidFunction : S形神经网络
构造函数:public SigmoidFunction( double alpha ) 参数alpha决定S形函数的陡峭程度。 <2> ActivationNetwork :神经网络类
构造函数:
public ActivationNetwork( IActivationFunction function, int inputsCount, params int[] neuronsCount ) : base( inputsCount, neuronsCount.Length ) public virtual double[] Compute( double[] input )
参数意义:
inputsCount:输入个数
neuronsCount :表示各层神经元个数
<3> BackPropagationLearning:BP学习算法
构造函数:
public BackPropagationLearning( ActivationNetwork network ) 参数意义: network :要训练的神经网络对象
BackPropagationLearning类需要用户设置的属性有下面2个:
learningRate :学习率
momentum :冲量因子
下面给出一个用AForge构建BP网络的代码。
// 创建一个多层神经网络,采用S形激活函数,各层分别有4,5,3个神经元
//(其中4是输入个数,3是输出个数,5是中间层结点个数)
ActivationNetwork network =
new ActivationNetwork( new SigmoidFunction(2), 4, 5, 3);// 创建训练算法对象
BackPropagationLearning teacher =
newBackPropagationLearning(network);// 设置BP算法的学习率与冲量系数
teacher.LearningRate =
0.1;teacher.Momentum =
0;int iteration =
1 ; // 迭代训练500次
while( iteration <
500 ) { teacher.RunEpoch( trainInput , trainOutput ) ; ++iteration ;}//使用训练出来的神经网络来分类,t为输入数据向量
network.Compute(t)[0] |