智能系统作业(二)

智能系统作业(二)前言如果需要matlab生成的数据文件可以联系博主,这些数据文件都可以通过以下的代码自动生成

前言

未经允许,不得擅自使用转载和复制。
如果需要matlab生成的数据文件可以联系博主,这些数据文件都可以通过以下的代码自动生成。
感谢老铁们对今样的支持,2021一路有你,2022我们继续加油!你的肯定是我最大的动力

1.作业题目

根据所学过的BP网络设计及改进方案设计实现模糊控制规则T=int((e+ec)/2)的模糊神经网络控制器。其中输入变量e和ec的变化范围分别是:e=int[-2,2],ec=int[-2,2]。网络设计的目标误差为emin=0.001。设计要求为:

  1. 输入、输出矢量及问题的阐述

  2. 给出网络结构

  3. 学习方法(包括所采用的改进方法)

  4. 初始化及必要的参数选取

  5. 最后的结果,循环次数,训练时间,其中着重讨论:
    a)不同隐含层S1时的收敛速度与误差精度的对比分析;
    b)在S1设置为较好的情况下,在训练过程中取始终不变的学习速率lr值时,对固定学习速率lr取不同值时的训练时间,包括稳定性进行观察 比较;
    c)当采用自适应学习速率时,与单一固定的学习速率lr中最好的情况进行对比训练的观察;
    d)给出结论或体会

  6. 验证,采用插值法选取多于训练时的输入,对所设计的网络进行验证,给出验证的A与T值。

2.答案

①输入、输出矢量及问题的阐述

已知模糊控制规则T=int((e+ec)/2),其中e={-2,2},ec={-2,2}。即BP网络的输入矢量为

P=[-2  -2 -2 -2 -2 -1 -1 -1 -1 -1  0  0  0  0  0  1  1  1  1  1  2  2  2  2  2
   -2  -1  0  1  2 -2 -1  0  1  2 -2 -1  0  1  2 -2 -1  0  1  2 -2 -1  0  1  2 ]

通过模糊控制规则,则输出矢量为

T=[-2 -2 -1 -1 0 -2 -1 -1 0 0 -1 -1 0 0 1 -1 0 0 1 1 0 0 1 1 2]

对问题的阐述:通过bp网络及其改进方案来实现模糊控制规则T=int((e+ec)/2),通过给定了两个输入e和ec,我们知道对于e和ec的全组合共有5*5=25组,其输出通过控制规则输出了一组T,因此输入节点有两个,输出节点有一个。确定了输入和输出节点以后,题中给出了最后训练的误差emin应当小于0.001。其次确定神经网络的层数和隐含层的神经节点数,最后通过设定初始化参数,通过网络对输入和输出进行学习即可。

②给出网络结构

一般来说具有偏差和至少一个S型隐含层和一个线性输出层的网络能逼近任何有利的函数,因此在这里网络结构采用三层网络结构,一层输入层,一层隐含层和一层输出层。隐含层采用S型激活函数,输出层采用线性激活函数。

③学习方法(包括所采用的改进方法)

学习方法采用bp网络,梯度下降法加后续的优化算法。通过完成下面的实验后已经确定了对应的W和B。我对多种改进算法进行了测试并取最优的值进行比较。结果如下所示:

函数 算法描述 SSE Epochs Times
traingd 标准梯度下降法(标准BP算法) 0.000995 464 0.623
traingda 变学习速率的BP算法 0.000999 564 0.503
traingdm 附加动量的BP算法 0.000999 986 0.778
traincgf Fletcher_powell共轭梯度法 0.000863 39 0.113
traincgp Polak_Ribiere共轭梯度法 0.000912 63 0.15
trainbfg BFGs拟牛顿法 0.000965 26 0.118
trainlm Levenberg_Marquardt法 0.000281 3 0.052
trainrp 弹性BP算法 0.000982 123 0.163

④初始化及必要的参数选取

初始化的时候主要是设置了输入层、隐含层、输出层的节点数,并通过rands()函数获取到对应的W和B的初始值进行训练,通过newff来创建两层的前向BP网络,隐含层采用tansig激活函数,输出层采用purelin线性激活函数,并设置最大训练次数为10000次,目标误差为0.001

⑤最后的结果,循环次数,训练时间:

第五点主要从以下几个方面进行讨论:

a)不同隐含层S1时的收敛速度与误差精度的对比分析;

对于隐含层S1的个数的选取我们进行如下的实验,在保证初始值、激活函数及学习速率相同的情况下来改变。实验分别使S1从5-25依次训练并记录误差平方和。由于还不知道最佳的学习速率,因此在多次测试后发现在lr=0.01-0.02时学习速率过小导致改变S1的个数后对误差平方和和时间的影响较小。如图所示,在训练后期收敛速度缓慢。
在这里插入图片描述
在lr>=0.19时会出现不同程度的振荡甚至发散,如下图所示,其误差最小值往往在振荡的过程当中或最后稳定的值。
在这里插入图片描述
因此在确保其他条件相同的情况下,本次实验取lr分别为0.05,0.12,0.18来进行分别测试,其中对应每一个S1和lr的网络训练均训练十次。在得出对应的测试数据以后,我们取每十次中训练情况最好的一次进行比较。以下是我对数据分析所得到的的图表。在这里我才用的纵坐标分别为网络训练次数和训练的时间,当训练次数小于10000次时表示误差已经达到预定的最小误差,那么训练时间就是衡量S1个数的参照,从这里的图表中我们可以清晰的看到在分别对应不同的学习速率的时候其最合适的S1也是不同的,在lr=0.05时我们可以看到最优的S1个数在16个左右,其主要的原因大概是学习速率较小时,较大的隐含层神经节点数能够较快的逼近最优的W和B,而当学习速率达到0.12和0.18时,我们可以看到当S1=17时,网络所训练的时间差不多已经到达最优解,当S1数量继续增加时训练时间可能还会稍微下降,但是其效果没有那么明显。相对比在S1的数目为12-14个的时候,S1的数目为17时,所花费的训练时间为其一半甚至更少,当训练的组数较少时可能对比不明显,但是若训练的数据非常大时,优化一半以上的性能相比较增加5个节点数而言我认为可以接收。具体的训练数据请参考表一和表二。因此在本次的实验中我具体采用的最优的S1的个数为17个。因为在学习速率lr=0.18时,当S1个数大于19后网络发散,因此只记录到S1=19

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在下图我们可以看到对应三种不同学习速率时隐含层节点数对误差SSE的影响,当隐含层节点数增加的时候对应的SSE误差减小,因为在这里设置了当误差到达0.001时即停止训练,因此在本图中最小的误差均为0.001.

在这里插入图片描述

b)在S1设置为较好的情况下,在训练过程中取始终不变的学习速率lr值时,对固定学习速率lr取不同值时的训练时间,包括稳定性进行观察比较;

我们在本次实验中设定的较好的S1的个数为17个,已知当学习速率lr>0.18时,网络会部分发散,而lr=0.05时学习速率适中偏慢。因此在这里我设置的lr=[0.03,0.18],同样对应每一个lr和S1均训练10次,取每组最好的数据进行比较。从下图的数据显示当学习速率lr=0.12-0.14时训练时间最少,当继续增加学习速率时,训练时间先增加后减少,当lr=0.18时训练时间相差不大。当时在观察网络训练中的稳定性的时候我们可以看到当lr在0.03-0.14之间时误差曲线先快后慢下降,曲线平滑。当lr>=0.15时,网络开始出现振荡,主要表现在误差曲线会在训练的开始或中间阶段出现振荡。因此在本次实验中我主要挑选lr=0.12为最佳的学习速率
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

c)当采用自适应学习速率时,与单一固定的学习速率lr中最好的情况进行对比训练的观察;

我们采用自适应学习速率的时候就不用设置net.trainParam.lr,只需要将训练函数改为traingda,即自适应学习率的t梯度下降反向传播算法。通过比较自适应学习速率和电仪固定的学习速率lr=0.12时的情况,我们可以看到在大多数的情况下自适应学习速率所训练的网络所消耗的时间小于固定学习速率的时间。
在这里插入图片描述

d)给出结论或体会

从以上的实验中我也学到了很多的知识,具体的包含以下几点:

  • 当学习速率取不同值的时候,最优的隐含层节点数的范围也会不断的变化
  • 当固定学习速率的时候,增加隐含层节点数也会导致网络发散
  • 即使是对每一种情况(固定学习速率固定隐含层节点数)训练十次也无法保证包含到了最后的情况,因此以上的数据可能还存在一些误差。
  • 自适应学习速率普遍优于固定的学习速率
  • 对于现在的计算机而言,增加隐含层节点数感觉对时间的影响没有很大(可能我设置的S1还不是很大,看书上可能15个隐含层节点数就很多了,我已经跑到了25个也没有太大的影响)
  • 通过本次实验最优的lr和S1分别为0.12和17个。
  • 即使在全部的W和B以及其他参数相同的情况下,对于bp网络每次训练所需的时间也是不同的

⑥验证,采用插值法选取多于训练时的输入,对所设计的网络进行验证,给出验证的A与T值。

验证当差值等于训练时的数据的时候,
对应的A和T如下图所示,误差为9.9572e-04。满足要求。
在这里插入图片描述
验证当差值大于训练时的数据的时候,
对应的A和T如下图所示,误差为0.0490。误差不满足要求,主要是在训练时对非整数的情况没有训练。
在这里插入图片描述

3.附录代码

  1. 最简单的单次运行代码
%输入矢量,输入节点为2
P=[-2 -2 -2 -2 -2 -1 -1 -1 -1 -1 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2;
    -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2];	   
%输出矢量    
T=[-2 -2 -1 -1 0  -2 -1 -1 0 0  -1 -1 0 0 1 -1  0  0 1 1 0 0 1 1 2]; 
[R, Q]=size(P);
[S2, Q]=size(T);
 
%初始化网络结构和参数
%隐含层节点数,需要修改调整的参数
%输出层采用线性激活函数,隐含层采用S型正切函数
S1 = 17;
W1 = rands(S1,R)
B1 = rands(S1,1)
W2 = rands(S2,S1)
B2 = rands(S2,1)
%创建两层前向回馈网络,梯度下降法
net=newff(minmax(P),[S1,1],{ 
   'tansig','purelin'},'traingd'); 
%初始化训练次数
net.trainParam.epochs=10000; 
net.trainParam.goal=0.001;  
%net.trainParam.mc=0.9;
%调整学习速率
net.trainParam.lr=0.12;
%训练网络,tr是训练参数
[net,tr]= train(net,P,T); 
Y = sim(net,P); 
 %查看训练时间
t=tr.time(end)
%计算均方差
SSE = perform(net,T,Y);
train_num = tr.num_epochs;
  1. 加入循环和文件读写后的matlab代码
%输入矢量,输入节点为2
P=[-2 -2 -2 -2 -2 -1 -1 -1 -1 -1 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2;
    -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2];	   
%输出矢量    
T=[-2 -2 -1 -1 0  -2 -1 -1 0 0  -1 -1 0 0 1 -1  0  0 1 1 0 0 1 1 2]; 
[R, Q]=size(P);
[S2, Q]=size(T);
 
%初始化网络结构和参数
%隐含层节点数,需要修改调整的参数
%输出层采用线性激活函数,隐含层采用S型正切函数
%atest设置的为文档下导出数据的excel表格的头
atest={ 
   'lr','S1','SSE','train_num','time'};
%调整学习速率连续训练。
for speed = 0.16:0.01:0.18
    S1 = 17;
    %读取excel表中数据的信息,目的是为了使数据从上一次存入后不断往后写
    [num, text, raw] = xlsread('homework.xlsx');
    [rowN, columnN]=size(raw);

    for i = 1:10
    W1 = rands(S1,R);
    B1 = rands(S1,1);
    W2 = rands(S2,S1);
    B2 = rands(S2,1);
    %创建两层前向回馈网络,梯度下降法
    net=newff(minmax(P),[S1,1],{ 
   'tansig','purelin'},'traingd'); 
    %初始化训练次数
    net.trainParam.epochs=10000; 
    net.trainParam.goal=0.001;  
    %net.trainParam.mc=0.9;
    %调整学习速率
    net.trainParam.lr=speed;
    %训练网络,tr是训练参数
    [net,tr]= train(net,P,T); 
    Y = sim(net,P); 
     %查看训练时间
    t=tr.time(end);
    %计算均方差
    SSE = perform(net,T,Y);
    train_num = tr.num_epochs;
    atest = [atest;{ 
   net.trainParam.lr},{ 
   S1},{ 
   SSE},{ 
   train_num},{ 
   t}];
    end
end
xlsRange=['A',num2str(rowN+1)];
%将数据写入同目录下的'homework.xlsx'文件中
xlswrite('homework.xlsx',atest,2,xlsRange);
  1. 插值法验证代码
P1 = zeros();
T1 = zeros();
e1 = -2:0.5:2;
ec1 = -2:0.5:2;
for i=1:5
    for j=1:9
        r = (i-1)*9+j;
        P1(1,r)=e1(i);
        P1(2,r)=ec1(j);
        T1(r)=floor((e1(i)+ec1(j))/2);
    end
end
P1  %查看输入
T1  %查看输出
A = sim(net,P1)
error = perform(net,T1,A)  %计算误差

❤OK啦,觉得有用的点个赞吧!!!


今天的文章智能系统作业(二)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/67792.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注