1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
% ----------------------Initialization-------------------------------------
% XOR input for x1 and x2
input = [0 0; 0 1; 1 0; 1 1];
% Desired output of XOR
output = [0;1;1;0];
% Initialize the bias
bias = [-1 -1 -1];
% Learning coefficient
coeff = 0.7;
% Number of learning iterations
iterations = 100000;
% Calculate weights randomly.
weights = -1 +2.*rand(3,3);
% -------------------Back Propagation -------------------------------------
for i = 1:iterations
%Initialization
out = zeros(4,1);
numIn = length (input(:,1));
for j = 1:numIn
% Hidden layer
H1 = bias(1,1)*weights(1,1)
+ input(j,1)*weights(1,2)
+ input(j,2)*weights(1,3);
% Send data through sigmoid activation function 1/1+e^-x
%(values between 0 to 1)
x2(1)= 1./(1+exp(-H1));
H2 = bias(1,2)*weights(2,1)
+ input(j,1)*weights(2,2)
+ input(j,2)*weights(2,3);
% sigmoid function
x2(2)= 1./(1+exp(-H2));
% Output layer
x3_1 = bias(1,3)*weights(3,1)
+ x2(1)*weights(3,2)
+ x2(2)*weights(3,3);
% sigmoid function
out(j) = 1./(1+exp(-x3_1));
% Adjust delta values of weights
% For output layer:
% delta(wi) = xi*delta,
% delta = (1-actual output)*(desired output - actual output)
delta3_1 = out(j)*(1-out(j))*(output(j)-out(j));
% Propagate the delta backwards into hidden layers
% Here is really the back propagation
delta2_1 = x2(1)*(1-x2(1))*weights(3,2)*delta3_1;
delta2_2 = x2(2)*(1-x2(2))*weights(3,3)*delta3_1;
% Add weight changes to original weights
% And use the new weights to repeat process.
% delta weight = coeff*x*delta
for k = 1:3
if k == 1 % Bias cases
weights(1,k) = weights(1,k) + coeff*bias(1,1)*delta2_1;
weights(2,k) = weights(2,k) + coeff*bias(1,2)*delta2_2;
weights(3,k) = weights(3,k) + coeff*bias(1,3)*delta3_1;
else % When k=2 or 3 input cases to neurons
weights(1,k) = weights(1,k) + coeff*input(j,1)*delta2_1;
weights(2,k) = weights(2,k) + coeff*input(j,2)*delta2_2;
weights(3,k) = weights(3,k) + coeff*x2(k-1)*delta3_1;
end
end
end
end
% Display the trained NN
weights
out |
Partager