我在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.00055875和0.99943。
我哪里做错了?
回答:
我编写了一个简单的异或网络示例。我使用了newpr
,它默认对隐藏层和输出层使用tansig
传输函数。
input = [0 0 1 1; 0 1 0 1]; %# 每列是一个输入向量ouputActual = [0 1 1 0];net = newpr(input, ouputActual, 2); %# 一个隐藏层,包含2个神经元net.divideFcn = ''; %# 使用全部输入进行训练net = init(net); %# 初始化网络net = train(net, input, ouputActual); %# 训练outputPredicted = sim(net, input); %# 预测
然后我们通过自己计算输出结果来检查结果。重要的是要记住,默认情况下,输入/输出会被缩放到[-1,1]范围内:
scaledIn = (2*input - 1); %# 从[0,1]转换到[-1,1]for i=1:size(input,2) in = scaledIn(:,i); %# 第i个输入向量 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} );endscaledOut = (out+1)/2; %# 从[-1,1]转换到[0,1]
或者更有效地用矩阵乘法在一行中表达:
scaledIn = (2*input - 1); %# 从[0,1]转换到[-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; %# 从[-1,1]转换到[0,1]