标题:
bp神经网络及matlab实现 (3)
[打印本页]
作者:
yuyang911220
时间:
2016-8-8 09:56
标题:
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. 训练性能表现
作者:
yuchengze
时间:
2016-8-21 14:58
很好的文章,感谢楼主的分享
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0