Arrays have incompatible size for this operation
    4 views (last 30 days)
  
       Show older comments
    
%% load training data (use training_data.mat attached file)
% initialize number of nodes, weights, biases, errors and gradients.
%epochs and mini-batch size
clc
data = [out.dutycycle out.voltage out.current]
sample=1000;
labels = data(1:sample,1);
y = labels'; %output vector
images = data(1:sample,2:3);
images(:,1) = images(:,1)/400;
images(:,2) = images(:,2)/100;
images = images'; %Input vectors
hn1 = 80; %Number of neurons in the first hidden layer
hn2 = 60; %Number of neurons in the second hidden layer
%Initializing weights and biases
w12 = randn(hn1,1000).*sqrt(2/1000);
w23 = randn(hn2,hn1)*sqrt(2/hn1);
w34 = randn(1,hn2)*sqrt(2/hn2);
b12 = randn(hn1,1);
b23 = randn(hn2,1);
b34 = randn(1,1);
%learning rate
eta = 0.0058;
%Initializing errors and gradients
error4 = zeros(1,1);
error3 = zeros(hn2,1);
error2 = zeros(hn1,1);
errortot4 = zeros(1,1);
errortot3 = zeros(hn2,1);
errortot2 = zeros(hn1,1);
grad4 = zeros(1,1);
grad3 = zeros(hn2,1);
grad2 = zeros(hn1,1);
epochs = 50;
m = 10; %Minibatch size
%% Training phase 
for k = 1:epochs %Outer epoch loop
    batches = 1;
    for j = 1:sample/m
        error4 = zeros(1,1);
        error3 = zeros(hn2,1);
        error2 = zeros(hn1,1);
        errortot4 = zeros(1,1);
        errortot3 = zeros(hn2,1);
        errortot2 = zeros(hn1,1);
        grad4 = zeros(1,1);
        grad3 = zeros(hn2,1);
        grad2 = zeros(hn1,1);
        for i = batches:batches+m-1 %Loop over each minibatch
            %Feed forward
            a1 = images(:,i);
            z2 = w12.*a1 + b12;
            a2 = elu(z2);
            z3 = w23*a2 + b23;
            a3 = elu(z3);
            z4 = w34*a3 + b34;
            a4 = elu(z4); %Output vector
            %backpropagation
            error4 = (a4-y(:,i)).*elup(z4);
            error3 = (w34'*error4).*elup(z3);
            error2 = (w23'*error3).*elup(z2);
            errortot4 = errortot4 + error4;
            errortot3 = errortot3 + error3;
            errortot2 = errortot2 + error2;
            grad4 = grad4 + error4*a3';
            grad3 = grad3 + error3*a2';
            grad2 = grad2 + error2*a1';
        end
        %Gradient descent
        w34 = w34 - eta/m*grad4;
        w23 = w23 - eta/m*grad3;
        w12 = w12 - eta/m*grad2;
        b34 = b34 - eta/m*errortot4;
        b23 = b23 - eta/m*errortot3;
        b12 = b12 - eta/m*errortot2;
        batches = batches + m;
    end
    fprintf('Epochs:');
    disp(k) %Track number of epochs
    [images,y] = shuffle(images,y); %Shuffles order of the images for next epoch
end
disp('Training done!')
%note : create folder for this experiment and save the parameters.
% don't forget to keep the folder in matlab path!
save('wfour.mat','w34');
save('wthree.mat','w23');
save('wtwo.mat','w12');
save('bfour.mat','b34');
save('bthree.mat','b23');
save('btwo.mat','b12');
%% Testing phase 
% load testing data with labels ... (use testing_data.mat attached file)
testsample = 100;
labels = test(1:testsample,1);
y = labels';
% y = zeros(1,testsample);
% for i = 1:testsample
%     y(labels(i)+1,i) = 1;
% end
images = test(1:testsample,2:3); 
images(:,1) = images(:,1)/400;
images(:,2) = images(:,2)/100;%copy
images = images';
we34 = matfile('wfour.mat');
w4 = we34.w34;
we23 = matfile('wthree.mat');
w3 = we23.w23;
we12 = matfile('wtwo.mat');
w2 = we12.w12;
bi34 = matfile('bfour.mat');
b4 = bi34.b34;
bi23 = matfile('bthree.mat');
b3 = bi23.b23;
bi12 = matfile('btwo.mat');
b2 = bi12.b12;
success = 0;
n = testsample;
for i = 1:n
    out2 = elu(w2*images(:,i)+b2);
    out3 = elu(w3*out2+b3);
    out = elu(w4*out3+b4);
    big = 0;
    num = 0;
    for k = 1:10
        if out(k) > big
            num = k-1;
            big = out(k);
        end
    end
    if labels(i) == num
        success = success + 1;
    end
end
fprintf('Accuracy: ');
fprintf('%f',success/n*100);
disp(' %');
%% ELU activation function
function fr = elu(x)
f = zeros(length(x),1);
for i = 1:length(x)
    if x(i)>=0
        f(i) = x(i);
    else
        f(i) = 0.2*(exp(x(i))-1);
    end
end
fr = f;
end
%% derivative of the ELU activation function
function fr = elup(x)
f = zeros(length(x),1);
for i = 1:length(x)
    if x(i)>=0
        f(i) = 1;
    else
        f(i) = 0.2*exp(x(i));
    end
end
fr = f;
end
%% SHuffle function 
function [B,v] = shuffle(A,y)
cols = size(A,2);
P = randperm(cols);
B = A(:,P);
v = y(:,P);
end
2 Comments
  Walter Roberson
      
      
 on 16 Jul 2022
				We do not have your data or your files, we do not know the size of any of the data, and you did not indicate which line the problem occurs on.
  Venu
      
 on 20 Nov 2023
				Hi @Nazirul Mubin bin Afandi, Can you try changing this line z2 = w12.*a1 + b12; to z2 = w12*a1 + b12; (i.e without doing element wise multiplication, try normal matrix multiplication). If this doesn't resolve your issue, please provide your input data training_data.mat file.
Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

