[已答复] matlab中BP网络输出层的激励函数不是logistic?

[复制链接]
rainbowz 发表于 2011-6-9 22:34:13
最近小弟在用PHP写BP网络的应用程序,写到一半问题大大的有啊……

用简单的整数加法来举例吧:
matlab程序这么写:
p=[1:1:100;1:1:100];
t=[2:2:200];
net=newff(p,t,2);
net=train(net,p,t);

        这个应该很好懂,就是用BP训练一个相同整数的加法网络,问题来了,BP网络原理中说神经元的激励函数本身是logistic函数,f(x)=1/(1+exp(x)),形状是s形,值域为(0,1),如果输出层激励函数是这个的话,输出层输出的结果应该在(0,1)范围,而matlab仿真时输出的结果可以是任意实数,那么这就说明输出层的激励函数应该不是logistic函数,或者说用logistic函数计算出输出结果后还要进一步处理才会给出最终答案,不知道小弟的推测是否正确,跪求大神解惑

先行谢过!!:handshake

PS:感觉matlab公司对神经网络工具箱源码保密工作很重视,貌似里面原创的东西不少哦

17 条回复


math 发表于 2011-6-9 23:26:49
1:激励函数是可以自己定义的

2:神经网络的精髓就是训练过程的优化,所以保密也是可以理解的。

rainbowz 发表于 2011-6-10 01:39:01

回复 2# math 的帖子

先谢谢math~

我懂了  
默认的newff得到的输出层激励函数是purelin  
那怎么样才能得到这个线性函数的参数呢?
将输入与结果列个方程求解吗?
好像得到的BP网络参数中并没有给出哦

rainbowz 发表于 2011-6-10 13:58:27
我明白了  
输出层激励函数只要看做简单的y=x就行  
是不需要加任何系数和截距的线性函数  
因为不管系数和截距是多少其实都无所谓的

liuyh065 发表于 2011-6-10 16:04:53
我还是有一点疑惑:最近也在使用MATLAB中的BP工具箱函数编写分类器,发现即使是我把隐层和输出层都使用logsig(f=1/(1+exp(-x)))函数,结果输出的还是有大于1和小于0的数!!!根据理论分析,这是完全不可能的!迫切求解!!!

rainbowz 发表于 2011-6-11 14:49:10
是吗  这我倒没试过……

std_2009 发表于 2011-6-11 17:14:29
1.隐含层跟输出层的函数都可以选择;
2.我觉得你们理解的输出有偏差,理由如下(欢迎拍砖):
假设输入向量为P,隐含层到输入层的连接权值为W,x=W*P,隐含层到输出层的连接权值W'',得到隐含层的输出:f(x)=1/(1+exp(-x))=1/(1+exp(-(W*P))),你理解的输出是隐含层的输出!!并不是输出层的实际输出值!!
实际输出还跟输出层的函数有关!假设我们选择的是线性函数,那么输出为:
y=W''*f(x)
由于不好编辑公式,所以上述公式是简化形式!

rainbowz 发表于 2011-6-12 08:40:37

回复 7# std_2009 的帖子

输出层默认线性函数这个明白了
但是该函数的系数是多少怎么才能知道呢?也就是F(x)=a*x    的a是什么?

另:5楼的意思是输出层也采用logsig函数f(x)=1/(1+(exp(-x)))   但是输出值却超出了值域范围   不知道你有没有仔细看他的问题

liuyh065 发表于 2011-6-12 09:32:40
我的意思就是隐层和输出层都采用S型函数的,而且,我试了很多次,还是有这个问题

std_2009 发表于 2011-6-12 20:35:47

回复 8# rainbowz 的帖子

a仅仅是一个系数,可以赋以随机值!具体什么值根据实际问题以及训练情况!这根小波神经网络的伸缩因子a(j),平移因子b(j)是一样的!!就因为它的值不固定,才体现网络的泛化能力!
至于输出层采用S函数仍然输出大于1的数,这个能否把程序贴出来?

liuyh065 发表于 2011-6-13 13:37:01
好的,求解

liuyh065 发表于 2011-6-13 13:45:26
clear;
clc;

bin_dec;        % 输入待训练字节

P=[train_in0/255;train_in3/255]';          %归一化
T=[1 0;0 0;0 0;0 1;0 0;0 0;0 0;0 0;0 0;0 0];    %目标向量输出10个神经元

net=newff(P,T,[25,10],{'logsig' 'logsig'},'traingdm');
% net.trainParam.show=50;%显示轮回数
% net.trainParam.epochs = 10000;%设置最大训练循环次数
net.trainparam.lr=0.01; %学习率
net.trainParam.goal=0.001;%设置目标误差
net = train(net,P,T); %神经网络训练
Y = sim(net,P);  %神经网络仿真
figure
plot(Y)

Sample01=train_in0';
Y01 = sim(net,Sample01/255);

Sample31=train_in3';
Y03 = sim(net,Sample31/255);

Sample02=sim_in02';
Y02 = sim(net,Sample02/255);  

Sample32=sim_in32';
Y32 = sim(net,Sample32/255);

liuyh065 发表于 2011-6-13 13:47:11
结果:
Y01 =

    0.8035
         0
         0
    0.2235
         0
         0
         0
         0
         0
         0

>> Y02

Y02 =

   -0.0091
         0
         0
   -0.1002
         0
         0
         0
         0
         0
         0

>> Y03

Y03 =

    0.0208
         0
         0
    0.6278
         0
         0
         0
         0
         0
         0

>> Y32

Y32 =

    0.1452
         0
         0
    0.3043
         0
         0
         0
         0
         0
         0

liuyh065 发表于 2011-6-13 13:48:53
有时候是负数,有时候是大于1的数,还有的时候两者都出现,求解!

rainbowz 发表于 2011-6-14 14:03:56

回复 10# std_2009 的帖子

我明白是可以随机赋值给a,但是训练好网络后在网络的参数里好像看不到这个激励函数的具体公式,只知道类型是purelin……

我这边主要是要自己编程写BP,所以这些细节需要了解的详细一些

liuyh065 发表于 2011-6-14 15:33:23
可否加个QQ,共同探讨啊,这样实在是不方便啊
QQ:811723974

clearlove2200 发表于 2022-5-7 10:14:15
楼主我也遇到这样的情况,使用了logsig,但输出还是有很多大于1小于0 请问最后怎么解决了吗

clearlove2200 发表于 2022-5-7 10:45:49
liuyh065 发表于 2011-6-10 16:04
我还是有一点疑惑:最近也在使用MATLAB中的BP工具箱函数编写分类器,发现即使是我把隐层和输出层都使用logs ...

请问最后怎么解决了,我也是有大于1小于0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表