Веса простой линейной нейронной сети из обучения несовместимы с результатами обучения

Веса, которые я получаю в результате обучения, когда они подразумеваются непосредственно на входе, возвращают разные результаты! Я покажу это на очень простом примере, скажем, у нас есть входной вектор x= 0:0.01:1; и целевой вектор t=x^2 (я знаю, что лучше использовать нелинейную сеть) после обучения, 2 слоя, линейная сеть, с одним нейроном на каждом слое, мы получать:

sim(net,0.95) = 0.7850 (какая-то ошибка в обучении - это нормально и должно быть) веса от net.IW,net.LW,net.b:

IW =

0.4547

LW =

2.1993

b =

0.3328   -1.0620

если я использую веса: Out = purelin(purelin(0,95*IW+b(1))*LW+b(2)) = 0,6200! , я получаю другой результат от результата сима! как это может быть? что случилось?

код:

%Main_TestWeights
close all
clear all
clc


t1 = 0:0.01:1;
x = t1.^2;

hiddenSizes = 1;
net = feedforwardnet(hiddenSizes);


[Xs,Xi,Ai,Ts,EWs,shift] = preparets(net,con2seq(t1),con2seq(x));
net.layers{1,1}.transferFcn = 'purelin';
[net,tr,Y,E,Pf,Af] = train(net,Xs,Ts,Xi,Ai);
view(net);


IW = cat(2,net.IW{1});
LW = cat(2,net.LW{2,1});
b = cat(2,[net.b{1,1},net.b{2,1}]);

%Result from Sim
t2=0.95;
Yk = sim(net,t2)

%Result from Weights
 x1 = IW*t2'+b(1)
 x1out = purelin(x1)
 x2 = purelin(x1out*(LW)+b(2))

person Roman    schedule 04.08.2012    source источник
comment
Я совсем не уверен в этом, но может быть сеть каким-то образом нормализует входные данные и цели? Если это так, сообщаемые веса будут бесполезны без применения той же самой нормализации к входным данным. Кроме того, я думаю, вы должны добавить смещения перед умножением на веса (например, ((input+b(1))*IW+b(2))*LW ).   -  person Niclas    schedule 04.08.2012


Ответы (1)


Набор инструментов нейронной сети масштабирует входные и выходные данные в диапазоне [-1,1]. Поэтому вы должны масштабировать и масштабировать его, чтобы выходные данные вашей симуляции были такими же, как выходные данные sim():

 %Result from Weights
 x1 = 2*t2 - 1; # rescale 
 x1 = IW*x1+b(1);
 x1out = purelin(x1);
 x2 = purelin(x1out*(LW)+b(2));
 x2 = (x2+1)/2 # unscale

тогда

>> x2 == Yk

ans =

     1
person Franck Dernoncourt    schedule 04.08.2012