How to manually calculate a Neural Network output?

49 views (last 30 days)
Dear everyone,
I am exploring the Neural Network Toolbox and would like to manually calculate output by hand. I used one of the example provided by Matlab with the following code. Unfortunately, my output is incorrect. Does anyone know why? Thanks
%%below is the sample code from Matlab
[x, y] = crab_dataset;
size(x) % 6 x 200
size(y) % 2 x 200
setdemorandstream(491218382);
net = patternnet(10);
[net, tr_info] = train(net, x, y);
testX = x(:, tr_info.testInd);
testT = y(:, tr_info.testInd);
testY = net(testX);
testIndices = vec2ind(testY);
[error_rate, conf_mat] = confusion(testT, testY);
fprintf('Percentage Correct Classification : %f%%\n', 100*(1 - error_rate));
fprintf('Percentage Incorrect Classification : %f%%\n', 100*error_rate);
%%Manually calculate the output by hand
% nFeatures = 6
% nSamples = 200
% nHiddenNode = 10
% nClass = 2
% input layer => x (6x200)
% hidden layer => h = sigmoid(w1.x + b1)
% = (10x6)(6x200) + (10x1)
% = (10x200)
%
% output layer => yhat = w2.h + b2
% = (2x200)
w1 = net.IW{1}; % (10x6)
w2 = net.LW{2}; % (2x10)
b1 = net.b{1}; % (10x1)
b2 = net.b{2}; % (2x1)
h = sigmoid(w1*x + b1);
yhat = w2*h + b2;
[testY' yhat']
[vec2ind(testY)' vec2ind(yhat)']

Accepted Answer

JESUS DAVID ARIZA ROYETH
JESUS DAVID ARIZA ROYETH on 2 May 2018
you missed several normalization parameters, here I leave the solution :
[x, y] = crab_dataset;
size(x) % 6 x 200
size(y) % 2 x 200
setdemorandstream(491218382);
net = patternnet(10);
[net, tr_info] = train(net, x, y);
xoffset=net.inputs{1}.processSettings{1}.xoffset;
gain=net.inputs{1}.processSettings{1}.gain;
ymin=net.inputs{1}.processSettings{1}.ymin;
w1 = net.IW{1}; % (10x6)
w2 = net.LW{2}; % (2x10)
b1 = net.b{1}; % (10x1)
b2 = net.b{2};
% Input 1
y1 = bsxfun(@times,bsxfun(@minus,x,xoffset),gain);
y1 = bsxfun(@plus,y1,ymin);
% Layer 1
a1 = 2 ./ (1 + exp(-2*(repmat(b1,1,size(x,2)) + w1*y1))) - 1;
% output
n=repmat(b2,1,size(x,2)) + w2*a1;
nmax = max(n,[],1);
n = bsxfun(@minus,n,nmax);
num = exp(n);
den = sum(num,1);
den(den == 0) = 1;
y2 = bsxfun(@rdivide,num,den);%y2==outputnet == net(x)
  2 Comments
Jeff Chang
Jeff Chang on 2 May 2018
Edited: Jeff Chang on 1 Oct 2018
Thank you very much. I realize that the 3 things that I missed were:
  1. I should normalize the input to [-1, 1]
  2. I should use the tanh activation (instead of the sigmoid activation) on the hidden layer
  3. I should apply softmax on the output layer
Sadaf Jabeen
Sadaf Jabeen on 14 Mar 2022
How can I compute the same with linear activation function and no bias values?

Sign in to comment.

More Answers (3)

Amir Qolami
Amir Qolami on 12 Apr 2020
Edited: Amir Qolami on 12 Apr 2020

The In{i} and Out{i} are inputs and outputs of i(th) hidden(and also output) layer. There are two rescales before the input and after the output layer.

function output = NET(net,inputs)

    w = cellfun(@transpose,[net.IW{1},net.LW(2:size(net.LW,1)+1:end)],'UniformOutput',false);
    b = cellfun(@transpose,net.b','UniformOutput',false);
    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,inputs,xoffset),gain),ymin);
    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),'})']);
    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);
    else
        output = Out{end};
    end

end

  2 Comments
Soumitra Sitole
Soumitra Sitole on 20 Apr 2022
Edited: Soumitra Sitole on 20 Apr 2022
Thanks, this also worked for a relatively deep regression network
DarZim
DarZim on 4 Jan 2024
Why does this function return 3 values as output instead of 1?

Sign in to comment.


Jeff Chang
Jeff Chang on 2 May 2018
Edited: Jeff Chang on 2 May 2018
Beside, is it possible to use deepDreamImage() to visualize the hidden layer in this example?

Shounak Mitra
Shounak Mitra on 8 Oct 2018
Unfortunately, using deepDreamImage() is not possible in this case.

Categories

Find more on Sequence and Numeric Feature Data Workflows in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!