首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

bp神经网络及matlab实现 (3)

bp神经网络及matlab实现 (3)

(1) newff函数
<1>newff函数语法
       newff函数参数列表有很多的可选参数,具体可以参考Matlab的帮助文档,这里介绍newff函数的一种简单的形式。
语法:net = newff ( A, B, {C} ,‘trainFun’)
参数:
A:一个n×2的矩阵,第i行元素为输入信号xi的最小值和最大值;
B:一个k维行向量,其元素为网络中各层节点数;
C:一个k维字符串行向量,每一分量为对应层神经元的激活函数
trainFun :为学习规则采用的训练算法
<2>常用的激活函数
  常用的激活函数有:
  a) 线性函数 (Linear transfer function)

f(x) = x

  该函数的字符串为’purelin’。


b) 对数S形转移函数( Logarithmic sigmoid transfer function )


    该函数的字符串为’logsig’。
c) 双曲正切S形函数 (Hyperbolic tangent sigmoid transfer function )


  也就是上面所提到的双极S形函数。

  该函数的字符串为’ tansig’。
  Matlab的安装目录下的toolbox\nnet\nnet\nntransfer子目录中有所有激活函数的定义说明。
<3>常见的训练函数
    常见的训练函数有:
traingd :梯度下降BP训练函数(Gradient descent backpropagation)
traingdx :梯度下降自适应学习率训练函数
<4>网络配置参数
一些重要的网络配置参数如下:
net.trainparam.goal  :神经网络训练的目标误差
net.trainparam.show   : 显示中间结果的周期
net.trainparam.epochs  :最大迭代次数

net.trainParam.lr    : 学习率

(2) train函数
    网络训练学习函数。
语法:[ net, tr, Y1, E ]  = train( net, X, Y )
参数:
X:网络实际输入
Y:网络应有输出
tr:训练跟踪信息
Y1:网络实际输出
E:误差矩阵
(3) sim函数
语法:Y=sim(net,X)
参数:
net:网络
X:输入给网络的K×N矩阵,其中K为网络输入个数,N为数据样本数
Y:输出矩阵Q×N,其中Q为网络输出个数
(4) Matlab BP网络实例
       我将Iris数据集分为2组,每组各75个样本,每组中每种花各有25个样本。其中一组作为以上程序的训练样本,另外一组作为检验样本。为了方便训练,将3类花分别编号为1,2,3 。
  使用这些数据训练一个4输入(分别对应4个特征),3输出(分别对应该样本属于某一品种的可能性大小)的前向网络。

       Matlab程序如下:

%读取训练数据[f1,f2,f3,f4,class] = textread('trainData.txt' , '%f%f%f%f%f',150);%特征值归一化[input,minI,maxI] = premnmx( [f1 , f2 , f3 , f4 ]')  ;

%构造输出矩阵s = length( class) ;output = zeros( s , 3  ) ;for i =
1 : s    output( i , class( i )  ) =
1 ;end%创建神经网络net = newff( minmax(input) , [10
3] , { 'logsig'
'purelin' } , 'traingdx' ) ; %设置训练参数net.trainparam.show =
50 ;net.trainparam.epochs =
500 ;net.trainparam.goal =
0.01 ;net.trainParam.lr =
0.01 ;%开始训练net = train( net, input , output' ) ;

%读取测试数据[t1 t2 t3 t4 c] = textread('testData.txt' , '%f%f%f%f%f',150);%测试数据归一化testInput = tramnmx ( [t1,t2,t3,t4]' , minI, maxI ) ;

%仿真Y = sim( net , testInput ) %统计识别正确率[s1 , s2] = size( Y ) ;hitNum = 0 ;for i =
1 : s2    [m , Index] = max( Y( : ,  i ) ) ;    if( Index  == c(i)   )         hitNum = hitNum +
1 ;     endendsprintf('识别率是 %3.3f%%',100
* hitNum / s2 )




  以上程序的识别率稳定在95%左右,训练100次左右达到收敛,训练曲线如下图所示:

图9. 训练性能表现

继承事业,薪火相传
很好的文章,感谢楼主的分享
返回列表