查看: 1733|回复: 12|关注: 0

[已解决] matlab神经网络函数feedforwardnet构造的网络数学模型是啥

[复制链接]

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
发表于 2018-11-21 12:29:47 | 显示全部楼层 |阅读模式
本帖最后由 merlin33 于 2018-11-25 21:15 编辑

作为matlab神经网络初学者,对matlab神经网络函数feedforwardnet有很多疑惑,请各位前辈多多指导~
matlab版本及操作系统:R2017b(9.3.0713579),64-bit(win64), September 14, 2017
以feedforwardnet函数构建默认的神经网络为例,对网络数学模型不清楚,遇到两个问题:
1. 权值和阈值设置问题
当需要设置(或继承)神经网络权值和阈值后再训练时,我将权值和阈值都设为零,网络输出却不为零(附代码在本帖最下方)
2. 网络的输出对输入求偏导问题
当需要求解网络的输出对输入的偏导(Jacobian矩阵)时,matlab是否有自带的相关函数来求解?如果没有,就需要根据网络数学模型自行计算。
总言之,matlab神经网络函数feedforwardnet构造的网络数学模型是啥?

本人也查阅了相关书籍,和大家一起学习,获得信息如下:
两层BP神经网络结构.jpg
数学表达式.jpg
传递函数查到的是:
net.layers{1}.transferFcn: 'tansig', 查帮助文档得Algorithms:a = tansig(n) = 2/(1+exp(-2*n))-1
tansig图.jpg
net.layers{2}.transferFcn: 'purelin', 查帮助文档得Algorithms:a = purelin(n) = n
purelin图.jpg


到这里基本可以确定feedforwardnet构造的网络数学模型了!
可为啥做简单测试时,我将网络所有权值和阈值都设置为零时,网络输出却不为零呢?
于是产生了疑惑,matlab神经网络函数feedforwardnet构造的网络数学模型到底是啥?真诚的希望和大家一起交流学习,希望前辈们多多指导~
附matlab代码如下:
  1. 线性系统x(k+1)=A*x(k)+B*u(k)参数(A,B)
  2. A=[0 1; -0.6 1];      
  3. B=[0.1; 0.2];
  4. %% 神经网络训练参数
  5. N=1000;              %样本数
  6. hiddenSizes=10;  %隐藏层神经元数目
  7. %% 获取模型网络训练样本
  8. uk = -1 + (1-(-1))*rand(1,N);         %控制变量随机均匀取值|u|≤1
  9. xk = -1 + (1-(-1))*rand(2,N);         %状态标量随机均匀取值|x|≤1
  10. target=A*xk+B*uk;         %状态方程获取训练样本-目标
  11. input=[xk; uk];                 %训练样本-输入
  12. %% 构建前馈神经网络
  13. net=feedforwardnet(hiddenSizes, 'trainlm');
  14. net=configure(net,input,target);  %配置网络输入输出结构
  15. %设定输入层初始权值和阈值
  16. net.iw{1,1}=zeros(size(net.iw{1,1}));
  17. net.b{1}=zeros(size(net.b{1}));
  18. %设定隐藏层初始权值和阈值
  19. net.lw{2,1}=zeros(size(net.lw{2,1}));
  20. net.b{2}=zeros(size(net.b{2}));
  21. %% 训练过程
  22. % net = train(net, input, target);
  23. %% 仿真
  24. x=[0.5; 0.5];
  25. u=0.1;
  26. ystar=A*x+B*u    %参照输出值
  27. in=[x; u];             %神经网络输入
  28. y=net(in)            %神经网络输出值</font>
复制代码


运行上面代码得到的结果:
  1. ystar =

  2.     0.5100
  3.     0.2200


  4. y =

  5.    -0.0110
  6.     0.0375
复制代码
已经将所有权值和阈值设置为零,此时网络的输出不应该是零吗?

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-21 15:48:32 | 显示全部楼层
@math
@ilovematlab
@shi01fg
希望前辈们来指点迷津

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-21 16:53:14 | 显示全部楼层
查看网络结构是这样的:
BPnet.jpg
权值和阈值是这样的:
weight and bias values:

                IW: {2x1 cell} containing 1 input weight matrix
                LW: {2x2 cell} containing 1 layer weight matrix
                 b: {2x1 cell} containing 2 bias vectors
>>net.iw

ans =

  2×1 cell 数组

    {10×3 double}
    { 0×0 double}

>> net.lw

ans =

  2×2 cell 数组

    {0×0  double}    {0×0 double}
    {2×10 double}    {0×0 double}

>> net.b

ans =

  2×1 cell 数组

    {10×1 double}
    { 2×1 double}

当我将权值和阈值都置1后,网络的输出就应该是不变的,但输出是一个随机数
%设定输入层权值和阈值
net.iw{1,1}=ones(size(net.iw{1,1}));
net.b{1}=ones(size(net.b{1}));
%设定隐藏层权值和阈值
net.lw{2,1}=ones(size(net.lw{2,1}));
net.b{2}=ones(size(net.b{2}));

难道还有别的变量在影响网络的输出值吗?[baoquan]

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-21 17:34:18 | 显示全部楼层
当我固定一组随机权重和阈值,输入不变时,每次网络输出还是会变 test.jpg
  1. %设定输入层初始权值和阈值
  2. net.iw{1,1}=[   0.3549    1.6573    2.4950;
  3.                 2.0775   -1.0617   -1.9116;
  4.                -0.5439   -1.8569   -2.3137;
  5.                -0.8151    0.8392   -2.7801;
  6.                -2.3318   -1.0717    1.5848;
  7.                -0.9957   -2.0687   -1.9561;
  8.                 2.1416    1.3022   -1.6779;
  9.                 1.2467    0.0501    2.7460;
  10.                -1.6668   -2.5036   -0.2267;
  11.                -2.0129   -2.2422   -0.1354];
  12. net.b{1}=[  -3.0162;
  13.             -2.3459;
  14.              1.6757;
  15.              1.0054;
  16.              0.3351;
  17.             -0.3351;
  18.              1.0054;
  19.              1.6757;
  20.             -2.3459;
  21.             -3.0162];
  22. %设定隐藏层初始权值和阈值
  23. net.lw{2,1}=[    0.6335    0.0939   -0.6217    0.5954    0.1949    0.8263    0.4072    0.9105   -0.4197    0.2988;
  24.                 -0.0007    0.3608    0.0518   -0.5358    0.9905    0.2411   -0.9302   -0.1787    0.9392   -0.7862];
  25. net.b{2}=[    0.5041;
  26.               0.0205];
复制代码


新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-22 11:47:44 | 显示全部楼层
:)欢迎感兴趣的同学关注,自己顶一下~

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-23 10:26:19 | 显示全部楼层
等待回复啊

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-23 14:59:27 | 显示全部楼层
期待回复中

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-25 11:16:52 | 显示全部楼层
本帖最后由 merlin33 于 2018-11-25 11:20 编辑

楼主训练完神经网络后,用gensim(net)生成了可视化的simulink框图,查看该神经网络结构和查到的信息基本一致如下图:
FFNN1.jpg
1.隐藏层结构:
FFNN2.jpg
其中激活函数确实是tansig(x)函数;
2.输出层结构
FFNN3.jpg
其中激活函数确实是纯线性函数

3.区别在于多了神经网络输入数据归一化处理和输出反归一化处理
mapminmax(x)
FFNN4.jpg
mapminmax('reverse',x)
FFNN5.jpg

楼主目前依旧没有找到问题的答案(2018年11月25日 11: 17)

新手

10 麦片

财富积分


050


1

主题

10

帖子

0

最佳答案
 楼主| 发表于 2018-11-25 12:11:16 | 显示全部楼层
本帖最后由 merlin33 于 2018-11-25 12:32 编辑

楼主经过一番对比:构造了两个神经网络,采用相同的样本和不同的训练函数来训练,最后将神经网络1的权值和阈值赋值给神经网络2(变量大小和顺序都不变),net2得到了正确结果(但由数学模型计算不能得到正确结果),由此可以说明影响神经网络输出结果的不仅仅是权值和阈值(注:(3+1)*10+(10+1)*2=62个有序变量),还有其他影响因素是啥呢?搞不清楚啊,楼主打算放弃matlab自带的函数了...附matlab代码参考:
  1. clc;clear all;close
  2. %% 线性系统x(k+1)=A*x(k)+B*u(k)参数(A,B)
  3. A=[1 1;-1 1];      
  4. B=[0.1; 1];      
  5. %% 神经网络训练参数
  6. N=1000;              %样本数
  7. hiddenSizes=10;  %隐藏层神经元数目
  8. %% 获取模型网络训练样本
  9. uk = randn(1,N);         %控制变量随机均匀取值|u|≤1
  10. xk = randn(2,N);         %状态标量随机均匀取值|x|≤1
  11. % load data.mat
  12. target=A*xk+B*uk;         %状态方程获取训练样本-目标
  13. input=[xk; uk];                 %训练样本-输入
  14. %% 构建前馈神经网络
  15. net=feedforwardnet(hiddenSizes,'trainlm');
  16. net2=feedforwardnet(hiddenSizes,'traingd');
  17. net.trainParam.showWindow=false;  %关闭nntraintool窗口
  18. net2.trainParam.showWindow=false;  %关闭nntraintool窗口
  19. %% 训练过程
  20. net = train(net, input, target);
  21. net2 = train(net2, input, target);
  22. %% 仿真
  23. x=[0.5; -0.5];
  24. u=0.2;
  25. ystar=A*x+B*u    %参照输出值
  26. in=[x; u];             %神经网络输入
  27. y1=net(in)            %神经网络输出值
  28. %% 神经网络2赋予神经网络1的权值和阈值
  29. net2.b{1}=net.b{1};                    %输入层阈值10x1
  30. net2.b{2}=net.b{2};                     %隐藏层阈值2x1
  31. net2.iw{1}=net.iw{1};           %输入层权值10x3
  32. net2.lw{2,1}=net.lw{2,1};        %隐藏层权值2x10
  33. y2=net2(in)            %神经网络输出值
  34. %% 数学模型求输出
  35. p=[in; 1];                          %网络输入4x1
  36. b1=net.b{1};                    %输入层阈值10x1
  37. b2=net.b{2};                     %隐藏层阈值2x1
  38. IW=[net.iw{1}, b1];           %输入层权值10x4
  39. LW=[net.lw{2,1}, b2];        %隐藏层权值2x11
  40. a=IW*p;                           %输入层输入10x1
  41. a1=[tansig(a); 1];              %输入层输出11x1
  42. ym=LW*a1                       %线性输出层输出
复制代码




9

主题

309

帖子

34

最佳答案
  • 关注者: 15
发表于 2018-11-25 16:37:41 | 显示全部楼层
merlin33 发表于 2018-11-25 12:11
楼主经过一番对比:构造了两个神经网络,采用相同的样本和不同的训练函数来训练,最后将神经网络1的权值和 ...

楼主很优秀,我对这块也有兴趣
你用工具箱nntool试一下,比如同一组数据训练不同次,结果应该是有一些区别,但是区别应该不是很大
毕竟神经网络是一个黑盒,楼主数据时依次取的还是,测试数据呢。测试的效果怎么样
I Love MATLAB
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表