MATLAB中的神经网络

7

我已经在MATLAB中训练了异或神经网络,并得到了以下权重:

iw: [-2.162 2.1706; 2.1565 -2.1688]

lw: [-3.9174 -3.9183]

b{1} [2.001; 2.0033]

b{2} [3.8093]

出于好奇,我尝试编写MATLAB代码来计算该网络的输出(隐藏层中有两个神经元和一个TANSIG激活函数的输出层)。

得到的代码:

l1w = [-2.162 2.1706; 2.1565 -2.1688];
l2w = [-3.9174 -3.9183];
b1w = [2.001 2.0033];
b2w = [3.8093];

input = [1, 0];

out1 = tansig (input(1)*l1w(1,1) + input(2)*l1w(1,2) + b1w(1));
out2 = tansig (input(1)*l1w(2,1) + input(2)*l1w(2,2) + b1w(2));
out3 = tansig (out1*l2w(1) + out2*l2w(2) + b2w(1))

问题出在输入为[1,1]时,输出为-0.9989,当输入为[0,1]时,输出为0.4902。而使用MATLAB生成的模拟网络输出结果为0.000558750.99943。请问我做错了什么?

2
为什么不发布您用于构建和训练网络的实际代码? - Amro
2个回答

11

我写了一个简单的异或网络示例。我使用了newpr,它默认为隐藏层和输出层都使用tansig传递函数。

input = [0 0 1 1; 0 1 0 1];               %# each column is an input vector
ouputActual = [0 1 1 0];

net = newpr(input, ouputActual, 2);       %# 1 hidden layer with 2 neurons
net.divideFcn = '';                       %# use the entire input for training

net = init(net);                          %# initialize net
net = train(net, input, ouputActual);     %# train
outputPredicted = sim(net, input);        %# predict

然后我们通过计算输出来检查结果。重要的是要记住,默认情况下,输入/输出会被缩放到[-1,1]范围内:

scaledIn = (2*input - 1);           %# from [0,1] to [-1,1]
for i=1:size(input,2)
    in = scaledIn(:,i);             %# i-th input vector
    hidden(1) = tansig( net.IW{1}(1,1)*in(1) + net.IW{1}(1,2)*in(2) + net.b{1}(1) );
    hidden(2) = tansig( net.IW{1}(2,1)*in(1) + net.IW{1}(2,2)*in(2) + net.b{1}(2) );
    out(i) = tansig( hidden(1)*net.LW{2,1}(1) + hidden(2)*net.LW{2,1}(2) + net.b{2} );
end
scaledOut = (out+1)/2;              %# from [-1,1] to [0,1]

或者更有效地表达为一个式子:

scaledIn = (2*input - 1);           %# from [0,1] to [-1,1]
out = tansig( net.LW{2,1} * tansig( net.IW{1}*scaledIn + repmat(net.b{1},1,size(input,2)) ) + repmat(net.b{2},1,size(input,2)) );
scaledOut = (1 + out)/2;            %# from [-1,1] to [0,1]

非常好。帮了我很多。 - Sushant Rath

-1
通常情况下,您不会在输出层使用sigmoid函数 - 您确定out3应该使用tansig吗?您确定您正在查看已经适当训练的网络的权重吗?看起来您已经训练了一个网络来执行[1,1] [1,-1] [-1,1]和[-1,-1]上的XOR,其中+1表示“异或”,-1表示“相同”。

如果您在输出层不使用Sigmoid函数,那么如何对输出进行归一化呢?此外,如果您的输出没有经过归一化,又该如何衡量误差呢? - Kiril
对于分类器,您选择具有最高值的输出(或在50%点处切换)以做出决策。 您不需要非线性。 在这种情况下,这样做是可以的,但实际上并没有增加太多。 - Rex Kerr
1
当你想要获取每个类别的后验概率以及分类时,在输出层使用线性函数的问题就变得明显了。 - Amro
@Amro:好的。如果你想将它们强制限制在(0,1)范围内,那么是的,你应该使用1/(1+exp(-y));无论哪种方式,你都可以得到近似概率,但如果你只将其视为函数逼近,你可能会超过1(或低于0)。这是否是一个问题取决于应用程序。 - Rex Kerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接