How can I check the neural network is correct?

2 visualizaciones (últimos 30 días)
Bernardino del pino
Bernardino del pino el 26 de Mayo de 2022
Respondida: Lokesh el 10 de Oct. de 2023
I have some data (p is the input and t the output). The net works well but I want to ckeck it manually. When I compute it, it doesn't work. I explain it better in the code:
p=[4.21470484282808,4.61178342351945,4.92103025244236,5.16780470857077,5.36888616086475,5.53567693961333,5.67614306410908,5.79599161759301,5.89941107438887,5.98953800357575
0.0841938476119945,0.0688748497618962,0.0506266219880575,0.0313984679864031,0.0122666193874076,-0.00620394471778739,-0.0237367071204724,-0.0402208466896825,-0.0556358572482061,-0.0700100771974078
0.624790077024891,0.933828019025972,1.24834383939203,1.55431911928733,1.84468199477835,2.11642821064707,2.3688169191345,2.60230677876707,2.81795118085545,3.01705857857006
0.00257893224675201,0.00368824779406364,0.00453083959629498,0.00489009192682788,0.0046033702524108,0.00357272498883625,0.00175843692227414,-0.000832738095460411,-0.00416162543741231,-0.00816576040624318
];
t=[2.83606065756777,3.31180314379271,3.70377438426516,4.02978774606033,4.30397305613069,4.53713048911324,4.7374656190205,4.91123610026158,5.06326477923633,5.19730529195449
0.0485161358312315,0.0461344489481127,0.0391584214613128,0.0290027475982773,0.016808673107218,0.00342380868886163,-0.0105496421711672,-0.0246959627873845,-0.0387354315195166,-0.0524841437666582
0.930574382489153,1.30350896221403,1.66272401320841,1.99818564751866,2.30664368564685,2.58817825301552,2.84437665551212,3.07741070830855,3.28958545610536,3.48311553793172
0.00580490407681004,0.00759806971982089,0.00862898201442169,0.00863448538934149,0.0074887953804546,0.00517928895558281,0.00176746424529477,-0.00263950757984306,-0.00791199822691147,-0.0139137399633852
];
n=5;
logsig=@(x) 1./(1+exp(-x));
net = fitnet(n,'trainlm');
net.layers{1}.transferFcn='logsig'
[net,tr]=train(net,p,t);
nntraintool
Y_pred=net(p)
error=abs(t-Y_pred)
plotregression(t,Y_pred)
W1 = net.IW{1}
W2 = net.LW{2}
b1 = net.b{1}
b2 = net.b{2}
a1=logsig(W1*p+b1)
a2=W2*a1+b2
% my doubt is: why a2 is not the same that Y_pred? What am I doind bad?

Respuestas (1)

Lokesh
Lokesh el 10 de Oct. de 2023
Hi Bernardino,
I understand that you want to compute the output of a neural network manually.
In your code, there seems to be a mismatch between the variable "a2" and "Y_pred" due to missing normalization parameters.
To compute the output of neural network manually, we should first determine whether the input data needs to be normalized using “mapminmax. If normalization is required, we can proceed with the normalization process. Similarly, we should also check if the output needs to be reverse normalized using "mapminmax” and perform the reverse normalization if necessary.
Please refer to the following code for manually computing the output of a neural network:
%% Set “p” and “t” to input and output respectively
p=[]; t=[];
n=5;
logsig=@(x) 1./(1+exp(-x));
net = fitnet(n,'trainlm');
net.layers{1}.transferFcn='logsig'
[net,tr]=train(net,p,t);
Y_pred=net(p);
error=abs(t-Y_pred);
plotregression(t,Y_pred);
%% Code to compute output manually
w = cellfun(@transpose,[net.IW{1},net.LW(2:size(net.LW,1)+1:end)],'UniformOutput',false); %% Extract Weights
b = cellfun(@transpose,net.b','UniformOutput',false); %% Extract Biases
tf = cellfun(@(x)x.transferFcn,net.layers','UniformOutput',false);
%% mapminmax on inputs
if strcmp(net.Inputs{1}.processFcns{:},'mapminmax')
xoffset = net.Inputs{1}.processSettings{1}.xoffset;
gain = net.Inputs{1}.processSettings{1}.gain;
ymin = net.Inputs{1}.processSettings{1}.ymin;
In0 = bsxfun(@plus,bsxfun(@times,bsxfun(@minus,p,xoffset),gain),ymin); %% Normalize Inputs
else
In0 = inputs;
end
In = cell(1,length(w));
Out = In;
In{1} = In0'*w{1}+b{1};
Out{1} = eval([tf{1},'(In{1})']);
for i=2:length(w)
In{i} = Out{i-1}*w{i}+b{i};
Out{i} = eval([tf{i},'(In{',num2str(i),'})']); %% Calculate Output of each layer
end
%% reverse mapminmax on outputs
if strcmp(net.Outputs{end}.processFcns{:},'mapminmax')
gain = net.outputs{end}.processSettings{:}.gain;
ymin = net.outputs{end}.processSettings{:}.ymin;
xoffset = net.outputs{end}.processSettings{:}.xoffset;
output = bsxfun(@plus,bsxfun(@rdivide,bsxfun(@minus,Out{end}',ymin),gain),xoffset) %% Reverse Normalization
else
output = Out{end}
end
%% output matches Y_pred
Please refer to the following MATLAB documentation links to know more about the concepts and functions used in the code:
I hope you find this helpful.
Best Regards,
Lokesh

Categorías

Más información sobre Sequence and Numeric Feature Data Workflows en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by