Нейронная сеть в MATLAB

Я обучил xor нейронную сеть в 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, который вычисляет вывод этой сети (2 нейрона в скрытом слое, и 1 в выводе, функции активации 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.

Что я делаю неправильно?

7
задан Amro 10 March 2010 в 22:37
поделиться

2 ответа

Я написал простой пример сети 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]
11
ответ дан 7 December 2019 в 01:19
поделиться

Обычно вы не используете сигмоид на своем выходном слое - вы уверены, что у вас должен быть включен tansig out3? И вы уверены, что смотрите на веса должным образом обученной сети? Похоже, у вас есть сеть, обученная выполнять XOR на [1,1] [1, -1] [-1,1] и [-1, -1], где +1 означает «xor» и -1. что означает «такой же».

-1
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: