登录论坛

查看完整版本 : MATLAB中的神经网络


poster
2019-12-10, 20:30
我已经在Matlab中训练了xor神经网络,并获得了以下权重:

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代码来计算该网络的输出(隐藏层中2个神经元,TANSIG激活函数中1个输出)。

我得到的代码:

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 。

我做错了什么?



回答:

我写了一个XOR网络的简单示例。我使用了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]

更多&回答... (https://stackoverflow.com/questions/2417716)