其它神经网络

【测试】traingdxElman的测试Demo

作者 : 老饼 发表日期 : 2023-08-10 18:19:56 更新日期 : 2023-08-14 16:01:35
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com




本代码用于测试《traingdxElman.m》的使用Demo

同时也测试traingdxElman.m的结果是否与matlab的工具箱"newelm"的训练结果(默认使用的是traingdx训练方法)是否一致




   01. traingdxElman的测试Demo  



本节展示traingdxElman的测试Demo代码及对代码进行简要说明



    代码简要解说    


DEMO代码主要干的事情如下:
 👉1. 先用工具箱训练一个两隐层的神经网络                              
👉2. 再用自写代码traingdxElman训练一个两隐层的神经网络

然后分别打印工具箱的训练结果,与traingdxElman的训练结果





      traingdxElman的使用与测试Demo    


% ---------数据生成与参数预设-------------
% 生成输入输出数据
X  = [-1:0.2:1;-1:0.2:1];
y = [sin(X( 1,:)) + X( 2,:);sin(X( 1,:).*X( 1,:)) + 0.5*X( 2,:)];
% 数据归一化
X = 2*(X-repmat(min(X,[],2),1,size(X,2)))./(repmat(max(X,[],2)-min(X,[],2),1,size(X,2)))-1;
y = 2*(y-repmat(min(y,[],2),1,size(y,2)))./(repmat(max(y,[],2)-min(y,[],2),1,size(y,2)))-1;

% 参数预设
hnn       = [5,4];                                      % 隐节点个数(hideNodeNum)
tf        = {'tansig','tansig','purelin'};              % 各层的激活函数
maxStep   = 100;                                        % 最大训练步数
goal      = 0.00001;                                    % 目标误差

%---------调用自写函数进行训练--------------
rand('seed',70);
[W,B,erc] = traingdxElman(X,y,hnn,tf,goal,maxStep);     % 网络训练
py        = predictElman(W,B,tf,X);                     % 网络预测


disp('-------自写代码初始化的权重和阈值-------')
W21 = W{1,2}                                             % 第1层(输入层)到第2层(隐层)的权值
Wd2 = W{2,2}                                             % 第2层(隐层)的延迟权重
B2  = B{2}                                               % 第2层(隐层)的阈值
W32 = W{2,3}                                             % 第2层到第3层的权值
Wd3 = W{3,3}                                             % 第3层(隐层)的延迟权重
B3  = B{3}                                               % 第3层的阈值
W43 = W{3,4}                                             % 第3层(输入层)到第4层(输出层)的权值
B4  = B{4}                                               % 第4层(输出层)的阈值
% 

% ---------------调用工具箱,与工具箱的结果比较--------------------
rand('seed',70);
net  = newelm(X,y,hnn,tf);                               % 新建一个elman网络

%设置训练参数
net.trainparam.goal        = goal;                       % 训练目标
net.trainparam.epochs      = maxStep;                    % 最大训练次数.
net.divideParam.trainRatio = 1;                          % 全部数据用于训练
net.divideParam.valRatio   = 0;                          % 关掉泛化验证数据
net.divideParam.testRatio  = 0;                          % 关掉测试数据

% 网络训练
Xseq = con2seq(X);                                       % 将输入转成序列格式
Yseq = con2seq(y);                                       % 将输出转成序列格式
[net,tr] = train(net,Xseq,Yseq);                         % 将输入输出数据进行训练
py_tool  = sim(net,Xseq);                                % 用训练好的网络进行预测
py_tool  = cell2mat(py_tool);                            % 将预测结果转为矩阵格式
cc = tr.perf';

disp('------matlab工具箱训练后的权重和阈值-------')
w21      =  net.iw{1,1}                                  % 第1层(输入层)到第2层(隐层)的权值
wd2      =  net.lw{1,1}                                  % 第2层(隐层)的延迟权重
b2       =  net.b{1}                                     % 第2层(隐层)的阈值
w32      =  net.lw{2,1}                                  % 第2层到第3层的权值
wd3      =  net.lw{2,2}                                  % 第3层的延迟权重
b3       =  net.b{2}                                     % 第3层的阈值
w43      =  net.lw{3,2}                                  % 第3层(输入层)到第4层(输出层)的权值
b4       =  net.b{3}                                     % 第4层(输出层)的阈值

% 权重阈值与工具箱的差异
maxECompareNet = max([max(abs(py(:)-py_tool(:))),max(abs(W21(:)-w21(:))),max(abs(Wd2(:)-wd2(:))),max(abs(B2(:)-b2(:)))...
    ,max(abs(W32(:)-w32(:))) ,max(abs(Wd3(:)-wd3(:))) ,max(abs(B3(:)-b3(:))) ,max(abs(W43(:)-w43(:))),max(abs(B4(:)-b4(:)))]);
disp(['自写代码与工具箱权重阈值的最大差异:',num2str(maxECompareNet)])

% 比较最终的预测结果
disp('----自写Elman的预测值-----')
py
disp('----工具箱Elman的预测值-----')
py_tool


版本:matlab 2018a






   02. 代码运行结果解说    


本节展示代码的运行结果,并进行简单解说


     代码运行结果解说     


运行结果共四部分

 1. 自写代码求得的网络权重与阈值
 


2. 调用工具箱求得的网络权重与阈值
 

 
3. 自写代码与工具箱的结果对比
 
 

4. 自写代码与工具箱的预测结果对比 
✍️解说
 
从运行结果可以看到,自写代码与工具箱的结果一样
说明扒出的逻辑与工具箱的一致








 End 





联系老饼